为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Git
至尊宝的传说 2019-10-16 13:15:17
如何使用bash脚本遍历存储库中的所有本地分支。我需要进行迭代,并检查分支和某些远程分支之间是否有任何区别。防爆for branch in $(git branch); do    git log --oneline $branch ^remotes/origin/master;done我需要做上面给出的事情,但是我面临的问题是$(git branch)给了我存储库文件夹中的文件夹以及存储库中存在的分支。这是解决此问题的正确方法吗?还是有其他方法可以做到?谢谢
查看完整描述

3 回答

?
holdtom

TA贡献1805条经验 获得超10个赞

编写脚本时,不应使用git branch。Git提供了一个“管道”接口,该接口专门用于脚本编写(普通Git命令的许多当前和历史实现(添加,签出,合并等)都使用同一接口)。


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


git for-each-ref --shell \

  --format='git log --oneline %(refname) ^origin/master' \

  refs/heads/

注意:您不需要remotes/远程引用上的前缀,除非您有其他引用导致origin/master与引用名称搜索路径中的多个位置匹配(请参阅git-rev-parse的 “ 指定修订”部分中的 “符号引用名称...”)。(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

$@如果不使用支持数组的外壳(set --初始化和set -- "$@" %(refname)添加元素),则可以执行类似的操作。


查看完整回答
反对 回复 2019-10-16
  • 3 回答
  • 0 关注
  • 1373 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信