GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • gitjoin
  • GitHub
  • Releases
  • Issues
  • Built with Hugo

This view

  • Original page
  • New address

GeezerVison is showing gitjoin.com — About gitjoin

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.

$ go install github.com/bep/gitjoin@latest
View on GitHub
workspace
  1. ~/work/
  2. go/
  3. AGENTS.md
  4. apps/
  5. gitjoin.txt
  6. gitjoin/cloned
  7. grrep/cloned
  8. s3deploy/cloned
  9. libs/
  10. gitjoin.txt
  11. helpers/cloned
  12. godartsass/cloned
  13. sites/
  14. AGENTS.md
  15. gitjoin.txt
  16. gitjoin.com/cloned
  17. grrep.com/cloned
$ gitjoin
Cloned: 7 repos
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 it

    Stash, 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.
AspectGit submodulesgitjoin
RelationshipPinned dependenciesIndependent peers
A child repo changesCommit in the parentNothing to commit
CheckoutDetached HEAD at a pinned commitDefault branch, kept up to date
Add or remove a repogit submodule add / deinitEdit one line
Built forReproducible, pinned treesA workspace you actively develop
Get started

Join your repos.

$ go install github.com/bep/gitjoin@latest
bep/gitjoin
Made by

Bjørn Erik Pedersen

Lead developer of Hugo, and keeper of more Git repositories than anyone should clone by hand.

bep @bepsays
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.