查看多个Git存储库的日志

3

我有一个存放git仓库的目录。例如,

$ ls
repo1 repo2 repo3 repo4

我想快速查看所有存储库的最后k个提交日志。(这里k是类似于3的数字。)
对于repo1,我可以像这样打印最后3个提交日志并返回目录:
$ cd repo1; git log -3 ; cd ../

但我不想为所有的存储库重复这个过程。我正在寻找一种简便的智能方法。(也许使用xargs?)

我正在使用Bash。 谢谢。


当你需要以这种方式执行操作时,请使用pushd代替cd,并使用popd代替cd .. - o11c
2个回答

4
通常情况下,使用xargs是没有意义的,因为find可以自行执行操作:
find ~/src/ -maxdepth 2 -name .git -execdir git log \;

解释:

find ~/src/

在 ~/src/ 目录下查找相关内容。如果需要的话,您可以传递多个参数,可能需要使用 shell 通配符。

-maxdepth 2

请勿深度递归。这样做可以节省大量时间,因为访问文件系统相对较慢。 -maxdepth 2 可以找到 ~/src/.git(如果存在)和 ~/src/foo/.git,因此无论您传递仓库目录本身还是包含所有仓库的目录,都可以使用它。 -maxdepth 1 如果只想传递仓库目录本身,则此选项可行(并且对IO来说更容易)。 -maxdepth 3 对于某些源层次结构可能有偶尔的用处,但是对于它们,您最好一开始就将其他目录传递给 find
-name .git

我们正在寻找.git目录(或文件!是的,git可以这样做),因为-execdir通常需要一个{}参数,它将其传递给命令。传递的文件名只是基本名称(因此例如mv有效...请记住,find通常与文件一起使用),工作目录设置为包含该文件的任何内容。 -execdir ... \; 在存储库本身中运行命令。命令(这里是...)可以包括任何内容,特别是-选项,这些选项不会被find本身解释...除了任何单词中的{}都是文件名,孤立的;终止命令(但在这里为shell转义),+终止命令,但一次传递多个文件。
对于这种用例,我们不需要传递文件名,因为程序运行的目录提供了所有所需的信息。

2

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

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参数以使日志输出符合您的需求。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接