繁体   English   中英

如何获取有关我的 git 本地存储库的每个分支的信息

[英]How do I get the information about each branch of my git local repository

这是git branch -v在我的一个本地目录中产生的

* develop e229f7a Merge branch 'develop' of https://github.com/me/myremote-repo.git into develop Some diffs
  master  3343dea [behind 2] Added git-log, same as git_log without colorization

我正在尝试通过该命令的分支集和 output 以及 output 包含 [ahead n] 或 [behind m],

[behind 2] --> bin [master] 3343dea
[ahead 1]  --> bin [develop] 99345b

对于每个分支,如果它包含在前面或后面。

我目前在我的代码中有以下内容:

MOD=`git branch -v | perl -wlne '/^..(\S+)\s+([a-f0-9]+)\s+(\[ahead\s+\d+\]|\[behind\s+\d+\])/ or next; print  "$3 --> $ENV{reponame} [$1] $2"; '`;

    [ ! -z "$MOD" ] &&  MOD="$MOD" | ok=false
    if $ok; then
        echo " OK --> $reponame [$br]"
    else
       # a series of UGLY HACKs to get pretty-printing
       MOD=`echo "$MOD" | tr -d '\011\012\015' | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'` | sed -e 's/]#/]\
 #/'
       if [ ! -z "$MOD" ]; then
          echo -e " $MOD" && continue
       fi
    fi


 bin [develop] --> Out of sync with origin/HEAD at /Users/me/bin
 bin [develop] --> Changes to be staged/committed at /Users/me/bin
 [behind 2] --> bin [master] 3343dea
 OK --> patti [develop]
 OK --> notes [master]
 OK --> indecks [develop]
 OK --> queue [develop]
 OK --> frameworks [develop]
 OK --> nodejs [master]
 OK --> perl-forth [develop]
 OK --> patti [master]
 OK --> blog [develop]

问题是我只得到第一个。 如果有两个分支,无论是前面还是后面,我只会得到第一个。 我尝试了几种方法从 git 分支 -v 获取 output 到一个数组中,然后遍历数组,如果它与模式匹配,则进行打印。 问题是我找不到将 output 以有效的方式放入阵列的方法。 然后当我遍历数组时,我得到了所有文件的列表。

我用:

branches={`git branch -v`)
for i in "${branches[@]}"
do
    echo "$i"
done

我得到的是目录中所有文件的列表!

为什么,我应该怎么做?

while循环中使用readperl中的行一一读取到MOD中。

git branch -v |
perl -wlne'
   print "$3 --> $ENV{reponame} [$1] $2"
      if /^..(\S+)\s+([a-f0-9]+)\s+(\[(?:ahead|behind)\s+\d+\])/
' |
while IFS= read -r MOD; do
   printf '{%s}\n' "$MOD"  # Replace with code that uses $MOD
done

我认为您可以通过指定git 分支 Z78E6221F633983CE4的格式来获得大多数方式,而无需perlawk 请注意$REPONAME是由 shell 插值的,因为我使用的是双引号字符串。 %(...)中的内容是git格式的一部分:

$ export REPONAME=bin
$ git branch --format "%(upstream:track) --> $REPONAME [%(refname:short)] %(objectname:short=6)" | grep '^\['
[behind 15] --> bin [master] 5b1e08

我没有很努力地摆脱分支是最新的行,所以我选择了grep

$ git branch --format "%(upstream:track) --> $REPONAME [%(refname:short)] %(objectname:short=6)"
  --> bin [a] 5b1e08
  --> bin [briandfoy/how-to-install-perl] 1d7456
[behind 15] --> bin [master] 5b1e08

您可以添加逻辑,但我没有达到不输出空行的地步:

$ git branch --format "%(if)%(upstream:track)%(then)%(upstream:track) --> $REPONAME [%(refname:short)] %(objectname:short=6)%(else)%(end)"


[behind 15] --> bin [master] 5b1e08

但是,我认为在您对 ikegami 的评论中,您希望拥有最新的分支“OK”。 修改if-then-else以仅覆盖第一列并始终覆盖 output 和 rest:

$ git branch --format "%(if)%(upstream:track)%(then)%(upstream:track)%(else)OK%(end) --> $REPONAME [%(refname:short)] %(objectname:short=6)"
OK --> bin [a] 5b1e08
OK --> bin [briandfoy/some_feature] 1d7456
[behind 15] --> bin [master] 5b1e08

如果您想要一些其他字符串用于不同步分支,只需更改if-then-else的该分支:

$ git branch --format "%(if)%(upstream:track)%(then)Out of sync%(else)OK%(end) --> $REPONAME [%(refname:short)] %(objectname:short=6)"
OK --> bin [a] 5b1e08
OK --> bin [briandfoy/some_feature] 1d7456
Out of sync --> bin [master] 5b1e08

您可以将整个格式放入它自己的变量中,但您需要小心,因为它会插入$REPONAME 您必须为每个 repo 设置$FORMAT 我认为这更容易消化:

$ export FORMAT="%(if)%(upstream:track)%(then)%(upstream:track)%(else)OK%(end) --> $REPONAME [%(refname:short)] %(objectname:short=6)"
$ git branch --format "$FORMAT"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM