A tool to dump a git repository from a website.
This can be installed easily with uv:
uv tool install git-dumperAlternatively, you can install it via pip. Note that modern Python environments may require you to use a virtual environment or the --user flag to avoid conflicts:
# Using a virtual environment
python3 -m venv .venv
source .venv/bin/activate
pip install git-dumper
# OR using the --user flag
pip install --user git-dumperusage: git-dumper [options] URL DIR
Dump a git repository from a website.
positional arguments:
URL url
DIR output directory
optional arguments:
-h, --help show this help message and exit
--proxy PROXY use the specified proxy
-X METHOD, --method METHOD
HTTP method to use for all requests (e.g. GET, POST)
--any-status accept any HTTP status code as long as the body is
non-empty and not HTML (e.g. targets that return 500
but still serve content)
-j JOBS, --jobs JOBS number of simultaneous requests
-r RETRY, --retry RETRY
number of request attempts before giving up
-t TIMEOUT, --timeout TIMEOUT
maximum time in seconds before giving up
-u USER_AGENT, --user-agent USER_AGENT
user-agent to use for requests
-H HEADER, --header HEADER
additional http headers, e.g `NAME=VALUE`
--client-cert-p12 CLIENT_CERT_P12
client certificate in PKCS#12 format
--client-cert-p12-password CLIENT_CERT_P12_PASSWORD
password for the client certificate
-b BRANCH, --branch BRANCH
additional branch name to check for (repeatable)
git-dumper http://website.com/.git ~/website
Some targets don't serve the raw .git files in the usual way. The following
arguments help with those cases.
Some targets only serve the raw .git files over a non-GET method. Use
-X/--method to change the HTTP method used for every request:
git-dumper -X POST http://website.com/.git ~/website
Some targets respond with a non-200 status (e.g. 500) while still returning
the real content. Use --any-status to accept any status code as long as the
body is non-empty and not HTML:
git-dumper --any-status http://website.com/.git ~/website
Use this software at your own risk!
You should know that if the repository you are downloading is controlled by an attacker, this could lead to remote code execution on your machine.
Simply install the dependencies with pip:
pip install -r requirements.txt
Then, simply use:
./git_dumper.py http://website.com/.git ~/website
The tool will first check if directory listing is available. If it is, then it will just recursively download the .git directory (what you would do with wget).
If directory listing is not available, it will use several methods to find as many files as possible. Step by step, git-dumper will:
- Fetch all common files (
.gitignore,.git/HEAD,.git/index, etc.); - Find as many refs as possible (such as
refs/heads/master,refs/remotes/origin/HEAD, etc.) by analyzing.git/HEAD,.git/logs/HEAD,.git/config,.git/packed-refsand so on; - Find as many objects (sha1) as possible by analyzing
.git/packed-refs,.git/index,.git/refs/*and.git/logs/*; - Fetch all objects recursively, analyzing each commits to find their parents;
- Run
git checkout .to recover the current working tree