我有一个存放git仓库的目录。例如,
$ ls
repo1 repo2 repo3 repo4
我想快速查看所有存储库的最后k个提交日志。(这里k是类似于3的数字。)
对于repo1,我可以像这样打印最后3个提交日志并返回目录:
$ cd repo1; git log -3 ; cd ../
但我不想为所有的存储库重复这个过程。我正在寻找一种简便的智能方法。(也许使用xargs?)
我正在使用Bash。 谢谢。
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转义),+
终止命令,但一次传递多个文件。我有一个类似的东西,很容易更改以满足您的要求:
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
参数以使日志输出符合您的需求。
pushd
代替cd
,并使用popd
代替cd ..
。 - o11c