Skip to content

gitpython-developers/GitPython

Repository files navigation

==========
GitPython
==========

GitPython is a python library used to interact with Git repositories.

GitPython is a port of the grit_ library in Ruby created by 
Tom Preston-Werner and Chris Wanstrath.

.. _grit: http://grit.rubyforge.org

The ``method_missing`` stuff was `taken from this blog post`_

.. _taken from this blog post: http://blog.iffy.us/?p=43

REQUIREMENTS
============

* Git_ tested with 1.5.3.7
* `Python Nose`_ - used for running the tests  

.. _Git: http://git.or.cz/
.. _Python Nose: http://code.google.com/p/python-nose/

INSTALL
=======

	python setup.py install

SOURCE
======

GitPython's git repo is available on Gitorious, which can be browsed at:

http://gitorious.org/projects/git-python

and cloned from:

git://gitorious.org/projects/git-python.git

USAGE
=====

GitPython provides object model access to your git repository. Once you have
created a repository object, you can traverse it to find parent commit(s),
trees, blobs, etc.

Initialize a Repo object
************************

The first step is to create a `Repo` object to represent your repository.

	>>> from git_python import *
	>>> repo = Repo.new("/Users/mtrier/Development/git-python")
  
In the above example, the directory `/Users/mtrier/Development/git-python` is my working
repo and contains the `.git` directory. You can also initialize GitPython with a 
bare repo.

	>>> repo = Repo.init_bare("/var/git/git-python.git")

Getting a list of commits
*************************

From the `Repo` object, you can get a list of `Commit`
objects.

	>>> repo.commits()
	[<GitPython.Commit "207c0c4418115df0d30820ab1a9acd2ea4bf4431">, 
	 <GitPython.Commit "a91c45eee0b41bf3cdaad3418ca3850664c4a4b4">, 
	 <GitPython.Commit "e17c7e11aed9e94d2159e549a99b966912ce1091">, 
	 <GitPython.Commit "bd795df2d0e07d10e0298670005c0e9d9a5ed867">]

Called without arguments, `Repo.commits` returns a list of up to ten commits
reachable by the master branch (starting at the latest commit). You can ask
for commits beginning at a different branch, commit, tag, etc.

	>>> repo.commits('mybranch')
	>>> repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
	>>> repo.commits('v0.1')

You can specify the maximum number of commits to return.

	>>> repo.commits('master', 100)
  
If you need paging, you can specify a number of commits to skip.

	>>> repo.commits('master', 10, 20)

The above will return commits 21-30 from the commit list.
        
The Commit object
*****************

Commit objects contain information about a specific commit.

	>>> head = repo.commits()[0]

	>>> head.id
	'207c0c4418115df0d30820ab1a9acd2ea4bf4431'

	>>> head.parents
	[<GitPython.Commit "a91c45eee0b41bf3cdaad3418ca3850664c4a4b4">]
	
	>>> head.tree
	<GitPython.Tree "563413aedbeda425d8d9dcbb744247d0c3e8a0ac">
	
	>>> head.author
	<GitPython.Actor "Michael Trier <[email protected]>">
	
	>>> head.authored_date
	(2008, 5, 7, 5, 0, 56, 2, 128, 0)
	
	>>> head.committer
	<GitPython.Actor "Michael Trier <[email protected]>">
	
	>>> head.committed_date
	(2008, 5, 7, 5, 0, 56, 2, 128, 0)
	
	>>> head.message
	'cleaned up a lot of test information. Fixed escaping so it works with subprocess.'


You can traverse a commit's ancestry by chaining calls to ``parents``.

	>>> repo.commits()[0].parents[0].parents[0].parents[0]
  
The above corresponds to ``master^^^`` or ``master~3`` in git parlance.

The Tree object
***************

A tree recorda pointers to the contents of a directory. Let's say you want
the root tree of the latest commit on the master branch.

	>>> tree = repo.commits()[0].tree
	<GitPython.Tree "a006b5b1a8115185a228b7514cdcd46fed90dc92">

	>>> tree.id
	'a006b5b1a8115185a228b7514cdcd46fed90dc92'
  
Once you have a tree, you can get the contents.

	>>> contents = tree.contents
	[<GitPython.Blob "6a91a439ea968bf2f5ce8bb1cd8ddf5bf2cad6c7">, 
	 <GitPython.Blob "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391">, 
	 <GitPython.Tree "eaa0090ec96b054e425603480519e7cf587adfc3">, 
	 <GitPython.Blob "980e72ae16b5378009ba5dfd6772b59fe7ccd2df">]

This tree contains three ``Blob`` objects and one ``Tree`` object. The trees are
subdirectories and the blobs are files. Trees below the root have additional
attributes.

	>>> contents = tree.contents[-2]
	<GitPython.Tree "e5445b9db4a9f08d5b4de4e29e61dffda2f386ba">
	
	>>> contents.name
	'test'
	
	>>> contents.mode
	'040000'
	
There is a convenience method that allows you to get a named sub-object
from a tree.

	>>> tree/"lib"
	<GitPython.Tree "c1c7214dde86f76bc3e18806ac1f47c38b2b7a30">
  
You can also get a tree directly from the repo if you know its name.

	>>> repo.tree()
	<GitPython.Tree "master">
	
	>>> repo.tree("c1c7214dde86f76bc3e18806ac1f47c38b2b7a30")
	<GitPython.Tree "c1c7214dde86f76bc3e18806ac1f47c38b2b7a30">

The Blob object
***************

A blob represents a file. Trees often contain blobs.

	>>> blob = tree.contents[-1]
	<GitPython.Blob "b19574431a073333ea09346eafd64e7b1908ef49">

A blob has certain attributes.

	>>> blob.name
	'urls.py'
	
	>>> blob.mode
	'100644'

	>>> blob.mime_type
	'text/x-python'
	
	>>> len(blob)
	415
  
You can get the data of a blob as a string.

	>>> blob.data
	"from django.conf.urls.defaults import *\nfrom django.conf..."

You can also get a blob directly from the repo if you know its name.

	>>> repo.blob("b19574431a073333ea09346eafd64e7b1908ef49")
	<GitPython.Blob "b19574431a073333ea09346eafd64e7b1908ef49">

LICENSE
=======

New BSD License.  See the LICENSE file.