查看多个git仓库的日志

问题描述 投票:0回答:3

我的目录中有 git 存储库。例如,

$ ls
repo1 repo2 repo3 repo4

我想快速查看所有存储库的最后k提交日志。 (k 类似于 3。)

对于 repo1,我可以打印最后 3 个提交日志并返回到目录,如下所示:

$ cd repo1; git log -3 ; cd ../

但我不想对所有存储库重复此操作。我正在寻找一种聪明的方法来轻松做到这一点。 (也许使用 xargs?)

我正在使用 Bash。 谢谢你。

bash git xargs
3个回答
4
投票

通常使用

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 进行了转义),并且
+
终止命令但传递多个一次文件。

对于此用例,我们不需要传递文件名,因为程序运行的目录提供了所有需要的信息。


3
投票

我有类似的东西,很容易改变以满足您的要求:

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
参数,使日志输出满足您的需求。


0
投票

如果您不想从头开始构建自己的脚本,我已经整理了一个轻量级的 Bash 脚本,该脚本扩展了 git log 并提供了一些额外的功能来简化多存储库浏览:

  • 可自定义的挂钩,用于在处理每个存储库的日志之前和之后运行命令
  • 支持多个根目录
  • 灵活的排除模式可以跳过某些存储库
  • 并行处理以获得更快的结果
  • 每个存储库都有清晰、格式化的标题,以简化扫描输出

随意尝试一下:https://github.com/thomasklein/mgitlog/

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.