查看多个 git 个存储库的日志
View logs of multiple git repositories
我在目录中有 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'/' '[=10=]=$NF' <<<"$line")
echo "##########################"
echo "====> Showing log of Repository: $repo <===="
echo "##########################"
git -C "$line" log -3
done
done
例如保存到showlog.sh
,然后执行。您可以添加更多 log
参数以使日志输出符合您的需要。
通常使用 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,所以无论你通过都可以使用回购目录本身或只是包含所有回购的目录。
-maxdepth 1
可以工作(并且在 IO 上更容易),只要你想自己传递 repo 目录。
-maxdepth 3
可能偶尔用于某些源层次结构,但对于它们,您最好首先将其他目录传递给 find
。
-name .git
我们正在寻找 .git
目录(或文件!是的,git 就是这样做的),因为 -execdir
通常采用它传递的 {}
参数到命令。传递的文件名将只是基本名称(这样 mv
可以工作......记住 find
通常与文件一起工作),工作目录设置为 包含的任何内容 那个。
-execdir ... \;
运行 回购本身中的命令。命令(此处 ...
)可以包含任何内容,特别是 -
不会被 find
本身解释的选项...除了 {}
单词中的任何地方都是文件名, 单独的 ;
终止命令(但此处为 shell 转义), +
终止命令但一次传递多个文件。
对于这个用例,我们不需要传递文件名,因为程序 运行 所在的目录提供了所有需要的信息。
我在目录中有 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'/' '[=10=]=$NF' <<<"$line")
echo "##########################"
echo "====> Showing log of Repository: $repo <===="
echo "##########################"
git -C "$line" log -3
done
done
例如保存到showlog.sh
,然后执行。您可以添加更多 log
参数以使日志输出符合您的需要。
通常使用 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,所以无论你通过都可以使用回购目录本身或只是包含所有回购的目录。
-maxdepth 1
可以工作(并且在 IO 上更容易),只要你想自己传递 repo 目录。
-maxdepth 3
可能偶尔用于某些源层次结构,但对于它们,您最好首先将其他目录传递给 find
。
-name .git
我们正在寻找 .git
目录(或文件!是的,git 就是这样做的),因为 -execdir
通常采用它传递的 {}
参数到命令。传递的文件名将只是基本名称(这样 mv
可以工作......记住 find
通常与文件一起工作),工作目录设置为 包含的任何内容 那个。
-execdir ... \;
运行 回购本身中的命令。命令(此处 ...
)可以包含任何内容,特别是 -
不会被 find
本身解释的选项...除了 {}
单词中的任何地方都是文件名, 单独的 ;
终止命令(但此处为 shell 转义), +
终止命令但一次传递多个文件。
对于这个用例,我们不需要传递文件名,因为程序 运行 所在的目录提供了所有需要的信息。