Bash 查看多个git存储库的日志

Bash 查看多个git存储库的日志,bash,git,xargs,Bash,Git,Xargs,我在一个目录中有git存储库。比如说, $ ls repo1 repo2 repo3 repo4 我想快速查看所有存储库的最后k个提交日志。 (k有点像3。) 对于repo1,我可以打印最后3个提交日志并返回如下目录: $ cd repo1; git log -3 ; cd ../ 但我不想对所有存储库重复这一点。我正在寻找一个聪明的方法来轻松地完成它。(可能使用xargs?) 我在用Bash。 谢谢。我有类似的东西,很容易更改以满足您的要求: CODE_BASE=(/parentdir/t

我在一个目录中有git存储库。比如说,

$ ls
repo1 repo2 repo3 repo4
我想快速查看所有存储库的最后k个提交日志。 (k有点像3。)

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

$ cd repo1; git log -3 ; cd ../
但我不想对所有存储库重复这一点。我正在寻找一个聪明的方法来轻松地完成它。(可能使用xargs?)

我在用Bash。
谢谢。

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

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
code_BASE=(/parentdir/to/your/repositories)
/另一个/父/目录
/另一个/parent/dirs/if/you/have
)
排除_PATT=“gitRepoYouWantToIgnore”#这是regex
对于${CODE_base[@]}中的base;做
回声
echo“扫描$base”
回声
对于$中的行(查找“$base”-name.git”| grep-v“$EXCLUDE_PATT”);做

line=$(sed's#/\.git####'我有类似的东西,很容易更改以满足您的要求:

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
code_BASE=(/parentdir/to/your/repositories)
/另一个/父/目录
/另一个/parent/dirs/if/you/have
)
排除_PATT=“gitRepoYouWantToIgnore”#这是regex
对于${CODE_base[@]};do中的base
回声
echo“扫描$base”
回声
对于$(查找“$base”-name.git“| grep-v“$EXCLUDE_PATT”);do中的行

line=$(sed's#/\.git####'通常使用
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
如果您只想传递repo目录本身,那么它就可以工作(并且在IO上更容易)

-maxdepth 3
可能偶尔会用于某些源层次结构,但对于它们,您最好首先将附加目录传递给
查找

-name .git
我们正在寻找
.git
目录(或文件!是的,git就是这样做的),因为
-execdir
通常会接受一个
{}
参数,并将其传递给命令。传递的文件名只会是基名(因此,
mv
可以工作……记住
find
通常适用于文件),并将工作目录设置为包含该目录的任何目录

-执行董事…\

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


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

通常使用
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
如果您只想传递repo目录本身,那么它就可以工作(并且在IO上更容易)

-maxdepth 3
可能偶尔会用于某些源层次结构,但对于它们,您最好首先将附加目录传递给
查找

-name .git
我们正在寻找
.git
目录(或文件!是的,git就是这样做的),因为
-execdir
通常会接受一个
{}
参数,并将其传递给命令。传递的文件名只会是基名(因此,
mv
可以工作……记住
find
通常适用于文件),并将工作目录设置为包含该目录的任何目录

-执行董事…\

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


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

FYI当您必须这样做时,请使用
pushd
而不是
cd
popd
而不是
cd..
FYI当您必须这样做时,请使用
pushd
inste用
cd
popd
代替
cd..