如何将一个git仓库中的子文件夹与另一个git仓库中的子文件夹保持同步

3
我有两个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创建为一个仓库,并将其作为子树添加到repoArepoB中,但我不想有第三个仓库,因为维护代码会很麻烦。此外,最好不要有第三个仓库,因为folderB11应该位于repoB中,以确保与项目的其余部分的准确性。
有没有一种方法可以将一个git repo的子文件夹与另一个git repo的子文件夹同步?
4个回答

2

Alex R 发表评论:

符号链接或子模块的两种替代方案都存在一个问题,即无法在单个存储库中获得repoArepoB的连贯历史记录。

使用子模块, 可以获得连贯的历史记录,因为它在父存储库(repoA)中记录了使用的repoB的确切 SHA1。
它将其记录为一个gitlink (索引中的一个特殊条目)。

它们创建了一个外部依赖项,必须进行跟踪和管理。

这是子模块为您完成的功能。
如果您想回到 repoA 的旧提交版本,您必须跟踪并知道在 repoB 中相应的提交版本。
子模块记录了这些信息。返回到 repoA 的旧版本,执行 git submodule update --init,您的 repoB 将处于一个连贯的状态,对应正确的 sha1。

好的,我不喜欢子模块的原因还有一些。大部分相同的原因已经被充满个人观点的博客记录下来了。此外,我也发现 Eclipse 对子模块的支持有限且存在缺陷。 - Alex R
@AlexR 子模块最近有很多改进。它们可以跟随分支(https://dev59.com/HnRB5IYBdhLWcg3wn4YL#18088319)。 - VonC
谢谢您的澄清。我将授予您+100赏金。我仍然更喜欢另一种方法,即使用子树合并直接同步两个存储库中的两个子文件夹,同时使每个存储库完全自包含。 - Alex R
@AlexR 我明白:我在这里尝试了子树 (https://dev59.com/vmAf5IYBdhLWcg3wXh2z#24709789)。 - VonC

0

不行。Git 的方式是将 folderB11 作为子模块包含在 repoA 和 repoB 中。

既然你不喜欢这种方式(为什么?这应该不是什么问题),你可以使用符号链接将 folderB11 指向 repoB 检出的适当子文件夹。你可以将 repoB 作为 repoA 的子模块,并将符号链接指向 repoB/folderB11(虽然有点丑陋),或者,如果它们打算并排检出,你可以使用相对路径(如 ../repoB/folderB11),知道如果 repoB 没有在与 repoA 相同的文件夹中检出,它就会失效。


符号链接或子模块的两种替代方案都存在一个问题,即在单个存储库中,无法为repoA或repoB获得连贯的历史记录。它们创建了一个外部依赖项,必须进行跟踪和管理。如果您想返回到repoA的旧提交,则必须跟踪并知道repoB中对应的提交是什么。 - Alex R
@AlexR 据我所知,你有两个选择:将所有内容保存在文件系统的一个位置,并根据需要创建符号链接;或者在需要的地方进行复制,并根据需要进行同步。没有所谓的“对应提交”,每个存储库中都是相同的提交。这是 Git 的最强保证:提交在任何地方都是相同的,可以得到验证。 在告诉 Git 有其他感兴趣的存储库之后,git 同步是 "git pull",据我所知,没有人建议过任何可能使其变得更容易的方法。 - jthill

0

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


-1

有一个文档不完整的子树功能可以在这里使用,允许在合并目标语法中指定子文件夹到子文件夹(而不是子文件夹到存储库)。

我刚刚在这里发现它:如何在git中合并子目录?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接