我的目录中有 git 存储库。例如,
$ ls
repo1 repo2 repo3 repo4
我想快速查看所有存储库的最后k提交日志。 (k 类似于 3。)
对于 repo1,我可以打印最后 3 个提交日志并返回到目录,如下所示:
$ cd repo1; git log -3 ; cd ../
但我不想对所有存储库重复此操作。我正在寻找一种聪明的方法来轻松做到这一点。 (也许使用 xargs?)
我正在使用 Bash。 谢谢你。
通常使用
xargs
是没有意义的,因为 find
可以自己执行东西:
find ~/src/ -maxdepth 2 -name .git -execdir git log \;
说明:
find ~/src/
在 ~/src/ 下查找内容。如果需要,您可以传递多个参数,这可能是 shell glob 的结果。
-maxdepth 2
不要深度递归。这节省了很多的时间,因为访问文件系统相对较慢。
-maxdepth 2
将找到 ~/src/.git (如果存在)和 ~/src/foo/.git,因此无论您传递 repo 目录本身还是仅传递包含所有 repos 的目录都可以使用它。
如果您只想传递 repo 目录本身,-maxdepth 1
就可以工作(并且在 IO 上更容易)。
-maxdepth 3
可能偶尔会用于某些源层次结构,但对于它们,您最好首先将其他目录传递给 find
。
-name .git
我们正在寻找
.git
目录(或文件!是的,git 就是这样做的),因为 -execdir
通常采用传递给命令的 {}
参数。传递的文件名只是基本名称(例如,mv
可以工作......记住find
通常与文件一起使用),工作目录设置为任何包含。
-execdir ... \;
在存储库本身中运行命令。命令(此处
...
)可以包含任何内容,特别是 -
本身不会解释的 find
选项...除了单词中任何位置的 {}
都是文件名,单独的 ;
终止命令(但这里对 shell 进行了转义),并且 +
终止命令但传递多个一次文件。
对于此用例,我们不需要传递文件名,因为程序运行的目录提供了所有需要的信息。
我有类似的东西,很容易改变以满足您的要求:
CODE_BASE=(/parentdir/to/your/repositories
/another/parent/dirs
/another/parent/dirs/if/you/have
)
EXCLUDE_PATT="gitRepoYouWantToIgnore" #this is regex
for base in ${CODE_BASE[@]};do
echo "##########################"
echo " scanning $base"
echo "##########################"
for line in $(find "$base" -name ".git"|grep -v "$EXCLUDE_PATT"); do
line=$(sed 's#/\.git##'<<<"$line")
repo=$(awk -F'/' '$0=$NF' <<<"$line")
echo "##########################"
echo "====> Showing log of Repository: $repo <===="
echo "##########################"
git -C "$line" log -3
done
done
例如保存到
showlog.sh
,然后执行。您可以添加更多log
参数,使日志输出满足您的需求。
如果您不想从头开始构建自己的脚本,我已经整理了一个轻量级的 Bash 脚本,该脚本扩展了 git log 并提供了一些额外的功能来简化多存储库浏览: