gpt4 book ai didi

git - 调整脚本以 pull 所有远程分支

转载 作者:太空狗 更新时间:2023-10-29 13:42:48 25 4
gpt4 key购买 nike

我已经开始使用另一个 thread 中发布的一个脚本:

#!/bin/bash

main() {
REMOTES="$@";
if [ -z "$REMOTES" ]; then
REMOTES=$(git remote);
fi
REMOTES=$(echo "$REMOTES" | xargs -n1 echo)
CLB=$(git branch -l|awk '/^\*/{print $2}');
echo "$REMOTES" | while read REMOTE; do
git remote update $REMOTE
git remote show $REMOTE -n \
| awk '/merges with remote/{print $5" "$1}' \
| while read line; do
RB=$(echo "$line"|cut -f1 -d" ");
ARB="refs/remotes/$REMOTE/$RB";
LB=$(echo "$line"|cut -f2 -d" ");
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 -q $ARB;
else
echo " branch $LB was $NBEHIND commit(s) behind of $REMOTE/$RB. reseting local branch to remote";
git branch -l -f $LB -t $ARB >/dev/null;
fi
fi
done
done
}

main $@

到目前为止效果很好,但我想知道如何调整它以 pull 所有分支,由于某种原因它不会 pull 某些本地分支。

第一个例子:我有 4 个本地分支落后,master 是当前分支,在运行这个脚本后,一些相对于远程落后的分支 (4) 被 pull 出,但我仍然可以看到 Remote 后面的 master 分支如下图:

enter image description here

第二个例子:在运行脚本之前,我得到了这个,后面有 2 个本地分支,当前的分支(发布)没问题:

enter image description here

我运行脚本并得到了这个:

enter image description here

那么,我如何调整脚本以 pull “所有”本地分支?

最佳答案

另外to my previous answer ,我想补充一点,你的脚本应该只将给定分支的 merge 或重置限制到它的上游分支。
因此我使用了 %(upstream:track)

这是我刚刚测试过的脚本:

  • git 版本 2.11.0.windows.1
  • SourceTree 1.9.10.0

即:

#!/bin/bash

branches=$(git for-each-ref --format="%(refname) %(upstream) %(upstream:track)" refs/heads)

echo "${branches}"
branch_checkedout=$(cat .git/HEAD|cut -f2 -d" ")
echo branch checked out: "${branch_checkedout}"

while read -r branch_line; do
ahead=0
behind=0
branch_local=$(echo ${branch_line}|cut -f1 -d" ")
branch_remote=$(echo ${branch_line}|cut -f2 -d" ")
echo ${branch_line} | grep "ahead" >/dev/null && ahead=1
echo ${branch_line} | grep "behind" >/dev/null && behind=1
NAHEAD=$(( $(git rev-list --count ${branch_remote}..${branch_local} 2>/dev/null) +0))
NBEHIND=$(( $(git rev-list --count ${branch_local}..${branch_remote} 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 [ "${branch_local}" = "${branch_checkedout}" ]; then
echo " branch ${branch_local} was $NBEHIND commit(s) behind of ${branch_remote}. fast-forward merge";
echo "git merge -q ${branch_remote}"
git merge -q ${branch_remote};
else
echo " branch ${branch_local} was $NBEHIND commit(s) behind of ${branch_remote}. reseting local branch to remote";
bl=${branch_local#*/}
bl=${bl#*/}
echo "git branch -l -f ${bl} -t ${branch_remote}"
git branch -l -f ${bl} -t ${branch_remote} >/dev/null;
fi
fi
done <<< "${branches}"

注意使用:

  • branches=$(git for-each-ref --format="%(refname) %(upstream) %(upstream:track)"refs/heads)
    获取完整的上游分支名称和领先/落后状态
  • branch_checkedout=$(cat .git/HEAD|cut -f2 -d"") 获取 check out 分支的名称
  • while read -r branch_line;做 只在有上游的分支上循环,而不是“所有的远程”(可能包括也可能不包括给定的分支)

关于git - 调整脚本以 pull 所有远程分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40490856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com