Skip to content

Instantly share code, notes, and snippets.

@arnauldvm
Last active January 27, 2024 10:00
Show Gist options
  • Save arnauldvm/dcec7ee043c25dce30dbae1b576f2102 to your computer and use it in GitHub Desktop.
Save arnauldvm/dcec7ee043c25dce30dbae1b576f2102 to your computer and use it in GitHub Desktop.
Git sync all local tracking branches with remotes
[alias]
tracking = "!f() { git for-each-ref --format '%(refname:short):%(upstream:short)' 'refs/heads' | egrep -v ':$'; }; f"
is-clean-workdir = "!f() { git diff --stat --exit-code || { echo \"Workdir dirty\"; exit 1; }; }; f"
is-clean-index = "!f() { git diff --stat --cached --exit-code || { echo \"Index dirty\"; exit 2; }; }; f"
is-clean = "!f() { git is-clean-workdir && git is-clean-index; }; f"
co-merge = "!f() { local=\"$1\"; remote=\"$2\"; git checkout \"$local\"; git merge --ff-only \"$remote\"; }; f"
current-branch = rev-parse --abbrev-ref HEAD
sync = "!f() { git is-clean || { echo Aborting sync.; exit 1; }; current=$(git current-branch); git fetch --all; git tracking | while IFS=: read local remote; do echo \"Merging $local with $remote\"; git co-merge \"$local\" \"$remote\"; done 3>&1 1>&2 2>&3 | egrep -i --color 'fatal|$' 3>&1 1>&2 2>&3; git checkout \"$current\"; }; f"
@a7madgamal
Copy link

thanks for sharing!

@a7madgamal
Copy link

I used your great script and added an automated stash before and after because I'm more lazy than you :D
https://gist.github.com/a7madgamal/f581763eaff88dd1d4ddc044cd4e6807

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment