可以将远程的url包含在`git for-each-ref`命令的输出中吗?

时间:2017-06-13 15:04:08

标签: bash git-remote git-log

我正在写一个脚本来列出我系统上的所有git存储库,它们的分支以及系统上的最新提交。所以我创建了这个脚本打印出以下内容。

directory, branch(ref), date, commit hash, date, commit message, ref (again)

#!/bin/bash
IFS='
'
for directory in `ls -d $1/*/`; do
  # echo "$directory : $directory.git"
  if [[ -d $directory/.git ]] ; then
      # filter=/refs/heads
      filter=''
      for branch in $(git -C $directory for-each-ref --format='%(refname)' $filter); do
          echo $directory : $branch :  "$(git -C $directory log -n 1 --oneline  --pretty=format:'%Cred%h - %C(yellow)%ai - %C(green)%s %C(reset) %gD' $branch)" : $(echo $branch | rev | cut -d\/ -f-1 | rev)
      done
  fi
done

我没有的是遥控器的存储库URL。可以将远程URL作为git for-each-ref命令的输出的一部分打印吗?

我想我可以使用git remote -C $directory -v将存储库的远程列表列入查找列表,我会将xxxxxrefs/remotes/xxxxx的每个值用于一个变量,该变量将被添加到echo命令。

1 个答案:

答案 0 :(得分:1)

您可以使用git for-each-ref生成一个随后将使用eval进行评估的任意脚本。根据您examples from the documentation on git for-each-ref中最长的案例,我得出以下结论:

#!/bin/bash
IFS='
'
for directory in "$1"/*/ ; do
  # echo "$directory : $directory.git"
  if [[ -d $directory/.git ]] ; then
      # filter=/refs/heads
      filter=''
      fmt="
           dir=$directory"'
           ref=%(refname)
           refshort=%(refname:short)
           h=%(objectname:short)
           date=%(authordate:iso)
           subj=%(subject)

           printf "%s : %s : %s - %s - %s : %s" "$dir" "$ref" %(color:red)"$h" %(color:yellow)"$date" %(color:green)"$subj" %(color:reset)"$refshort"
           if [[ $ref == refs/remotes/* ]]
           then
               remotename="${ref#refs/remotes/}"
               remotename="${remotename%%/*}"
               printf " : %s" "$(git -C "$dir" remote get-url "$remotename")"
           fi
           printf "\n"
        '

        eval="$(git -C $directory for-each-ref --shell --format="$fmt" $filter)"
        eval "$eval"
  fi
done

请注意,我从您的实现中删除了git log,但结果我也放弃了%gD字段,因为我不太清楚其含义是什么,并且不能#39;找到如何在git-for-each-ref内获取它。此外,我改变了从全部参考中获得短线的方式;我的实现不等同于你的实现,但会产生明确的结果。)