远程的网址可以包含在“git for-each-ref”命令的输出中吗?



我正在写入一个脚本,列出系统上的所有 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将存储库的远程列出到查找列表中,我将用于refs/remotes/xxxxx添加到echo命令中的每个xxxxx

您可以使用

git for-each-ref生成任意脚本,稍后将使用eval .根据您的情况适应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字段,因为我不太明白它的含义,并且找不到如何在git-for-each-ref内部获取它。此外,我改变了从完整参考中获取短参考的方式;我的实现不等同于您的,但会产生明确的结果(。

最新更新