我正在写一个脚本来列出我系统上的所有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
将存储库的远程列表列入查找列表,我会将xxxxx
中refs/remotes/xxxxx
的每个值用于一个变量,该变量将被添加到echo
命令。
答案 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
内获取它。此外,我改变了从全部参考中获得短线的方式;我的实现不等同于你的实现,但会产生明确的结果。)