【问题标题】:Recursive Git push/pull?递归Git推/拉?
【发布时间】:2013-07-08 10:11:02
【问题描述】:

我有一个包含其他 git 存储库的 git 存储库。是否有递归地推送和/或拉取元存储库和子存储库的命令?

【问题讨论】:

标签: git recursion push pull


【解决方案1】:

每当我想更新我的 llvm/clang 存储库时,我发现自己处于相同的情况,并且通过一些 bash 帮助,我可以像这样“git pull”它们中的每一个:

$> for dir in $(find . -name ".git"); do cd ${dir%/*}; git pull ; cd -; done

这将“git pull”在你当前目录下找到的所有 git 存储库,如果它们是裸存储库,则可能无法工作。

【讨论】:

  • 如果目录名称中包含空格,这将不起作用。
【解决方案2】:

不完全是git pull,但很接近:

git fetch --recurse-submodules

来自the Git docs

--recurse-submodules[=yes|on-demand|no]

此选项控制是否以及在什么条件下也应获取已填充子模块的新提交。它可以用作布尔选项以在设置为 no 时完全禁用递归,或在设置为 yes 时无条件地递归到所有填充的子模块,这是在没有任何值的情况下使用此选项时的默认值。仅当超级项目检索到更新子模块对本地子模块克隆中不存在的提交的引用的提交时,才使用按需递归到填充的子模块。

【讨论】:

  • 我不是(有意地)指的是子模块。我有一个包含其他存储库的存储库。所有这些存储库都由我初始化。我应该以某种方式将它们变成子模块吗?
【解决方案3】:

如果您在谈论子模块,请参阅纸杯蛋糕答案。

如果你在谈论一些包含 git repos 的文件夹层次结构,你可以签出 clustergit,我编写的一个工具:https://github.com/mnagel/clustergit

【讨论】:

  • 谢谢,我会试试这个。假设之前已经设置了遥控器,我是否只需在顶级目录中运行“clustergit -p”以递归拉取?
  • @DavidY.Stephenson 是的,clustergit 将递归地扫描一个目录(默认值:.)以查找.git 目录,以决定 git 存储库所在的位置。然后它在这些上运行git status。如果状态为干净并且指定了-p,它将执行git pull,只有在设置了远程时才会成功,否则会出现警告(但clustergit将继续使用其他存储库)。
  • 你能给我一个示例命令说,递归推送到原始主机吗?我在从文档中把它放在一起时遇到了一些麻烦。
  • @DavidY.Stephenson clustergit --recursive --remote origin:master --push 您可以添加 --verbose 以查看实际发出的 git 命令。通常我会省略--remote ... 部分,所以它只是git push。 ps:请从github更新,我只是推送了push/verbose组合的修复。 pps:我会更新文档以包含一些示例,如果您对此有一些建议,我会很感兴趣。
  • 太棒了。建议:递归pushorigin master,递归pullorigin master,举例说明-v 打开和关闭。另外,有没有办法在每个目录中addcommit
【解决方案4】:

我刚刚编写了一个脚本以在多个 git 存储库上递归执行。您可以从这里获取它:

https://github.com/DariuszOstolski/rgit

思路和clustergit完全一样,只是实现方式不同。

【讨论】:

    【解决方案5】:

    不久前我需要这个,并通过 npm 提供了一个 cli。 https://github.com/kenglxn/gitr/blob/master/README.md

    只需执行“npm install -g gitr”,然后您就可以使用 gitr 递归地执行任何 git 命令。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-09
      • 2010-10-19
      • 1970-01-01
      • 2011-11-06
      • 2016-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多