Skip to content

Contributing

Both implementations are maintained on GitHub, and both take patches.

Reporting a bug

Include the command you ran, the output of git ftp push -vv with credentials removed, the version (git ftp --version) and the server software if you know it. FTP servers differ wildly in what they accept, so naming yours often solves the riddle straight away.

Working on the Python implementation

git clone https://github.com/git-ftp/git-ftp-py.git
cd git-ftp-py
uv sync --all-groups
make lint typecheck test     # ruff, mypy, pytest
make test-docker             # against pure-ftpd containers, Linux only

The test suite starts real FTP, FTPS and SFTP servers in-process, so most changes can be covered by a test without any server of your own. The manual page source is docs/git-ftp.1.md.

Anything that changes behaviour compared to the Bash original belongs in COMPATIBILITY.md — that file is the contract between the two implementations and is published here.

Working on the Bash implementation

git clone https://github.com/git-ftp/git-ftp.git
cd git-ftp
make test

The core functionality is unit tested with shunit2; the tests are in tests/. The manual page source is man/git-ftp.1.md.

Add yourself to the AUTHORS file with your first patch.

This website

The site is built with MkDocs and Material for MkDocs from the git-ftp.github.io repository and published by GitHub Pages on every push.

git clone https://github.com/git-ftp/git-ftp.github.io.git
cd git-ftp.github.io
uv sync
uv run mkdocs serve

The three reference pages are generated from the tool repositories by scripts/sync_upstream_docs.py and refreshed at build time — fix a manual page upstream, not here. Everything else under docs/ is written by hand; there is an link at the top of every page that takes you straight to its source.