Dealing With Multiple Git Repositories
Today, I'll share my repositories maintenance solution - gitr, a small script to recursively call Git in sub-folders to let you manage multiple repositories with ease.
Join the DZone community and get the full member experience.
Join For FreeLet’s talk about git repositories! I don’t want to get into the mono versus multi-repository discussion. Some advocate for mono-repositories and others are against them.
But no matter which side you’re on, chances are you contribute to repositories parts of different organizations: personal projects, professionals, or various open-source ones. In this case, it is for sure not possible to use a mono-repository approach.
Hence, I thought of a solution to help me keep some repositories up-to-date with their remotes or ensure I did push everything. No need for fancy things, a small shell script can do the work.
Please welcome gitr! gitr is an alias in my fish.config/.bashrc for a simple shell script I wrote.
You Said gitr, What’s That?
gitr stands for git recurse. It expects a git command and will execute it in every subdirectory that is a git repository. It is very basic and only tailored to my needs. So don’t expect it to handle symbolic links or git submodules.
Usage
Let’s assume you are in a directory and have the following git repositories under it:
- oss/jreleaser
- oss/picocli
- personal/xxx.github.io
- personal/website
Let’s now assume you want to fetch the different remotes to prepare for offline work. git has a command for that, git fetch --all
. with gitr, all you need to do is replace git
with gitr
.
Hence: gitr fetch --all
$ gitr fetch --all
## oss/jreleaser
Fetching origin
## oss/picocli
Fetching origin
Fetching upstream
## personal/xxx.github.io
Fetching origin
## personal/website
Fetching origin
Want to check if you committed and pushed everything? gitr status
got you covered!
$ gitr status
...
## personal/xxx.github.io
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
## personal/website
On branch main
Your branch is up to date with 'origin/main'.
Untracked files:
(use "git add <file>..." to include in what will be committed)
content/posts/dealing-multiple-git-repositories.md
nothing added to commit but untracked files present (use "git add" to track)
Obviously, I need to finish the content/posts/dealing-multiple-git-repositories.md
article and publish it.
Summary
gitr is a very small script that can help manage multiple git repositories by calling git itself in every repository. You get all the power of git fetch
, pull
, status
.
One last thing, be careful with it and think twice before calling gitr reset --hard origin/main
or gitr commit -m "xxx"
.
May it be helpful to you!
The script can be downloaded here or you can see the source below:
#!/bin/sh
set -eu
recurse() {
(
cd "$1"
shift
if [ -d ".git" ]; then
# If current directory is a git directory,
# call the git command
printf "\033[1;34m## $(pwd)\033[0m\n"
git "$@"
printf "\n"
else
# Otherwise, recurse in sub-directories
for d in ./*; do
if [ -d "$d" ]; then
recurse "$d" "$@"
fi
done
fi
)
}
recurse "." "$@"
Published at DZone with permission of Loïc Rouchon. See the original article here.
Opinions expressed by DZone contributors are their own.
Comments