如何使用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]+")
上一篇: How to iterate through all git branches using bash script
下一篇: Listing each branch and its last revision's date in git