如何使用bash脚本遍历所有git分支

如何使用bash脚本遍历我的存储库中的所有本地分支。
我需要迭代和检查是有分支和一些远程分支之间有任何区别。
例如,

for branch in $(git branch); 
do
    git log --oneline $branch ^remotes/origin/master;
done

我需要做一些像上面给出的事情,但我面临的问题是$(git branch)给我的存储库文件夹中的文件夹以及存储库中存在的分支。

这是正确的方法来解决这个问题吗?还是有另外一种方法呢?

谢谢

在编写脚本时不应该使用git branch。 Git提供了明确设计用于脚本的“plumbing” interface(许多当前和历史的正常Git命令(添加,检出,合并等)的实现使用同一个接口)。

你想要的管道命令是git for-each-ref:

git for-each-ref --shell \
  --format='git log --oneline %(refname) ^origin/master' \
  refs/heads/

注意:除非有其他引用,导致origin / master匹配引用名称搜索路径中的多个位置,否则不需要远程引用上的remotes /前缀(请参阅the Specifying Revisions section of git-rev-parse(1)中的“符号引用名称…”)。如果你试图明确地避免歧义,然后使用完整的引用名称:refs / remotes / origin / master。

你会得到这样的输出:

git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master

您可以将此输出传递到sh。

如果你不喜欢生成shell代码的想法,你可以放弃一点鲁棒性*,并做到:

for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
    git log --oneline "$branch" ^origin/master
done

*:
引用名称应该是安全的shell的分裂(见git-check-ref-format(1))。个人我会坚持使用前版本(生成的shell代码);我更有信心,没有不适当的可能发生与它。

因为你指定了bash并且它支持数组,你可以保持安全,仍然避免产生你的循环的胆量:

branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
    # …
done

如果你不使用支持数组的shell(set – 初始化和设置 – “$ @”%(refname)来添加元素),你可以做类似$ @的事情。

http://stackoverflow.com/questions/3846380/how-to-iterate-through-all-git-branches-using-bash-script

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:如何使用bash脚本遍历所有git分支