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

如何使用bash脚本遍历我的资源库中的所有本地分支。 我需要迭代并检查分支和一些远程分支之间是否有区别。 防爆

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

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

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

谢谢


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

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

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

注意:除非有其他引用origin/master匹配ref名称搜索路径中多个位置的其他引用,否则您不需要远程引用上的远程remotes/前缀(请参阅指定修订部分中的“符号引用名称...” GIT-REV-解析(1))。 如果您试图明确避免含糊不清,请使用完整的ref名称: 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 --初始化和set -- "$@" %(refname)来添加元素),你可以用$@做类似的事情。


这是因为git branch用星号标记当前分支,例如:

$ git branch
* master
  mybranch
$ 

所以$(git branch)扩展为eg * master mybranch ,然后*展开到当前目录中的文件列表。

我没有看到首先不打印星号的明显选择; 但你可以砍掉它:

$(git branch | cut -c 3-)

如果您的本地分支仅以数字,az和/或AZ字母命名,我会建议使用$(git branch|grep -o "[0-9A-Za-z]+")

链接地址: http://www.djcxy.com/p/19493.html

上一篇: How to iterate through all git branches using bash script

下一篇: Listing each branch and its last revision's date in git