【问题标题】:How can I keep a subfolder of a git repo in sync with a subfolder of another git repo如何使 git repo 的子文件夹与另一个 git repo 的子文件夹保持同步
【发布时间】:2014-03-25 21:26:56
【问题描述】:

我有两个 git 项目。一个依赖于另一个存储库的子文件夹。

以下是文件夹的设置方式。

repoA
    .git
    folderA1/
    folderA2/

repoB
    .git
    folderB1/
    folderB1/folderB11
    folderB2/

我想要实现的是以下

repoA
    .git
    folderA1/
    folderA2/
    folderB11   <<<< This maps to the repoB on branch name "blah"

repoB
    .git
    folderB1/
    folderB1/folderB11
    folderB2/

在repoA 中,文件夹A1 中的某些文件可能会引用文件夹B11 中的文件。 repoA 包含引用 folderB11 中文件的 python 模块。同样,repoB 也包含引用 folderB11 中文件的 python 模块。

我查看了 git subtree,但它似乎没有同步两个文件夹。

一种选择是创建folderB11 作为存储库并将其添加到repoA 和repoB 的子树,但我宁愿没有第三个存储库,因为维护代码会很痛苦。此外,拥有第三个存储库不是理想的选择,因为 folderB11 应位于 repoB 以确保项目其余部分的准确性。

有没有办法将 git repo 的子文件夹与另一个 git repo 的子文件夹同步?

【问题讨论】:

    标签: git repository


    【解决方案1】:

    Alex Rcommented:

    符号链接或子模块的替代方案的一个问题是,您无法在单个存储库中获得 repoA 或 repoB 的一致历史记录。

    使用submodule,它确实如此,因为它在父存储库 (repoA) 中记录了使用的repoB 的确切 SHA1。
    它将其记录为 gitlink(special entry in the index)。

    它们创建了必须跟踪和管理的外部依赖项。

    这就是子模块为你做的事情。

    如果您想回到 repoA 的旧提交,您必须跟踪并知道 repoB 中的相应提交是什么。

    同样,子模块记录该信息。
    回到旧版本的repoA,执行git submodule update --init,您的repoB 处于一致状态,位于右侧sha1。

    【讨论】:

    • 好吧,我不喜欢子模块还有一些其他原因。固执己见的博主已经记录了大多数相同的原因。此外,我还发现 Eclipse 对子模块的支持有限且有缺陷。
    • @AlexR 子模块最近有了很多改进。他们可以关注一个分支 (stackoverflow.com/a/18088319/6309)。
    • 感谢您的澄清。我要奖励你+100赏金。我仍然更喜欢替代方案,使用子树合并直接在 repos 中同步两个子文件夹,同时保持每个 repo 完全独立。
    • @AlexR 我明白了:我在这里尝试了子树 (stackoverflow.com/a/24709789/6309)
    【解决方案2】:

    没有。 git 方式是让 folderB11 成为一个存储库,作为子模块包含在 repoA 和 repoB 中。

    由于您不喜欢这样(为什么?它不应该是这样的问题),您可以使用符号链接使 folderB11 指向 repoB 结帐的适当子文件夹。您可以使 repoB 成为 repoA 的子模块并将符号链接指向 repoB/folderB11 (尽管它有点难看),或者,如果它们打算并排结帐,您可以使用相对路径(例如 ../repoB/ folderB11) 知道如果 repoB 未在与 repoA 相同的文件夹中签出,它将中断。

    【讨论】:

    • 符号链接或子模块的替代方案的一个问题是,您无法在单个存储库中获得 repoA 或 repoB 的连贯历史。他们创建了一个必须跟踪和管理的外部依赖项。如果你想回到 repoA 的旧提交,你必须跟踪并知道 repoB 中相应的提交是什么。
    • @AlexR 据我所知,您有两种选择:将所有内容保存在 fs 上的一个位置,并根据需要符号链接到该位置,或者在需要它们的地方保存副本并根据需要同步它们。 . . . “你必须跟踪并知道 repoB 中的相应提交是什么”——不。没有“相应的提交”,它在每个 repo 中都是相同的提交。这是 git 最有力的保证:提交在任何地方都是相同的,而且可以验证。一旦你告诉它任何其他感兴趣的回购,在 git 中的同步就是“git pull”,据我所知,没有人提出任何可能使它变得更容易的方法。
    【解决方案3】:

    我正在使用Copybara 将一个 git Repo 的一部分同步到另一个

    【讨论】:

      【解决方案4】:

      这里可以使用子树的一个记录不充分的特性,允许在合并目标语法中指定子文件夹到子文件夹(与子文件夹到存储库相反)。

      我刚刚在这里发现了它:How do I merge a sub directory in git?

      【讨论】:

        猜你喜欢
        • 2016-08-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2015-12-25
        • 2016-07-09
        • 1970-01-01
        • 2018-10-08
        • 2013-05-11
        相关资源
        最近更新 更多