Top Related Projects
A cross-platform, linkable library implementation of Git that you can use in your application.
GitPython is a python library used to interact with Git repositories.
Project has been moved to: https://github.com/go-git/go-git
Native Node bindings to Git.
Python bindings for libgit2
Quick Overview
Dulwich is a pure-Python implementation of the Git version control system. It provides a set of Python libraries for interacting with Git repositories, allowing developers to work with Git objects, repositories, and protocols without relying on external Git commands.
Pros
- Pure Python implementation, making it easy to install and use across different platforms
- Provides low-level access to Git internals, enabling advanced Git operations and custom workflows
- Can be used as a library in other Python projects or as a standalone tool
- Actively maintained and regularly updated
Cons
- May be slower than native Git implementations for large repositories or complex operations
- Not a complete replacement for the Git command-line tool, as some advanced features might be missing
- Learning curve can be steep for developers not familiar with Git internals
- Documentation could be more comprehensive for some advanced use cases
Code Examples
- Creating a new repository:
from dulwich.repo import Repo
repo = Repo.init("my_new_repo")
- Adding and committing a file:
from dulwich.repo import Repo
from dulwich.objects import Blob
repo = Repo("my_repo")
blob = Blob.from_string(b"Hello, Dulwich!")
tree = repo.stage(b"example.txt", blob.id)
commit = repo.do_commit(b"Add example.txt", tree=tree)
- Cloning a repository:
from dulwich.porcelain import clone
clone("https://github.com/example/repo.git", "local_repo")
- Listing commits:
from dulwich.repo import Repo
repo = Repo("my_repo")
for entry in repo.get_walker():
print(f"Commit: {entry.commit.id.decode()}")
print(f"Message: {entry.commit.message.decode()}")
print("---")
Getting Started
To get started with Dulwich, first install it using pip:
pip install dulwich
Then, you can use Dulwich in your Python scripts:
from dulwich.repo import Repo
from dulwich.objects import Blob
# Create a new repository
repo = Repo.init("my_project")
# Create a file and commit it
blob = Blob.from_string(b"Hello, Dulwich!")
tree = repo.stage(b"README.md", blob.id)
commit = repo.do_commit(b"Initial commit", tree=tree)
print(f"Created commit: {commit.decode()}")
This example creates a new repository, adds a README.md file, and makes an initial commit.
Competitor Comparisons
A cross-platform, linkable library implementation of Git that you can use in your application.
Pros of libgit2
- Written in C, offering better performance and lower-level system access
- Extensive language bindings, supporting integration with many programming languages
- More comprehensive Git functionality, including advanced features like submodules
Cons of libgit2
- More complex to set up and use, especially for Python developers
- Requires compilation and linking, which can be challenging on some platforms
- Larger codebase and potentially steeper learning curve
Code Comparison
Dulwich (Python):
from dulwich.repo import Repo
repo = Repo("path/to/repo")
commit = repo[repo.head()]
print(commit.message)
libgit2 (C):
git_repository *repo = NULL;
git_commit *commit = NULL;
git_repository_open(&repo, "path/to/repo");
git_reference_name_to_id(&oid, repo, "HEAD");
git_commit_lookup(&commit, repo, &oid);
printf("%s\n", git_commit_message(commit));
Summary
Dulwich is a pure Python implementation of Git, making it easier to use for Python developers and requiring no compilation. It's lightweight and portable but may lack some advanced features. libgit2 offers better performance and more comprehensive Git functionality but requires more setup and has a steeper learning curve. The choice between them depends on the specific project requirements and the developer's preferred language and environment.
GitPython is a python library used to interact with Git repositories.
Pros of GitPython
- More comprehensive Git functionality, including advanced operations like rebasing and cherry-picking
- Better documentation and more extensive examples
- Larger community and more frequent updates
Cons of GitPython
- Slower performance, especially for large repositories
- Requires a local Git installation, which can be a limitation in some environments
- More complex API, potentially steeper learning curve for beginners
Code Comparison
GitPython:
from git import Repo
repo = Repo("/path/to/repo")
commit = repo.head.commit
print(commit.message)
Dulwich:
from dulwich.repo import Repo
repo = Repo("/path/to/repo")
commit = repo[repo.head()]
print(commit.message.decode('utf-8'))
Both libraries allow basic Git operations, but GitPython provides a more Pythonic interface, while Dulwich offers lower-level access to Git internals. GitPython's approach is generally more intuitive for Python developers, but Dulwich's implementation can be more efficient in certain scenarios.
Project has been moved to: https://github.com/go-git/go-git
Pros of go-git
- Written in Go, offering better performance and concurrency support
- Provides a more extensive API for Git operations
- Easier integration with Go-based projects and microservices
Cons of go-git
- Less mature and potentially less stable than Dulwich
- Smaller community and fewer contributors compared to Dulwich
- May lack some advanced features present in Dulwich
Code Comparison
Dulwich (Python):
from dulwich import porcelain
repo = porcelain.init("my_repo")
porcelain.add(repo, "file.txt")
porcelain.commit(repo, message="Initial commit")
go-git (Go):
import "github.com/go-git/go-git/v5"
r, _ := git.PlainInit("my_repo", false)
w, _ := r.Worktree()
w.Add("file.txt")
w.Commit("Initial commit", &git.CommitOptions{})
Both libraries provide similar functionality for basic Git operations, but their syntax and usage differ due to the languages they're written in. go-git's API is more object-oriented, while Dulwich follows a more procedural approach.
Native Node bindings to Git.
Pros of nodegit
- Written in C++ with Node.js bindings, potentially offering better performance for Node.js applications
- Provides a more comprehensive API, closely mirroring libgit2 functionality
- Actively maintained with frequent updates and a larger community
Cons of nodegit
- Larger package size and more complex installation due to C++ dependencies
- Limited to Node.js environments, less portable across different platforms
- Steeper learning curve for developers not familiar with libgit2
Code Comparison
nodegit:
const Git = require('nodegit');
Git.Repository.open(repoPath)
.then(repo => repo.getHeadCommit())
.then(commit => console.log(commit.message()));
dulwich:
from dulwich.repo import Repo
repo = Repo(repo_path)
commit = repo[repo.head()]
print(commit.message)
Summary
nodegit is a powerful Git implementation for Node.js applications, offering high performance and a comprehensive API. However, it comes with a larger footprint and is limited to Node.js environments. Dulwich, on the other hand, is a pure Python implementation, making it more portable and easier to install, but potentially slower for large-scale operations. The choice between the two depends on the specific requirements of your project and the development environment you're working in.
Python bindings for libgit2
Pros of pygit2
- Higher performance due to C implementation
- Comprehensive Git functionality, including advanced features
- Robust and well-maintained, with regular updates
Cons of pygit2
- Requires libgit2 installation, which can be complex
- Steeper learning curve due to more extensive API
Code comparison
pygit2
from pygit2 import Repository
repo = Repository('path/to/repo')
commit = repo.revparse_single('HEAD')
print(commit.message)
dulwich
from dulwich.repo import Repo
repo = Repo('path/to/repo')
commit = repo[repo.head()]
print(commit.message)
Key differences
- Dulwich is pure Python, making it easier to install and use in Python-only environments
- pygit2 offers better performance for large repositories and complex operations
- Dulwich has a simpler API, making it more accessible for basic Git operations
- pygit2 provides more advanced Git functionality, suitable for complex use cases
Both libraries are actively maintained and have their strengths. Choose pygit2 for performance and advanced features, or Dulwich for simplicity and pure Python implementation.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Dulwich
This is the Dulwich project.
It aims to provide an interface to git repos (both local and remote) that doesn't call out to git directly but instead uses pure Python.
Main website: https://www.dulwich.io/
License: Apache License, version 2 or GNU General Public License, version 2 or later.
The project is named after the part of London that Mr. and Mrs. Git live in in the particular Monty Python sketch.
Installation
By default, Dulwich' setup.py will attempt to build and install the optional Rust extensions. The reason for this is that they significantly improve the performance since some low-level operations that are executed often are much slower in CPython.
If you don't want to install the Rust bindings, specify the --pure argument to setup.py::
$ python setup.py --pure install
or if you are installing from pip::
$ pip install --no-binary dulwich dulwich --config-settings "--build-option=--pure"
Note that you can also specify --build-option in a
requirements.txt <https://pip.pypa.io/en/stable/reference/requirement-specifiers/>
_
file, e.g. like this::
dulwich --config-settings "--build-option=--pure"
Getting started
Dulwich comes with both a lower-level API and higher-level plumbing ("porcelain").
For example, to use the lower level API to access the commit message of the last commit::
>>> from dulwich.repo import Repo
>>> r = Repo('.')
>>> r.head()
'57fbe010446356833a6ad1600059d80b1e731e15'
>>> c = r[r.head()]
>>> c
<Commit 015fc1267258458901a94d228e39f0a378370466>
>>> c.message
'Add note about encoding.\n'
And to print it using porcelain::
>>> from dulwich import porcelain
>>> porcelain.log('.', max_entries=1)
--------------------------------------------------
commit: 57fbe010446356833a6ad1600059d80b1e731e15
Author: Jelmer Vernooij <jelmer@jelmer.uk>
Date: Sat Apr 29 2017 23:57:34 +0000
Add note about encoding.
Further documentation
The dulwich documentation can be found in docs/ and built by running make doc
. It can also be found on the web <https://www.dulwich.io/docs/>
_.
Help
There is a #dulwich IRC channel on the OFTC <https://www.oftc.net/>
, and
a dulwich-discuss <https://groups.google.com/forum/#!forum/dulwich-discuss>
mailing list.
Contributing
For a full list of contributors, see the git logs or AUTHORS <AUTHORS>
_.
If you'd like to contribute to Dulwich, see the CONTRIBUTING <CONTRIBUTING.rst>
_
file and list of open issues <https://github.com/dulwich/dulwich/issues>
_.
Supported versions of Python
At the moment, Dulwich supports (and is tested on) CPython 3.6 and later and Pypy.
Top Related Projects
A cross-platform, linkable library implementation of Git that you can use in your application.
GitPython is a python library used to interact with Git repositories.
Project has been moved to: https://github.com/go-git/go-git
Native Node bindings to Git.
Python bindings for libgit2
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot