【问题标题】:How to work with multiple git repos (tagged ones)?如何使用多个 git repos(标记的)?
【发布时间】:2015-04-12 19:42:32
【问题描述】:

我正在开发一个包含多个 git 存储库的项目。文件夹结构如下所示;

repo1/
  +
  ---repo2/
  ---repo3/
  ...
  ---repo8/

所以,要设置我的开发环境,我需要运行类似的东西;

git clone http://path_to_git_repo.git top_folder
cd top_folder
git checkout tags/release34
git clone http://path_to_another_repo.git subfolder1
cd subfolder1
git checkout tags/release55
cd ..
git clone http://path_to_another_repo.git subfolder2
cd subfolder2
git checkout tags/rel-44-abc

...等

大约一周后,不同的团队会推送他们自己的更新/标签,我需要通过这样做重新同步;

cd top_folder
git checkout tags/release44
cd subfolder1
git checkout tags/release-bignewfeature
cd ..
cd subfolder1
git checkout tags/release-reverting_tosomethingelse
cd ..

...等

进行整个重新同步非常...重复且令人厌烦。有人对我如何让自己更轻松有任何建议吗?

我听说过(并尝试过)m​​r 工具,但它只会更新到最新的 HEAD 版本的存储库,而我只需要更新到某些标签。

【问题讨论】:

    标签: git tags


    【解决方案1】:

    您应该考虑为此使用 git submodules,这样可以避免所有标记/同步步骤。

    您的父 repo repo1 只是引用一组固定的 SHA1,每个 submodule repos 一个。

    一周左右后,不同的团队会推送自己的更新/标签

    您可以使每个submodule follow a branch,这意味着重新同步将是:

    git submodule update --remote
    

    【讨论】:

    • 嗯...让我检查子模块。谢谢!
    • @chronodekar 注意:对于分支,开发人员可以选择一个专用分支,仅用于合并repo1(父仓库)需要遵循的提交。同样,避免使用标签。 repo1 只是跟随每个子模块的分支,确保这些子模块更新为合并到该特殊分支中的最新提交。
    • 现在,如果我正确理解了子模块,这意味着对顶级仓库进行更改。这不是我能做出的决定。当然我可以推送代码更改,但现在要保持同步意味着更新主仓库。如果这是一个新项目,我可以尝试强制执行,但事实上,每个人都习惯于使用标签。所以,我需要一个使用它的解决方案。 :(
    • @chronodekar 你总是用子模块更新父存储库:子模块是什么:对另一个 Git 存储库的 SHA1 的精确引用。您需要记录和更新 gitlink (stackoverflow.com/a/16581096/6309),这是父 repo (stackoverflow.com/a/17442045/6309) 索引中的特殊条目。
    • @chronodekar 尝试使用标签最终将不得不以某种方式记录父 repo 正在使用的标签。这将尝试做子模块本身正在做的事情。
    【解决方案2】:

    更好的方法是使用git subtree,更容易维护依赖于服务器的存储库。

    您可以阅读更多关于子模块和子树 herehere

    【讨论】:

      猜你喜欢
      • 2014-08-05
      • 1970-01-01
      • 2011-01-10
      • 2016-06-23
      • 2011-12-01
      • 2017-11-10
      • 2017-06-08
      • 2020-03-24
      相关资源
      最近更新 更多