我在/git
路径的深度不同,例如:
/git/project/project1/module1.git
/git/project/project1/module2.git
/git/project/project2/dev/module1.git
/git/library/libgit2.git
/git/library/jquery/jquery.git
如何在git gc
内的所有回购邮件中递归运行/git
?
我更喜欢使用shell脚本来迭代存储库:如果该目录不是有效的git存储库,请不要运行git gc
。
答案 0 :(得分:32)
您可以尝试以下方式:
find /git -name '*.git' -execdir sh -c 'cd {} && git gc' \;
这会在*.git
,/git
下找到与cd
匹配的每个目录,并运行git gc
。
答案 1 :(得分:0)
由于msysgit的find
(版本4.1)太旧,因此不支持-execdir
选项。
我们必须写一个for循环。
for line in $(find /git -name '*.git'); do (cd $line && git gc); done
答案 2 :(得分:0)
在某些系统(即OSX)上,for
循环将空格视为分隔符,从而破坏包含空格的目录名称。将IFS
设置为仅使用换行符\n
才能正常工作,并在完成时重置为默认值:
oldIFS=$IFS; IFS=$'\n'; for line in $(find /git -name '*.git'); do (echo $line; cd $line; git gc); done; IFS=$oldIFS