Bash 查看多个git存储库的日志
我在一个目录中有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
$ 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..