v0.4.0 · Open source · Written in Go
Virtual monorepo made simple. Keep every repository where it is. List them in a plain-text
gitjoin.txt, run one command, and work across all of
them as one tree.
workspace
~/work/
go/
AGENTS.md
apps/
gitjoin.txt
gitjoin/ cloned
grrep/ cloned
s3deploy/ cloned
libs/
gitjoin.txt
helpers/ cloned
godartsass/ cloned
sites/
AGENTS.md
gitjoin.txt
gitjoin.com/ cloned
grrep.com/ cloned 1
plain-text manifest format
2
flags, --force and --quiet
0
commits in the parent repo
4+
repos synced in parallel
go/apps/gitjoin.txt
# Lines starting with # are comments.
github.com/bep/gitjoin
github.com/bep/grrep
github.com/bep/s3deploy zsh
$ gitjoin
Updated: 2 repos
- go/apps/grrep (pulled)
- sites/gitjoin.com (pulled)
Cloned: 2 repos
- go/libs/godartsass
- go/libs/helpers
Removed: 2 repos
- go/apps/oldtool
- sites/oldsite.com
Skipped (uncommitted changes): 2 repos
- go/apps/s3deploy (2 modified)
- sites/grrep.com (1 added) go/apps/.gitignore
/public/
# Managed by gitjoin - do not edit this section
/gitjoin/
/grrep/
/s3deploy/
# End gitjoin managed section Plain-text manifest One repository per line, # for comments. Adding or removing a repo is a one-line diff, not a Git operation.
Clone, pull, prune One command brings the tree in line with the manifests. Only repos gitjoin cloned are ever removed.
Safe by default Repos with uncommitted changes or on a feature branch are skipped and reported, never touched.
--force when you mean itStash, switch to the default branch, pull, unstash. If the unstash conflicts, the stash is left intact.
Nested and partial gitjoin.txt files are found recursively. Start in any subdirectory to sync only that subtree.
Shared context Drop an AGENTS.md or firstup.env next to a group of repos and it applies to all of them, outside their history.
Peers, not pins Every repo stays on its default branch and remains fully independent. No detached HEADs.
Parallel Repos are synced concurrently, at least four at a time, or one per CPU core if you have more.
→ Share one AGENTS.md across every Go repository. → Share API keys across all AWS applications with firstupdotenv . → Update dependencies in all Go repos in one go. → Prompt an AI agent to make changes across repos and open the PRs. → Search everything with grrep , which understands gitjoin boundaries. Aspect Git submodules gitjoin Relationship Pinned dependencies Independent peers A child repo changes Commit in the parent Nothing to commit Checkout Detached HEAD at a pinned commit Default branch, kept up to date Add or remove a repo git submodule add / deinit Edit one line Built for Reproducible, pinned trees A workspace you actively develop
Get started Join your repos.