Skip to content
Script to copy issues from trac to gitlab.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Type Name Latest commit message Commit time
Failed to load latest commit information.


TracBoat is a much more sophisticated successor to this script.


This script migrates trac tickets to gitlab issues.


  • Component & Issue-Type are converted to labels
  • Milestones are created in Gitlab from fixture data manualy grabbed from trac (copy/paste)
  • Comments to issues are copied over
  • Wiki Syntax in comments/descriptions is sanitized for my basic usage


Usage: configure the following variables in in```` and run it (python```). Make sure you test it on a test project prior, if you run it twice against the same project you will get duplicated issues.



  • gitlab_url - e.g.
  • gitlab_access_token - the access token of the user creating all the issues. Found on the account page, e.g. secretsecretsecret
  • dest_project_name - the destination project including the paths to it. Basically the rest of the clone url minus the ".git". E.g. jens.neuhalfen/task-ninja.
  • milestone_map - Maps milestones from trac to gitlab. Milestones have to exist in gitlab prior to running the script (CAVE: Assigning milestones does not work.)
  • milestone_list - Lists milestones from trac with associated metadata. Manually populated at this point by copy/paste out of trac milestone admin page




  • Python 2.7, xmlrpclib, requests
  • Trac with xmlrpc plugin enabled
  • Gitlab

Create milestone_list from copy paste admin area trac

Copy the milestones from the trac admin page and paste them in your editor of choice that supports regex replace.

Now replace the full text with the following regex and replacement, adjust as you see fit. When done, copy the result in

regex: \s*([\w\.\s]*?)\s*(\d{2})/(\d{2})/(\d{2})\s[\d:]*\s*(?:(\d{2})/(\d{2})/(\d{2})\s[\d:]*)?\s*\d+
replace: "$1":{"title":"$1","description":"Trac Import, milestone completed on: 20$7-$5-$6","due_date":"20$4-$2-$3"},\r\n

Create milestone_map from above

Now from the milestone_list you can create a simple map with the following regex and replacement:

regex: ("[\w\.\s]*"):\{.*\r\n
replace: $1:$1,
You can’t perform that action at this time.