[ADD][SCRIPT] Git fast forward command
This script can be used to fast-forward all local branches tracking remote branches instead of having to check them out manually to `git pull`.
This commit is contained in:
parent
07211d4093
commit
63da4ac6e7
68
scripts/git-ffw
Executable file
68
scripts/git-ffw
Executable file
|
@ -0,0 +1,68 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Adapted from <https://stackoverflow.com/questions/4318161>
|
||||
|
||||
SHOW_UPDATE=0
|
||||
|
||||
usage() {
|
||||
echo "usage: git ffwd [remote]..."
|
||||
echo ""
|
||||
echo "Fast forward all local branches tracking remote branches"
|
||||
echo "If given a list of remote, will update branches tracking those"
|
||||
echo "Otherwise will update all remotes"
|
||||
}
|
||||
|
||||
ffwd() {
|
||||
CLB="$(git rev-parse --abbrev-ref HEAD)"
|
||||
|
||||
for REMOTE in "$@"; do
|
||||
git remote update "$REMOTE"
|
||||
while read -r RB LB; do
|
||||
ARB="refs/remotes/$REMOTE/$RB"
|
||||
ALB="refs/heads/$LB"
|
||||
NBEHIND=$(( $(git rev-list --count "$ALB..$ARB" 2>/dev/null) +0))
|
||||
NAHEAD=$(( $(git rev-list --count "$ARB..$ALB" 2>/dev/null) +0))
|
||||
if [ "$NBEHIND" -gt 0 ]; then
|
||||
if [ "$NAHEAD" -gt 0 ]; then
|
||||
echo " branch $LB is $NBEHIND commit(s) behind and $NAHEAD commit(s) ahead of $REMOTE/$RB. could not be fast-forwarded"
|
||||
elif [ "$LB" = "$CLB" ]; then
|
||||
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. fast-forward merge"
|
||||
git merge --ff -q "$ARB" # Can't reset the current branch
|
||||
else
|
||||
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. resetting local branch to remote"
|
||||
git branch -f "$LB" -t "$ARB" >/dev/null
|
||||
fi
|
||||
elif [ "$SHOW_UPDATE" -eq 1 ]; then
|
||||
echo " nothing to do for branch $LB"
|
||||
fi
|
||||
done <<< "$(git remote show "$REMOTE" -n |
|
||||
awk '/merges with remote/{print $5" "$1}')"
|
||||
done
|
||||
}
|
||||
|
||||
REMOTES=()
|
||||
if [ $# -gt 0 ]; then
|
||||
# Check for help flag
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--help|-h)
|
||||
usage
|
||||
exit 0
|
||||
;;
|
||||
--show-update|-s)
|
||||
SHOW_UPDATE=1
|
||||
;;
|
||||
*)
|
||||
REMOTES+=("$arg")
|
||||
;;
|
||||
esac
|
||||
done
|
||||
fi
|
||||
|
||||
if [ ${#REMOTE[@]} -gt 0 ]; then
|
||||
# Call ffwd with all given remotes
|
||||
ffwd "${REMOTE[@]}"
|
||||
else
|
||||
# Call ffwd with all remotes in the repository
|
||||
ffwd "$(git remote)"
|
||||
fi
|
Loading…
Reference in a new issue