【问题标题】:Run git gc on multiple repositories [duplicate]在多个存储库上运行 git gc [重复]
【发布时间】:2012-08-05 02:20:31
【问题描述】:

我在 /git 有一个 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 内的所有存储库中递归运行git gc

我更喜欢使用 shell 脚本来遍历存储库:如果该目录不是有效的 git 存储库,请不要运行 git gc

【问题讨论】:

    标签: git bash


    【解决方案1】:

    你可以试试这样的:

    find /git -name '*.git' -execdir sh -c 'cd {} && git gc' \;
    

    这将在/gitcd 下找到每个匹配*.git 的目录,然后运行git gc

    【讨论】:

    • 谢谢!我得到了以下一些错误:sh: line 0: cd: ./.git: Not a directory,可能是因为 .git 如果它代表一个子模块,它也可以是一个文件。
    • 该命令抱怨其不安全的废话 find . -name "*.git" -exec bash -c 'cd {} && git gc' printf {} ';' 有效,但它们都不适用于其中包含空格的目录.... ?(如果 find 返回名称上有空格的文件夹它没有逃脱并导致问题)
    【解决方案2】:

    由于来自 msysgit 的find(4.1 版)太旧,不支持-execdir 选项。

    我们必须编写一个 for 循环。

    for line in $(find /git -name '*.git'); do (cd $line && git gc); done
    

    【讨论】:

      【解决方案3】:

      在某些系统(即 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
      

      【讨论】:

        猜你喜欢
        • 2012-09-11
        • 2011-05-28
        • 1970-01-01
        • 1970-01-01
        • 2019-05-06
        • 2018-04-05
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多