我在目录中有git存储库。例如,
$ ls
repo1 repo2 repo3 repo4
我想快速查看所有存储库的最后 k 提交日志。 ( k 类似于3。)
对于repo1,我可以打印最后3个提交日志并返回到这样的目录:
$ cd repo1; git log -3 ; cd ../
但我不想对所有存储库重复这一点。我正在寻找一种聪明的方法来轻松完成。 (也许使用xargs?)
我正在使用Bash。 谢谢。
答案 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目录本身还是只传递包含所有的目录,都可以使用它回购。
-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
参数,以使日志输出满足您的需求。