Git Plugin for Trac

Description

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

Features

  • 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
  • ...

Requirements

0.10 Plugin 0.11 Plugin/0.11-py2.4 Plugin 0.12 Plugin
Trac 0.10.x 0.11.x 0.12dev (trunk)
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+)
1.5.6+

Example Sites

Sites that were previously using GitPlugin

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:

#746
Improve performance of GitPlugin
#2633
It should be possible to see the branch in the timeline and for each changeset
#2685
shortrev_len does not work
#3104
internal error (got unexpected object kind 'commit') when going to "Browse source"
#3593
Improve display of merge changesets
#3888
WikiLinking branch heads?
#4318
Need help with documentation
#4505
Resetting HEAD on a remote branch causes GitPlugin to complain of missing changeset
#4733
missing post commit hook
#5351
Incorrect author in timeline and log - GitPlugin shows committer instead of author
#5357
UnicodeDecodeError on UTF-8 encoded filenames
#5728
Missing submodules support
#6216
log:@REVa:REVb broken
#6217
Obey timeline abbreviated messages setting
#6398
Internal error if ticket text references SVN-like revision number (changeset)
#6554
[patch] Add Trac 0.12 support

...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.

Download, Source

Download the zipped source, check out GitPlugin from Subversion, or browse the source.

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

Install

See also generic instructions at trac:TracPlugins

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

For Trac 0.11:

easy_install http://trac-hacks.org/svn/gitplugin/0.11

or alternatively the Python 2.4 backport:

easy_install http://trac-hacks.org/svn/gitplugin/0.11-py2.4

For Trac 0.12

easy_install http://trac-hacks.org/svn/gitplugin/0.12

Configuration

Simply point your Trac instance to a local git repository:

[trac]
repository_dir = /var/git/Test.git
repository_type = git

## the following is only for the 0.11 branch
[git]
## 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

## executable file name (optionally with path) of git binary; default: 'git'
git_bin = /usr/src/git-dev/git

/!\ NOTE: the Test.git 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.

/!\ NOTE: 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:

[components]
# for plugin version 0.10
gitplugin.* = enabled

# for plugin version 0.11.0.1+
tracext.git.* = enabled 

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, and call trac-admin TRAC_ENV changeset added <commitid(s)>, e.g. by using a post-receive script 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:
        return

    # 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:
        handle_ref(*line.split())

Help

12/13/2009 Anyone get this working in a shared hosting environment? I've tried with trac 0.11 and I get errors about it not finding the Git component (I did all the trac.ini stuff). If you have instructions please contact me, codecraig -at- gmail -dot- com ....thanks

Recent Changes

[7757] by hvr on 03/07/10 18:16:57

GitPlugin: ported code from TracMercurial? in trac:changeset:6461

[7756] by hvr on 03/07/10 17:13:38

minor logging tweak

[7755] by hvr on 03/07/10 14:00:01

GitPlugin: decode git paths to unicode strings; fixes #5357

[7754] by hvr on 03/07/10 13:09:00

GitPlugin: format git-committer and git-author properties with format_author and format_datetime; fixes #5385

Author/Contributors

Author: Herbert Valerio Riedel
Contributors: Hans Petter Jansson

Attachments