Version 64 (modified by hvr, 5 years ago) (diff)


Git Plugin for Trac


This is yet another plugin for Trac 0.10/0.11 which enables GIT to be used instead of Subversion for the trac:VersioningSystemBackend


  • Browsing source code in a Git repository via the TracBrowser
  • Viewing the change history of a file or directory using TracRevisionLog
  • Performing diffs between any two files or two directories
  • Displaying submitted changes in the TracTimeline (0.11)
  • (Optionally) caching TracChangeset information in Trac's database (0.11)
  • Caching Git commit relation graph in memory (0.11)
  • Using the TracSearch page to search change descriptions (0.11)
  • Annotation support, also known as "blame" operation (0.11)
  • Interpretation of 40-character wide hex-strings as sha1 commit checksums
  • ...

Example Sites


Branch trac-0.10 trac-0.11/trac-0.11-py24 master
Trac 0.10.x 0.11.x 0.12.x
Python 2.4+ 2.5+/2.4+ 2.5+
GIT 1.4.4+ 1.5.2+ (for plugin v0.11.0.1)
1.5.6+ (for plugin v0.11.0.2+)

Bugs/Feature Requests

As this is for now just a proof of concept implementation, it has quite some deficiencies, some of which exist as tickets already:

Improve performance of GitPlugin
It should be possible to see the branch in the timeline and for each changeset
shortrev_len does not work
Cannot detect GIT version: All git commands result in git usage output which is unparsable.
Enhance Documentation
Resetting HEAD on a remote branch causes GitPlugin to complain of missing changeset
UnicodeDecodeError on UTF-8 encoded filenames
Internal error if ticket text references SVN-like revision number (changeset)
GitError: GIT control files not found, maybe wrong directory?
post-receive hook is not working when default repository is speciefied
Browse branches as virtual top-level folders
File rename not supported
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 5-7: invalid data
Can't install plugin properly.
Browse with 'bare' repository fails
Invalid changeset link in ticket comments is produced by the post-receive-hook for multiple git repositories
filedescriptor out of range
Trac[git_fs] ERROR: GitError: Could not retrieve GIT version
Problem with Trac 0.12.2 and GitPlugin (BrowserModule)
Browse Source defaults to HEAD, I'd like to be able to specify a branch instead
PyGIT._get_branches fails with ValueError on commit messages with line feeds
missing links in messages
«No changeset HEAD in the repository»
Support for submodules in source browsing
Problem with cyrillic file name. (UnicodeDecodeError: 'utf8' codec can't decode)
git post-receive hook - remote: error: command not found
TypeError: 'NoneType' object is not subscriptable
GitPlugin not loading, error in
'Popen' object has no attribute 'terminate'
Source browser fails with SMB hosted git repository
WindowsError: (5, 'Access is denied')
GitPlugin crashed under Win7 while using cygwin
OSError: [Errno 10] No child processes
GitNode *must* throw NoSuchNode on invalid revisions for Bitten to work
GitPlugin on Trac 0.12 with Python 2.4
some problem with TRAC 0.12 and GIT (Apple Git-33)
TypeError: execv() arg 2 must contain only strings

...and other potential issues/todos which aren't ticket-tracked yet:

  • does not highlight sha1sums automatically
  • issues with filenames containing newlines (seems to be a Trac bug)
  • ...

Existing bugs and feature requests for GitPlugin are here (all including closed ones are here).

If you have any issues, create a new ticket.

Source Code

The source code is hosted at GitHub

(An experimental branch of this plugin with a hacky caching feature and some bug fixes is available from here.)


See also generic instructions at trac:TracPlugins

If you have a recent setuptools version installed, you can directly install GitPlugin from the Github repository.

For Trac 0.11:


or alternatively the Python 2.4 backport:


For Trac 0.12



See also wiki:TracIni#git-section of your current Trac installation (if GitPlugin is enabled), for an up-to-date list of customizable [git] settings.

Simply point your Trac instance to a local git repository, and configure your TracIni:

# simple single-repository configuration
repository_dir = /var/git/Test.git
repository_type = git

## the following settings are only supported for plugin version 0.11 or later

## let Trac cache meta-data via CachedRepository wrapper; default: false
cached_repository = true

## disable automatic garbage collection for in-memory commit-tree cache; default: false
persistent_cache = true

## length revision sha-sums should be tried to be abbreviated to (must be >= 4 and <= 40); default: 7
shortrev_len = 6

## ( minimum length for which hex-strings will be interpreted as commit ids in wiki context; default: 40
wiki_shortrev_len = 7

## executable file name (in case of doubt use absolute path!) of git binary; default: 'git'
git_bin = /usr/src/git-dev/git

## ( define charset encoding of paths stored within git repository; default: 'utf-8'
git_fs_encoding = latin1

## ( enable reverse mapping of git email addresses to trac user ids; default: false
trac_user_rlookup = true

## ( use git-committer id instead of git-author id as changeset owner; default: true
use_committer_id = false

## ( use git-committer timestamp instead of git-author timestamp as changeset time; default: true
use_committer_time = false

Multi-Repository Configuration

Starting with Trac 0.12, GitPlugin gained support for multi-repository configuration (see also T:TracRepositoryAdmin for generic instructions)

TODO: write about current issues wrt GitPlugin and how to workaround them

post-receive hook scripts

For Trac 0.11 see attachments below.

With Trac 0.12 a VC independent plugin approach to handling ticket references in commit messages has been put into place. Thus for 0.12 in you basically need to enable the CommitTicketUpdater component in trac.ini or via the webinterface under 'Admin/Plugins'. Additionally you have to call trac-admin TRAC_ENV changeset added <commitid(s)>, e.g. by putting a post-receive script into your_repository.git/hooks/ along the lines of:

#!/usr/bin/env python

import sys
from subprocess import Popen, PIPE, call

GIT_PATH = '/usr/bin/git'
BRANCHES = ['master']
TRAC_ENV = '/srv/trac/myproj'
REPO_NAME = '(default)'

def call_git(command, args):
    return Popen([GIT_PATH, command] + args, stdout=PIPE).communicate()[0]

def handle_ref(old, new, ref):
    # If something else than the master branch (or whatever is contained by the
    # constant BRANCHES) was pushed, skip this ref.
    if not ref.startswith('refs/heads/') or ref[11:] not in BRANCHES:

    # Get the list of hashs for commits in the changeset.
    args = (old == '0' * 40) and [new] or [new, '^' + old]
    pending_commits = call_git('rev-list', args).splitlines()[::-1]

    call(["trac-admin", TRAC_ENV, "changeset", "added", REPO_NAME] + pending_commits)

if __name__ == '__main__':
    for line in sys.stdin:

You will also need to change your trac.ini file accordingly. Thus repository_sync_per_request under the trac section is to be unset, and tracopt.ticket.commit_updater.* under component are to be set to enabled. e.g. :

repository_dir = /path/to/git/repos.git/
repository_sync_per_request =

tracext.git.* = enabled
tracopt.ticket.commit_updater.committicketreferencemacro = enabled
tracopt.ticket.commit_updater.committicketupdater = enabled

Also make sure that the user executing the trac-admin command has read access to your TRAC_ENV and write access to your trac.log as well as to your trac database.


/!\ NOTES :

  • the Test.git in the configuration section above needs to be the .git repository directory (i.e. the one containing the file HEAD and config), not the working tree directory that holds the .git/ folder.
  • Wrong permissions may also be the cause of the error !GitError: GIT control files not found, maybe wrong directory?. Make sure the repository_dir argument is accessible via git by the tracd process.
  • If you are noticing a slow down in trac with a repository above 500 commits, try disabling the caching. It seems to bog things down as a repo grows.
  • If installed globally, don't forget to enable the plugin:
    # for plugin version 0.10
    gitplugin.* = enabled
    # for plugin version
    tracext.git.* = enabled 

Recent Changes

See Commit History @ GitHub


Author: Herbert Valerio Riedel
Contributors: Hans Petter Jansson

Attachments (7)

Download all attachments as: .zip