Interfaces, frontends, and tools
Frontends and Interfaces
Version Control Interface layers
Core Git (in distribution)
- Cogito for some time was the most popular version control system on top of Git. It aims at seamless user interface and ease of use, providing generally smoother user experience than the "raw" Git interface and indeed also many other version control systems. Note that Cogito is no longer maintained or recommended. Git 1.5.0 and beyond has incorporated many features that make it suitable for direct use without needing additional software.
- IsiSetup (APT for your config) is a utility to help managing your configuration files with Git as backend. You can rollback changes, explore the history of changes, replicate your configuration, backup your configuration and blame changes to admins.
See also: etckeeper.
- Easy Git (eg) Easy Git is a wrapper for Git that is designed to make git easy to learn and use. Easy Git aims to be easily learnable, interchangeable with Git, fully capable, and compatible with Git. Users can move back and forth between using Easy Git and Git itself.
- yap (Yet Another Git Porcelain) Yap is an alternative porcelain for git that is designed to have a friendlier, more orthogonal interface. It is also easily extensible with python plugins.
- darcs-git.py (and its documentation) darcs-git is a darcs-like porcelain on top of git plumbing. If you are accustomed to darcs, this porcelain will let you use git via the familiar darcs user interface.
- repo is a project to use Git to build OS distributions; similar to Git submodules, it can track specified branches from Git projects.
See also: Gerrit and Repo, the Android Source Management Tools blog post by Jeff Bailey
- Zit by Giuseppe Bilotta is the Git-based single file content tracker; it uses Git to independently track single files within a directory; sort of like what RCS does, but with the power, flexibility, elegance and ease of use of Git. Still in alpha stage.
You can get it from `git://git.oblomov.eu/zit`
- gitwork An implementation of a proposal to add working branch management commands to git. These commands help keep a developers working tree stable, while preserving the benefits of topic based development. Currently maintained as a patch to the git core pending acceptance. Also available as tarball to patch existing git installations in cases where a new build is not possible.
Interfaces to other programming languages
- libgit2 is a project to replace the core parts of git with an implementation reusable for language bindings and higher-level applications.
- Git::CPAN::Patch provides a suite of git commands aimed at making trivially easy the process of grabbing any distribution off CPAN, stuffing it in a local git repository and, once gleeful hacking has been perpetrated, sending back patches to its maintainer.
- PyGit (abandoned?) is a set of pythonic git bindings targeted towards porcelains. There is also the "stores" branch that implements pack and object reading natively in Python.
- vcs is Various Control System abstraction layer written in Python. Uses mix of already mentioned Dulwich and git binary for git backend. Provides simple yet fully featured interface and is under heavy development stage.
- Grit is a Ruby library for extracting information from a git repository in an object oriented manner. This includes a partial native Ruby implementation, which is used for a number of the operations.
- GitStore implements a versioned data store based on the revision management system Git. You can store object hierarchies as nested hashes, which will be mapped on the directory structure of a git repository. Basically GitStore checks out the repository into a in-memory representation, which can be modified and finally committed. GitStore reads and writes the git repository natively in Ruby.
- GitRb is another partial native implementation of Git in Ruby similar to grit.
- v is another Ruby library providing a git adapter that makes working with git repositories easy. Git operations are mapped almost 1:1 to ruby methods and executed in a separate thread returning futures when they're queued. It supports core git objects and convenience objects (indexes, branches, ...) which will provide a convenient API. It is still under development, means except for few examples there is no real documentation and most of the git operations still need to be implemented (first CommandLine wrapper (porcelain and plumbing), then pure Ruby (plumbing and then porcelain)).
- ObjectiveGit is an Objective-C partial implementation of Git and a corresponding object level library that can be used to create, read and manipulate Git repositories. It also contains git server implementations (receive-pack and upload-pack).
- JavaGit is an API providing access to git repositories for Java applications. JavaGit is engineered to provide the developer with access to the raw git commands through a command API as well as an object API designed to represent the .git repository, the working tree and other, familiar git concepts. JavaGit uses the git binaries installed on the host machine to provide git functionality and has been designed to easily accommodate additional methods of access to git repositories. JavaGit is released as open source software under the GNU LGPL license.
Currently in early alpha version
See also: NYU Open Source Programming Class Releases JavaGit API 0.1.0 Alpha thread on git mailing list.
- glip, the git library in PHP, provides read and write access to Git repositories without using exec() or system() calls. Therefore it works on many shared web hosting accounts.
.NET and Mono
- NGit Automated jgit port to c#. The MonoDevelop team really wants to provide integrated support for Git in the IDE. GitSharp was a little bit outdated so it was a challenge to bring it up-to-date to match JGit. So they finally decided to use Sharpen, our open source Java to C# translator, to automatically convert the JGit code base to C# (details)
- hs-libgit provides a lowlevel interface in haskell using git core through fork/exec. The goal is to make use of libgit2 as soon as it's usable.
- hit is a read-write haskell reimplementation of git's storage format. Completely inter-operable with the official git tools. It doesn't use git's CLI and provides some basic API to manipulate a git store (reading from individual or packed objects, and writing).
Patch-management Interface layers
StGIT (Stacked Git)
- StGIT (homepage) provides a Quilt-like patch management functionality (i.e. pushing/popping patches to/from a stack) in the Git environment. You can easily manage your patches in the scope of Git until they get merged upstream.
See also: Quilt project page.
Guilt (formerly Git Queues (gq))
- guilt (download, gitweb) by Josef "Jeff" Sipek is a series of bash scripts which add a Mercurial queues-like functionality and interface to git. The one distinguishing feature from other Quilt-like porcelains, is the format of the patches directory. All the information is stored as plain text - a series file and the patches (one per file). This easily lends itself to versioning the patches using any number of of SCMs.
- cj-git-patchtool (github) by Christian Jaeger is a tool to edit the history of a Git repository. It does this by turning the history in question into a set of git patch files and a file containing the list of the patches.
- TopGit (gitweb, README) by Petr 'Pasky' Baudis is patch management interface done as a shell script, which can be used to manage queue of third-party patches on top of another project. It is a very thin layer on top of Git (allowing to use index), it attempts to keep all history of your changes till final cleanup, and allows to specify patch dependencies instead of linearizing patches in patch series (patch queue).
In early stages of development.
See also: TopGit - A different patch queue manager announcement on git mailing list.
Patchy Git (pg), deprecated
- Cocoon  is a KDE 4 playground project to create a GUI for git.
gitk (distributed with Git)
- gitk is a simple Tcl/Tk GUI for browsing history of Git repositories easily, distributed with Git.
git-gui (distributed with Git)
Katana (Mac OS X)
- Katana () a comprehensive Git UI that focuses on making common operations easy. Visual diffs supported.
RepoWatch (Mac OS X)
Sprout (formerly GitMac) (Mac OS X)
- Sprout (homepage) Sprout is an App for Mac OSX that focuses on being a fast, user-friendly Git client. For developers who are new to Git, transitioning from Subversion, or just want a nice Mac UI alternative. Focuses on browsing and managing repositories and branches, and making common operations easy.
tig (Text-mode Interface for Git)
- tig (homepage) by Jonas Fonseca is a simple git repository browser written using ncurses. Basically, it just acts as a front-end for `git-log` and `git-show`/`git-diff`. Additionally, you can also use it as a pager for git commands.
- QGit (homepage) is a Qt GUI for browsing the history of Git repositories. It also acts as a commit tool, like (h)gct and as a graphical interface to StGIT. There is an experimental version of QGit ported under Qt4.2 libraries, available at http://repo.or.cz/w/qgit4.git. This means that it could be compiled and run as a Windows native application.
gitview (in `contrib/`)
- GitView is a GTK based repository browser for git written in Python by Aneesh Kumar K.V. It can be found in `contrib/` directory of Git source tree.
- GitForce (homepage, github) by Goran Devic is a git frontend GUI for both Windows and Linux. It is in active development.
- GitJungle () is a graphical branch explorer displaying branch history horizontally instead of vertically as most git graphical tools do. It shows merge links, commits, tags and branches and displays diffs when clicking on a specific commit. It runs on Windows, MacOS X and Linux. It is free and requires Mono to run.
- Qct (hg repo) by Steve Borho is Qt/PyQt based GUI commit tool, meant to be SCM and platform agnostic. Supports Mercurial (`hg`), Bazaar (`bzr`), Cogito (but not Git directly atm), Subversion (`svn`), Monotone (`mnt`) and CVS. The README mentions gct (also on this page), as an alternative supporting plain git.
- git-cola (github, homepage, gitweb) by David Aguilar is an advanced git commit tool, similar to git-gui, written in PyQt4. git-cola features a graphical 2D history viewer, easy, interactive partial-diff staging, inotify support, and more. You can get tarballs at http://cola.tuxfamily.org/. Native packages exist for Debian, Fedora, and Arch. Mac OSX and Windows builds are available on the website.
- teamGit (http://www.devslashzero.com/teamgit) by Abhijit Bhopatkar is a successor of kgit. It is intended to be a complete development workflow management app with git as a base tool. As of oct 2008 it can be used as a pretty good commit tool. Please see feature table below.
- GitX (homepage, github, download) by Pieter de Bie, Germán Laullón and others is a gitk clone aiming to provide a more native interface to MacOS X users with OS X-only features. It has a native interface and tries to integrate with the operating system as good as possible. Examples of this are drag and drop support and QuickLook support.
See also: GitX v0.1: Gitk clone for OS X post on git mailing list.
- pyrite by Govind Salinas is a Git GUI and front end written in Python.
- gitSafe (homepage) by cmroanirgo is a SourceSafe-like GUI for git using MFC. NOTE: This software is Closed Source.
- Git Extensions (github) is a toolkit for Windows users. The main feature is a shell extension that enables a context menu in Windows Exlorer to use most Git functions. The toolkit also contains a standalone GUI and a Visual Studio 2005/2008 plugin. The toolkit is mainly written in C#, the shell extensions code is written in C++. The toolkit is still under development, there is a beta version downloadable here: http://code.google.com/p/gitextensions/
See also: Announcement: Git Extensions stable (windows shell extensions) on git mailing list.
- TortoiseGit (gitweb) by Li Frank is a port of TortoiseSVN to Git. It is Microsoft Windows Explorer extension, written in C++. As of February 2011 TortoiseGit is at version 220.127.116.11 and implements most regular tasks such as commit, show log, diff two versions, create branches and tags, create patches etc. It is not yet complete but well worth a try.
Dreamweaver GIT (GITWeaver Dreamweaver Tortoise Extension)
- git-cheetah is a cross platform filemanager plugin. It was started as a Windows explorer extension so the standard gui tools (namely Git Gui, Gitk History, Git Gui Blame) of git would be available from the filemanager. It has been ported to Mac OS X (Finder before 10.6) and Gnome Nautilus. Written completely in C, it has a simple infrastructure ready to add more plugin implementations. You can find the repository at http://repo.or.cz/w/git-cheetah.git.
- StupidGit by Ákos Gyimesi is a cross-platform git GUI written in wxPython. It tries to be easy to use for beginners and has advanced support for submodules. It is quite early in development, but already implements many features including merge, cherry-pick and easy switching between versions.
- SourceTree is a fast and friendly GUI for Git and Mercurial for Mac OS X 10.6+ (closed source, commercial). A trial version is available.
Summary (feature matrix)
|written in||Tcl||Tcl||C||C++||C||Python||Perl||Python||Python||Python||Python||ObjC, Ruby||ObjC||Python||C++||C++||C#, C++||C++||C||Java||Python||ObjC||Java|
|undo diff fragments||X|
|interfaces w/ external diff viewers||X||X||X||X||X||X|
|diff +/- highlighting||X||X||X||X||X||X||X||X||X||X||X||X||X||X||X||X||X|
|apply patches via drag'n'drop||?||?||?||?||?||?||?||?||X||?||?||?||?||X||X|
|i18n||de, es, it, sv||de, fr, hu, it, ja, ru, sv, zh_cn||ca, de, en_GB, es, fr, ja, pl, sv, vi||partial de, fr, hu, it, ja, ru, sv, zh_cn|
Deprecated and stalled projects
- (h)gct (gitweb) by Fredrik Kuivinen is a GUI enabled commit tool. It has support for both Git and Mercurial. In Debian in commit-tool package. Written in PyQt. Does not support git 1.6 and higher.
- GitNub (homepage, github) by Justin Palmer is an Mac OSX Leopard client for git written in Ruby and Objective-C.
- KGit (http://kgit.sourceforge.net/) by Abhijit Bhopatkar is intended to be a small but functional frontend to the popular source control program, git. It is similar to gitk with two significant differences. First of all, it is written in Qt using lop and the KDE libraries. Secondly, it is not only a repository viewer, unlike gitk. It is now defunct and deprecated by the author. Has no future.
Push Me Pull You (stalled)
- pmpu (Push Me Pull You) by Mark Williamson is a graphical interface for a distributed version control system. Currently it contains proof-of-concept supports the Mercurial, git and bzr systems. PMPU can make use of external history views and commit tools. Preview release. As of November '09, no developer activity for more than 1 year.
gitweb (distributed with Git)
- gitweb provides full-fledged web interface for Git repositories. It is written in Perl and was maintained by Kay Sievers; from git version 1.4.0 it is distributed with Git. Used at kernel.org and repo.or.cz. The XMMS2 project maintains their own version of gitweb which has some additional features. The latest snapshot of this effort can be downloaded from http://git.xmms.se/?p=gitweb-xmms2.git;a=summary. John 'Warthog9' has added in caching to the gitweb, and split it into many modules. See it at work at http://www.kernel.org/git/?p=git/warthog9/gitweb.git;a=summary. Changes are published at `git://git.kernel.org/pub/scm/git/warthog9/gitweb.git`. See also: Gitweb - caching message at git mailing list.
- GitList is an elegant and modern web interface for interacting with multiple git repositories. It allows you to browse repositories using your favorite browser, viewing files under different revisions, commit history, diffs. It also generates RSS feeds for each repository, allowing you to stay up-to-date with the latest changes anytime, anywhere. GitList was written in PHP, on top of the Silex microframework and powered by the Twig template engine. This means that GitList is easy to install and easy to customize. Also, the GitList gorgeous interface was made possible due to Bootstrap.
- InDefero is a clone of GoogleCode with git, Mercurial and Subversion browser, wiki, download area, issue tracking and code review supporting multiple private/public projects. Using a shared user account with SSH keys you can control the read/write access rights to your repositories from within the web interface. GNU GPL/Clean MVC PHP5 code, very fast and easy to extend. Download, view source. Free hosting also available.
- Wit (http://github.com/dchokola/Wit) is a Ruby/eRuby web interface to git that provides much easier setup, configuration, maintainability, and customizability than gitweb, all in fewer lines of code and with a prettier interface. It is (barely) maintained by Daniel Chokola.
- git-php is a PHP git web frontend created by Zack Bartel. The goal of git-php is a robust PHP web interface to git repositories. It is meant to be easily customizable through styles and the ability to be embedded into any PHP page. For example, creating a git repository viewer plug-in for your favorite PHP based CMS should be easy with git-php. It seems to be inspired by gitweb. See it at work at zackb.org.
- http://people.proekspert.ee/peeter/git/git.php is a PHP git web frontend created by Peeter Vois. This is continued work of Zack's version of git.php. git-php does now have syntax highlighting of code, graph view of the repository including branch and tag, diff can be browsed against several parent versions, tree browser does have some nice icons, simple search for branch heads and tags, any version of tree can be downloaded in tar.gz or zip format and the filename will include hash of the tree or tag if attached, files can be downloaded independently in binary form. Git php is providing interface for sending bundles to the owner of the site. This is useful for those who would like to stay anonymous or do not like to send bundles via e-mail. The bundle is also tested against the repository before acceptance.
- http://github.com/josegonzalez/git-php is a PHP git web frontend created by Jose Diaz-Gonzalez. Contains updates to Peeter Vois and Zack Bartel's work that adds a github-like stylesheet, as well as fixes for the latest updates to git syntax. It is also an attempt to ameliorate the differences between gitweb and all other gitweb derivatives with git-php.
- GitPHP (demo) is a PHP git web interface with gitweb-like look (the xmms2 fork of git), created by Christopher Han. It makes use of Smarty templates, so it can be easily modified and customized. It offers syntax highlighting via GeSHi PHP class, has support for snapshots and projects categories; it can be run with msysGit.
- viewgit is another PHP web interface for git, written from scratch. It aims to be easy to set up and upgrade, light on dependencies, and comfortable to use. It provides all basic features such as commitdiffs, RSS feeds of changes, downloading of trees, checkouts, syntax highlighting using GeSHi, etc.
- cgit is a fast and lightweight webinterface written in C. It uses libgit.a to avoid forking of git commands and an on-disk cache to avoid duplication of expensive repository operations. The repo is hosted on hjemli.net and can be cloned from git://hjemli.net/pub/git/cgit. Users of cgit include freedesktop.org, compiz-fusion.org, dyne.org, repo.or.cz, savannah.gnu.org and gnome.org.
- Gitalist (gitweb, github, demo) is a web frontend for git repositories written in Perl and backed by Catalyst web framework. It used gitweb.cgi as template, and attempts to be URI compatible with gitweb.
See also: Zac Stevens' talk at London Perl Workshop 2009.
- GitStat (SourceForge project) is a GPL'd, web-based git statistics/monitoring system. It retrieves a specified git tree, analyzes changesets, and shows graphical information like the number of changesets per day, the number of people who submitted changesets for a specific version (tag) etc. Users may subscribe to gitstat so that they automatically receive an email notification if any change is applied to a specified directory. See also gitstat 0.1: kernel development statistics / monitoring system announcement on git mailing list. You are welcome to try gitstat at http://tree.celinuxforum.org/gitstat
- GitStats - with a 's', not the same as GitStat - (SourceForge project) is a statistics generator for git repositories. It examines the repository and produces some interesting statistics from the history. Currently it outputs only HTML. As opposed to GitStat, it generates the HTML statically, and is therefore suitable to generate pages to upload to a dumb HTTP server. Some examples are available.
- pitweb by Daniel Fiser is a web interface for git repositories written in python and licensed under LGPL.
Git Enablement Server (G.E.S.)
- Git Enablement Server is a combination of Git SmartHTTP server (git_http_backend replacement) and a web interface for consuming and browsing filesystem trees sprinkled with git repositories.
- Install is just "git clone URI", "git submodule init", "git submodule update --recursive". In it's simplest form, the server is set-up and started just by double-clicking the executable. As of Nov 25, 2010, is tested to work equally well on Linux and Windows. To run, requires only two things: Python and command-line git executable.
- git2html generates a set of static HTML pages for exploring a git repository. Because the pages are static, no CGI script is required to explore the repository. This makes git2html more secure and robust than other web viewers. Due to the decision to use static html, git2html is also less flexible, for instance, it does not support showing a diff between arbitrary revisions.
- git webcommit A webbased committool with very few little requiments. Written in PHP, uses git commandline tool for writing to the repository. Useful for example when people want to keep track of changes when collaborating on a website.
- Grack (github) aims to replace the builtin git-http-backend CGI handler distributed with C Git with a Rack application. This reason for doing this is to allow far more webservers to be able to handle Git smart http requests.
- Git-Webby (codigorama, github, google) was inspired in the Grack Smart-HTTP server handler (written by Scott Chacon) but developed using Sinatra and aims replace the original git-http-backend including new features.
Access control / Project hosting
gitosis (unmaintained ?)
- gitosis (gitweb, README by Tommi 'Tv' Virtanen is a tool to manage git repositories, provide access to them over SSH, with tight access control and not needing shell accounts. Described in Tv's cobweb: Snakepit and gitosis, things I've been working on on author's blog and Hosting Git repositories, The Easy (and Secure) Way post on scie.nti.st, Garry Dolley blog. (Python, requires setuptools)
- SCuMD (gitweb, by Mike 'gaffo' Gaffney is a tool provide access to git repositories over SSH, with pluggable access controls and without the need for shell accounts or the normal ssh daemon exposed. (Java, require java 1.6)
- ssh_acl by Bruno Ribas is a set of bash scripts which can be used to manage Git repositories access.
- gitolite (http://github.com/sitaramc/gitolite), by Sitaram Chamarty, (sitaramc at gmail), is inspired by gitosis, plus an urgent need to manage per-branch permissions. It is written entirely in perl, and designed to be usable on any Unix machine that managed to install git and perl. It does not require root access to install or use.
- SCM-Manager (http://www.scm-manager.org) by Sebastian Sdorra is a java webapplication to create and manage git, mercurial and subversion repositories. SCM-Manager allows easy access to the repositories over the http or https protocol.
- Gitblit (github, Google code) is an open-source, pure Java stack for managing, viewing, and serving Git repositories (based on JGit). It's designed primarily as a tool for small workgroups who want to host centralized repositories. Gitblit is available in two variations:
- Gitblit GO - a complete & integrated pure Java stack
- Gitblit WAR - a traditional WAR distribution
(Java, requires Java 6 Runtime Environment (JRE) or a Java 6 Development Kit (JDK))
- git fs A fuse filesystem for browsing git commits and past worktrees.
- figfs A fuse interface to git, with editable workspace support.
- GitFS is a FUSE-based filesystem for working with source trees stored in git repositories. The eventual goal is to provide a convenient way to work with lots of branches and patches. Currently (pre-release version 0.03) only very basic functionality is implemented - read-only access to the existing tags and objects.
Inferno filesystem translator
- gitfs (inferno) A git filesystem translator for inferno, a portable plan9.
Editors and IDE integration
Emacs integration (in contrib/)
- Preliminary Emacs mode for Git from Alexandre Julliard (in contrib/emacs directory) consist of `git.el` which is project tree browser similar to pcl-cvs, and vc-git.el which is VC backend (see also vc-git-hacking at gnuvola).
There is also a project, DVC (Distributed Version Control), on Gna!, by the authors of Xtla, to create a generic library for fancy Emacs interfaces to modern version control systems. Currently it supports GNU Arch (tla) and Bazaar (baz), and has initial support for Bazaar-NG (bzr) and Mercurial (xhg).
- Magit is an alternative git mode for Emacs. Unlike the standard Emacs vc mode (git.el) it can take full advantage of git specific features.
- See also: EmacsWiki:Git and EmacsWiki:Category:VersionControl pages on EmacsWiki
Ecilpse plugin (EGit)
JetBrains IDEs: IntelliJ IDEA 9.0 / PyCharm 1.0 / RubyMine / etc.
- IntelliJ IDEA 9.0+ - for Java
- RubyMine 2.0+ - for Ruby
- PyCharm 1.0+ - for Python, in Beta (as of October 2010)
- WebStorm 1.0+ - for Web Dev
- PHPStorm 1.0+ - for PHP
- The Git4Idea plugin provides basic Git integration support for the IntelliJ/JetBrains IDEA (v6 & above) development environment. The Git4Idea plugin can be downloaded from within IDEA itself using the IDE Settings->Plugins config panel. The plugin home page contains the latest release information and source code is also available here. Git4Idea uses the git command line tool to work; Cygwin 'git' on Windows is recommended.
- Development of a Git plugin for kdevelop has begun. Basic support implemented
- NetBeans comes with Git support out of the box. Also see: NetBeansPlugin
- fugitive.vim is a Vim plugin with lots of features, for example: View any blob, tree, commit, or tag in the repository with :Gedit ... Edit a file in the index and write to it to stage the changes. Use :Gdiff to bring up the staged version of the file side by side with the working tree version and use Vim's diff handling capabilities to stage a subset of the file's changes. ... :Gblame brings up an interactive vertical split with git blame output.i :Gmove does a git mv on a file and simultaneously renames the buffer. :Gremove does a git rm on a file and simultaneously deletes the buffer. Use :Ggrep to search the work tree (or any arbitrary commit) with git grep, ... :Glog loads all previous revisions of a file into the quickfix list so you can iterate over them and watch the file evolve! Use :Gbrowse to open the current file on GitHub... and much more.
- Other Vim tips
- Git Extensions. See Graphical Interfaces above or website for details.
- dirdiff (gitweb) is a graphical tool to display the differences (a la diff) between files in directories. Given two or more directory trees, dirdiff will display the differences between them in various glorious colors. It provides merging and the creation of patches. Link is to version modified by Sven Verdoolaege, which adds some more git support, and which is based on dirdiff-2.1.tar.gz by Paul Mackerras. Not actively developed. In Tcl/Tk. (To be not confused with dirdiff in Perl).
Per-file merge drivers
Interaction with other Revision Control Systems
Built-in import (built in)
- Tailor is an any-to-any version control system converter, with support for most free SCMs. It was written by Lele and it is implemented in Python. Note that you need VersionOne. Note also that as of 2006-12-01, it only has rudimentary support for branches, and mostly supports linear histories.
git-cvsexportcommit (built in)
- `git-cvsexportcommit` exports a commit from Git to a CVS checkout, making it easier to merge patches from a git repository into a CVS repository. Supports file additions, removals, and commits that affect binary files.
git-cvsserver (built in)
- `git-cvsserver` is a CVS emulation layer for git. It is highly functional; the mapping is bidirectional, so people who like cvs, can do both checkout and commit using cvs, and it shows up in git. However, not all methods are implemented, and for those methods that are implemented, not all switches are implemented. Testing has been done using both the CLI CVS client, and the Eclipse CVS plugin. Most functionality works fine with both of these clients.
- parsecvs by Keith Packard is a C-based CVS file parser and Git import tool. It directly reads RCS ,v files (you can get them using CVSsuck if you don't have access to $CVSROOT) and generates a git-style rev-list structure from them. Repository available at git://anongit.freedesktop.org/~krh/parsecvs
- cvs2svn has a cvs2git mode for converting directly from CVS to git. cvs2svn/cvs2git is very robust and gives high-quality conversions with many features and customization options. cvs2svn/cvs2git only supports one-time conversions. cvs2git's output can be read by Shawn Pearce's git-fast-import, which has been bundled with core Git since version 1.5.
Note that cvs2svn/cvs2git itself can't work with remote repositories. If you can't get a copy of the CVS repository directly, you might be able to recreate it indirectly via information read over the CVS protocol using a tool like CVSsuck.
- fromcvs by Simon 'corecode' Schubert is a conversion tool ment convert from CVS to multiple SCMs. At the moment there is a git and a hg output and a sqlite output for quick CVS changeset navigation. For the cvs->git conversion, git-fast-import by Shawn Pearce is needed (see above). fromcvs handles branches (though no tags yet), including native support for vendor branches. Incremental operation is supported. Conversion speed should be well above 10 changesets per second on common hardware. fromcvs/togit can take advantage of two CPUs.
- gc-utils (freshmeat page, gitweb, announcement) is a small set of scripts wrapping git-cvsexportcommit and git-cvsimport, allowing to import and update CVS repositories into git very easy and let you export patches back into a CVS working copy. Written in bash.
git-svn (built in)
- git-svn (git repository), written by Eric Wong, is a conduit for bidirectional operation between a Subversion repository and git. It supports Subversion branches and tags, importing multiple Subversion repositories into a single git repository, and incrementally updating the git repository with changes from the Subversion parent. It is designed for developers who wish to contribute to projects that use Subversion, but would rather be using git. Written in Perl using the SVN::Core Perl library.
See also: git-svn-bugfix script
- There is also git-svnimport, and because it came earlier it is mentioned often in old documentation. At the moment (August, 2008), git-svn is better supported.
- git2svn, written by Paul Miller, is a git repo exporter designed to allow a user to import numerous git repos into a trac wiki. Trac only supports svn (natively) and only supports a one repo configuration. Although there are git plugins for Trac, they are cumbersome and (because of trac's design) only support one repo at a time. git2svn solves that by importing as many git repos as needed into directories of an svn repo. It does this using native svn and git commands with perl as glue.
- git2svn (gitweb), written by Love Hrnquist strand, is a tool to convert the "git fast-export" dump into a svn dump and load it into a new fresh svn repository. git2svn also supports incremental updates. NOTE: git2svn assumes its the only process that writes into the svn repository. Written mainly in Perl.
See: git2svn 0.1 post on git mailing list.
git2svn.pl (yet another one)
svnExport.pl (one-way, no rebase)
- svnExport.pl (github), by Martin Long, has been written to allow a one way sync to a subversion repository, without the need to rebase or write commit details back to the GIT repository. This makes is suitable for syncing a central or shared GIT repository to a SVN repo for backup, or to satisfy corporate/project requirements. The removal of the need to rebase prevents issues with downstream repositories. Works on multiple repositories, creating new branches in SVN automatically. For non-linear histories without a branch in tack, only the first-parent chain is committed.
- svn2git.py (download), written by Neil Schemenauer, is a tool to do conversions from SVN (Subversion) to git using a SVN dump. It's in early stages of development. Written in Python.
See: New converstion tool: svn2git.py thread on git mailing list
- svn2git (github), forked by Kevin Menard from James Coglan project, is a Ruby tool for importing existing svn projects into git and github. It uses git-svn.
- git-svnconvert, written by Rutger Nijlunsing in Ruby, appeared only on git mailing list in post git-svnconvert: YASI (Yet Another SVN importer).
- svn-all-fast-export/svn2git (Gitorious) by Thiago Macieira, is a tool that exports from Subversion onto multiple Git repositories via git-fast-import. Written in C++, uses Qt Core library. It came into being to serve KDE's needs for a conversion to Git. It is reportedly faster than git-svn as of 2010-03-30: 8 minutes instead of 110 minutes on a multi-branch 15,5K revisions repository.
- Braid (github), formerly Giston, is a Piston lookalike for git-svn: a simple tool to help track svn vendor branches in your git repository. By Cristi Balan, in Ruby (Piston is in Ruby).
- hg-to-git is Mercurial to git converter, written by Stelian Pop, appeared only on git mailing list in post Mercurial to git converter. It supports incremental conversion, supports (multiple) hg branches and converts hg tags. Written in combination of shell script and Python.
- hg-fast-export is another converter using `git-fast-import` as backend and is written in Python using the mercurial python classes directly. It uses a single pass, supports tags, mercurial named branches, incremental imports and merges. It is quite fast since no subshells and/or pipe communication is used except for the feed to `git-fast-import`. The source is available as part of the fast-export repository at repo.or.cz.
- utility for checking out and tracking a mercurial repo: https://github.com/offbytwo/git-hg
- Having had problems with darcs2git and tailor, Steve Purcell wrote another simple darcs import tool called darcs-to-git, which can incrementally import a single darcs source repo: article / darcs-to-git gitweb
- A generic fast-export script for darcs by Miklos Vajna, works with git fast-import, bzr fast-import and hg fastimport. Find it at here.
- darcs2git (gitweb) by Han-Wen Nienhuys (his homepage) is a Darcs to Git converter utilizing `git-fast-import`. It tries to map Darcs conflict resolutions onto Git branch merges. Written in Python.
See: darcs2git.py - convert darcs repository using gfi at git mailing list
- Git-bzr allows bidirectional synchronization between Bazaar and Git repositories, much like git-svn. However, git-bzr is able to keep all merge history etc. Ruby original can be found at github (port to shell script: mcepl, kfish).
git-p4 (built in)
- Git includes a built-in mechanism to pull code from perforce, and to submit back from git to p4.
- git-p4 manual page.
- git-p4 example usage.
- git-p4 install and developer information.
- The project `git-p4raw` can import an entire p4 depot faithfully, preserving branch relationships. It uses the p4d database files directly. See the github repo.
- A Ruby script that imports Monotone repositories with different modes of operation; checkout and fast-import. Depending on the method is the completeness and reliability: checkout method is almost complete. It also allows further updates. Find it at github.
CC2GIT ClearCase GIT Bridge (Clearvision)
- Complete Integration between IBM Rational ClearCase and Git from Clearvision. The CC2Git Bridge allows developers to quickly and easily transport code between the two tools, enabling one continuous integrated SCCM environment with the reduced costs associated with open source software. Looking to Migrate; the CC2Git bridge allows companies to perform a controlled migration within longer timescales, learning and resolving dependencies as they arise, using live data but without affecting project teams.
Read More on our website: http://www.clearvision-cm.com
git-ucmimport (IBM Rational ClearCase)
- git-ucmimport, also written by Rutger Nijlunsing, is a converter from IBM Rational ClearCase UCM to git. The current version can be found on http://eludias.dyndns.org/git-ucmimport.rb . The announcement was in http://www.gelato.unsw.edu.au/archives/git/0607/23790.html . In Ruby.
quilt2git / git2quilt
- These utilities convert patch series in a quilt repository and commit series in git back and forth. You can download files here; they can be found on HomeTJ webpage.
- There exists proposed `conftib/fast-import/git-sccsimport.py` in fast importer for SCCS files post by James Youngman on git mailing list, and sccs2git-gfi importer by Sam Vilain in VCS::SCCS CPAN module.
- rpm2git (gitorious, announcement) by Federico Mena-Quintero is a tool to help import patches from SRPM (source rpm) into appropriate place in git repository (in Python).
See also: How to use rpm2git screencast.
vss2git (Visual Source Safe to Git)
vss2git (Visual SourceSafe to GIT or SVN)
tfs2git (Team Foundation Server to Git)
- tfs2git - Powershell script that converts Team Foundation Server repositories to a Git repository. Replays the history from the Team Foundation Server and adds it to a Git repository.
git-tfs (Team Foundation Server bridge)
- git-tfs is a two-way bridge between TFS and git, similar to git-svn. You need .NET 4 and either the 2008 or 2010 version of Team Explorer installed.
- archive-tag is a post-receive/update hook developed by Koumbit.org and formerly used by the Aegir project to ease maintenance of tarballs associated with a git repository. Archives (and optionally checksums) are created when tags are pushed to a repository. This is part of Koumbit's git-hooks project.
Hooks for integration with IBM Rational Team Concert
CIA is a system for tracking open-source project commits in real-time. It needs a script installed as a post-commit or update hook to send git log summary messages to the CIA server,
- The Version 3 ciabot scripts, ciabot.py and ciabot.sh, have been rewritten to work well with git version 1.6.0 and later. Use ciabot.py unless your hosting site forbids Python hooks; the shell version is more likely to break due to not being able to call out to utilities it needs.
- These scripts evolved by translation from ciabot.pl by Petr Baudis in the `contrib/` directory of Cogito. The ancestral Perl is somewhat fragile and may fail with newer git versions, although Koumbit.org has a fixed version in their git hooks project. This is the "version 2" script, still written in Perl and still kicking.
The Version 3 scripts are part of git contrib/ as of 2010-04-02.
The advantage of the version 3 scripts are that they are a full rewrite in Python, however they do not support XMLRPC anymore and force you to include a URL in the IRC output, optionnally wrapped with tinyurl, which some people may not want.
The advantage of the version 2 script is that it does not do talk to tinyurl (but they don't support gitweb links) and it has XMLRPC support.
Wikis, blogs, etc.
- Gollum is a simple, Git-powered wiki with a sweet API and local frontend. It is the wiki engine of github.
- wikiri is a simple, single-file wiki written in Python. It uses reStructuredText for markup, and has optional git support for history tracking. You can browse the repository or just clone it from `git://blitiri.com.ar/wikiri`.
- Nuki (github) by Patrick Thomson is a Wiki engine written in Nu and powered by Nunja (github), a cross-platform web server that's scripted with Nu, that uses Git for version control, and Markdown (via NuMarkdown) for markup.
- git-blog (github) is a minimalist blogware that uses git, using Ruby to 'deploy' Markdown posts to XHTML when git-pushed to your server.
- Tekuti is weblog software written in Scheme, using Git as its persistent store. It uses WikiPedia:SXML for markup, and requires Guile or other Scheme implementation, and mod_lisp (a bit of misnomer: it is similar to WikiPedia:FastCGI or SCGI that it creates long-lived CGI process, but with simpler protocol). Tekuti includes a script to import posts from Wordpress into a suitably-laid-out directory.
Announcement: I'm telling you on Andy Wingo wingolog.
- Chuyen is a weblog software written in Python, using the django web framework and git as its data storage backend through pygit. It uses ReStructuredText as its markup language.
- eWiki is a Wiki with a git backend, written in pure PHP (no ugly system() or exec() calls).
- Pystl (gitweb) by Jack Miller is very simple, small blog engine in Python, using git for version control, Markdown for markup and Tenjin for templating. It doesn't have web interface, so it also have no comments.
- gitit, a Wiki written in Haskell, uses git for storage, HAppS for a web server, and pandoc for markdown processing.
- Shinmun (github) by Matthias Georgi is small git-based blog engine written in Ruby. Write posts in your favorite editor, `git-push` it and serve your blog straight from a repository. Supports Markdown, Textile or HTML files.
- OddmuseGit, two bash scripts to interface between git and the Oddmuse wiki. Handy for merging multiple Wikis or having distributed Oddmuse wikis without changing the existing backend.
Levitation (export Wikipedia page history into a Git repository)
Bug/issue trackers, etc.
- Ditz is a simple, light-weight distributed issue tracker designed to work with distributed version control systems like darcs and git. Ditz maintains an issue database file on disk, written in a line-based and human-editable format. This file is kept under version control, alongside project code. Changes in issue state is handled by version control like code change: included as part of a commit, merged with changes from other developers, conflict-resolved in the standard manner, etc.
- CIL - Command-line Issue List (written in Perl), allows fast creation of a distributed issue tracker which fits in well with any VCS.
See also: Blog posts tagged 'cil' on kapiti.geek.nz.
SD (Simple Defects)
Gerrit Code Review
codeBeamer Collaborative ALM Solution
- An ASP.NET bug tracking system with git integration.
Jira Git plugin
- git-bz (script, cgit) is a command-line tool for using git with bugzilla. You can file commits (in git-format-patch format) as new bugs, attach them to existing bugs, or apply patches attached to bugs to your working tree. It has some neat features like rewriting the commit to include the URL to the newly filed bug before attaching it to the bug. git-bz is a self-contained Python script that acts as a git subcommand and has no external dependencies other than git.
- scm-bug (http://www.mkgnu.net/scmbug) is a generic glue between VCS systems (git, svn and cvs in 0-26-21) and bug-tracking software (bugzilla, mantis, request tracker and test director in 0-26-21). It provides features such as notifying the bugtracker when a related commit is done, optional workflow-enforcing checks, version description document generation. Written in perl.
IBM Rational Team Concert
Backups, metadata, and large files
- bup (github) by Avery Pennarun is software that can efficiently backup large amounts of data (hundreds of GB) across large numbers of files (millions), using a git-formatted repository as storage. It also efficiently stores huge individual files, such as virtual machine disks, and can backup directly to a remote machine rather than using space on the local machine. A FUSE module is included so you can mount your backup repository as a filesystem and restore files that way.
See also: Bup: it backs things up blog post (and comments).
- git-annex allows git to track files whose content should be tracked out-of-band some other way. This is useful when dealing with files larger than git can currently easily handle, whether due to limitations in memory, checksumming time, or disk space. Annexed files can co-exist in the same git repository with regularly versioned files, which is convenient for maintaining documents, Makefiles, etc that are associated with annexed files but that benefit from full revision control.
- Chronoversion is a simple Python script which attempts to use the git content tracker to provide chronological snapshots similar to Plan 9's venti filesystem. The two differences are that, being based on git, it isn't a filesystem in the sense of needing kernel support to gain access to the data (so it can be used on systems where you can only install userspace programs) and it allows programmatic decisions about what to snapshot, rather than recording everything into the snapshot. By David Tweed. It can be downloaded (at least currently) from chronoversion.tgz.
- Metastore (gitweb) by David Hardeman is a tool which allows the metadata to be stored in a separate file which can be stored along with the rest of the data in the repo (or separately). This is also useful for tripwire type checks and for other types of storage which drops some of the metadata (tar comes to mind).
- etckeeper (gitweb, announcement) by Joey Hess is a collection of tools to let /etc be stored in a git repository. It hooks into apt to automatically commit changes made to /etc during package upgrades. It used to use metastore but now uses a script to track file metadata that git does not normally support, but that is important for /etc, such as the permissions of /etc/shadow. It's quite modular and configurable, while also being simple to use if you understand the basics of working with git.
See also: IsiSetup
- git-cache-meta by jidanni is minimalistic approach to saving file ownership and permissions. It was submitted to `contrib/metadata` and can be found in git-cache-meta -- file owner and permissions caching, minimalist approach post at git mailing list.
- Flashbake is something between continuous, automated backup system and version control for writers. It is written in Python and uses Git for storage.
See also: Flashbake: Free version-control for writers using git by Cory Doctorow on BoingBoing.
- SparkleShare is a collaboration and sharing tool. It aims to be simple to use. Written in Mono/C#.
- Persy is a file synchronization and backup tool. Very focused on Ubuntu users.
- git-ftp.sh by René Moser  is a simple shell script for doing FTP the Git way. Use git-ftp.sh to upload only the Git tracked files to a FTP server, which have changed since the last upload. This saves time and bandwith. Even if you play with different branches, git-ftp.sh knows which files are different. No ordinary FTP client can do that.
- git-ftp () by Edward Z. Yang is a simple script written in python for uploading files in a Git repository via FTP, only transferring new files and removing old files.
- http://search.cpan.org/perldoc?git-svn-replay by Paul Miller is a Perl script that replays git commits into an svn repo for the purpose of showing changes in packages like Trac, which only understand svn natively, without the need for special plugins. It is probably not useful for anything besides listing changes for packages like Trac. GSR differs from git-svn, which is used for bi-directional commits. GSR works hard to preserve commit times and re-formats commit messages in a way that's nicer for Trac to display.
- git2rss by Bennett Todd is a Perl script to generate an RSS summary of a git repo. Currently to be used rather as example. Similar to darcs2rss.
- git2cl (gitweb) by Simon Josefsson is a Perl script to convert git logs to GNU ChangeLog format. The tool expects output from
git --pretty --numstat --summaryon standard input. Inspired by cvs2cl tool. References: ANNOUNCE: git2cl message on git mailing list.
git status-report(announcement, github) by Kate Rhodes (masukomi) is a script (in Ruby) that outputs a bullet list of all your commits for the past n days, or the commits of one of your fellow contributors from any number of branches and repos. Useful to put together a status report for boss.
git-completion.bash (in `contrib/completion`)
gitcompletion and generate-completions
- gitcompletion (git repository) by Ben Clifford is bash tab-completion for Git, gitk, Cogito (cg) and StGIT (stg). Cogito has the cogito bits of the above already included. There is also `generate-completions.sh` by Johannes Schindelin, available on git mailing list archive generated completions. Yet another StGIT completions by Paolo Giarrusso, aka Blaisorblade are available at Re: latest stg/git commandline completions code.
- remapper (gitweb, snapshots) by Al Viro, announced in Re: |RFC| Add "rcs format diff" support, is a tool to (re)map position (file name and line number) in one revision to corresponding position (file name and line number) in other revision. E.g. user sends report "linux-2.6.16 with configuration XYZZY fails to compile with:
arch/wii/kernel/l33t.c:42:parse error" and with the remap tool you can map the error report to the current commit's state, when that bit of code got moved around to `drivers/input/wii/l33tcontrol.c:31337`. It also already very useful for log comparison, with the noise due to line number changes excluded. Note that it's not just for build logs; the thing is useful for sparse logs, grep -n output, etc., etc.
See also: Kernel space: Buried in warnings article at LinuxWorld.com.
- In planning stage: an ArcheoloGIT tool to help reconstructing history from individual pieces, by Yann Dirson. Written in Perl. See Yann's Software page. (stalled)
- gitcharts (github) by Tomasz Dąbrowski (dabroz) is a small C# app that generates a graph for lines of code in a given git repository over time, and supports multiple projects in one repository.
- git-split by Jamey Sharp and Josh Triplett is a tool to split the history of a git repository by subdirectories and ranges, for example to break single monolithic repository imported from foreign SCM into smaller modules, easier to manage. Written in Python.
- reposurgeon () is as an editing tool for repository histories that will work with any version-control system supporting import and export of git fast-import streams. It supportes editing old comments and metadata, removing commits, fixing timezones, coalescing single-file commits, and other tricky operations. It can be very helpful in cleaning up cruft from repository conversions.
git_fast_filter and git-rewrite-commits
- git_fast_filter (gitorious) by Elijah Newren assists with quickly rewriting the history of a repository by making it easy to write scripts whose purpose is to serve as safe filters between fast-export and fast-import. git_fast_filter comes with example programs,and a basic test-suite.
See announcement on git mailing list and the following thread.
- git-rewrite-commits by Sven Verdoolaege is an alternate interface to git-filter-branch-like functionality (more similar to cg-admin-rewritehist from Cogito). It is available from git mailing list archives fro PATCH 0/6| Add git-rewrite-commits v2 thread.
- git timetrack is a new git command that allows management of project time dedication by attaching a time-spent note per commit with minimal extra effort for the developers, providing then advanced querying of the dedicated time.
- gitco by Simon Josefsson is a tiny shell script to remove unversioned files from git directories, similar to cvsutils 'cvsco' or subversion's svn-clean. It basically calls the standard git clean and git reset --hard commands.
- git-now is a new git command. It create temp commits. The commits' messages include time-stamp and diff.
- git-buildpackage is a tool for managing the debian packaging of an application in git. Documentation. There are other solutions and suggestions for debian packaging and git, for example see GitSrc.
- Gear is a tool for building RPM packages from git repositories.
- ./release.sh is a simple mechanism to create and tag release branches on a remote (centralized/blessed) git repository. Alpha-quality. Does not have any "server-side" hooks to actually do something with the releases or method to simplify tracking new release branches. (Do not confuse this with the "build recipes" in msysGit.)
- Ryppl is a a cross-platform package management system designed to accomodate both end-users and developers. Unlike a traditional package manager, which delivers binaries and/or a source snapshot, when ryppl downloads a package, it gives you a clone of a Git repository, with that package's entire development history. It also pulls down the correct versions of any repositories on which the requested repository depends. If you're an ordinary end-user, the fact that they are git repositories may be invisible to you, but if you're a developer, it means you're already prepared to work on the package, keep track of your changes, and submit them to the official maintainer(s).
- fedora-packager is a collection of tools for Fedora developers and includes fedpkg which is specifically for managing Fedora packages within Fedora's git based package repository. Fedpkg thinly wraps common git commands such as clone, commit, pull/push, etc...
- metagit is a tool for defining sets of git (or whatever scm) repositories and perform actions like clone/pull/push on them. It is possible to list repositories on a remote site, e.g. find all repositories in a directory via ssh. The original annoucement is here
- git-subtree (github) by Avery Pennarun is an experimental alternative to the git-submodule command, making it easier to use workflow which uses "subtree" merge strategy. The series introducing git-subtree was posted twice on git mailing list: here and here.
See also: A new alternative to git submodules: git subtree blog post (and comments).
- gitslave by Seth Robertson creates a group of related repositories all of which are concurrently developed on and on which all git operations should operate, so when you branch, each repository in the project is branched in turn. Similarly when you commit, push, pull, merge, tag, checkout, status, log, etc; each git command will run on the superproject and all slave repositories in turn.
- gitbuilder (github, demo) by Avery Pennarun is a set of relatively simple scripts for automatically building git-hosted project, optionally running unit tests, and reporting pass/fail results. In case of failures, it automatically uses git-bisect(1) to try to track down the first commit that started failing. It's also smart about branches; it knows how to build each commit only once, no matter how many branches include it, thus greatly simplifying future bisections.
See also: Announce: gitbuilder, an autobuilder for git-based projects post on git mailing list.
- bbchop (github) by Ealdwulf Wuffinga is a tool for bisecting on an intermittent bug, using Bayesian decision theory.
Nico Schottelius scripts
William Morgan git tools
- William's miscellaneous git tools include
git-wtf, a tool for working with feature branches (and its precursor
git-publish-branchto ease the task of "publishing" a branch (mostly superseded by
git push -u <origin> <branch>), and
git-rank-contributorswhich ranks all the contributors by the size of their diffs (as opposed to
git shortlog --numbered --summarywhich counts number of commits). By William Morgan and Jeff Balogh (Ruby)
- git-central (github) by Stephen Haberman is a small collections of hooks, scripts, and practices (documentation) for use with a centralized (non-distributed/corporate) git repo. Those include: svn-like revision numbers, combined diff-enabled commit emails, Hudson hooks, Trac hooks, branch locking, etc.
- git-diffall (github) by Tim Henigan is a script which performs a directory diff on a complete git repo using an external diff utility specified by the user. This script is compatible with all the forms used to specify a range of revisions to git diff.
git-edit-indexby Bert Wesarg is a tool which lets you edit files directly from the index, without changing the working copy. The temporary file sits next to the original file, and the index will be updated with the new content (including file mode).
git-buildby Bert Wesarg is a tool which records the output from an arbitrary command, but also the state of the working directory (including untracked but not ignored files) the start directory used and the exit status of the command by creating a commit of these and storing it in a special ref
refs/builds/default. The commit message is the command. The author date is set to the start date and the committer date to that of the end date of the command. The reflog is used to automatically discard old records. My main intention is to use this for builds, such as
./configure && make && make check. Thats why this is called
git-build, and also to have a command history by using the reflog. Dumping the environment at command start is on my TODO. Any other hints what should be recored is welcomed.
git-mklinksby Bert Wesarg is a tool which creates hard links for all files with the same content and file mode in the work tree.
- Aliases - for list of handy tools implemented as git aliases.
- List of useful git tools question on StackOverflow.