查看多个git存储库

时间:2018-06-15 21:21:50

标签: bash git xargs

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

$ ls
repo1 repo2 repo3 repo4

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

对于repo1,我可以打印最后3个提交日志并返回到这样的目录:

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

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

我正在使用Bash。 谢谢。

2 个答案:

答案 0 :(得分:2)

使用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目录本身还是只传递包含所有的目录,都可以使用它回购。

如果只想自己传递repo目录,

-maxdepth 1可以工作(并且在IO上更容易)。

-maxdepth 3可能偶尔会用于某些源层次结构,但对于它们而言,最好只是将其他目录传递给find

-name .git

我们正在寻找.git目录(或文件!是的,git这样做),因为-execdir通常需要一个{}参数传递给命令。传递的文件名只是基本名称(因此,例如mv有效...请记住find经常使用文件),工作目录设置为 contains

-execdir ... \;

在repo本身中运行命令。该命令(此处...)可以包含任何内容,尤其是-选项,find本身不会解释这些选项...除了{}单词中的任何位置都是文件名,一个单独的;终止命令(但在这里为shell转义),+终止命令,但一次传递多个文件。

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

答案 1 :(得分:1)

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

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