如何让git repo的子文件夹与另一个git repo的子文件夹同步

时间:2014-03-25 21:26:57

标签: git repository

我有两个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中,folderA1中的某些文件可能会引用folderB11中的文件。 repoA包含引用folderB11中文件的python模块。同样,repoB还包含引用folderB11中文件的python模块。

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

一个选项是创建folderB11作为存储库,并将其添加到repoArepoB的子树,但我宁愿没有第三个存储库,因为它正在进行维护代码是一种痛苦。另外,理想情况下,将folderB11放在第三个存储库中的选项应位于repoB,以确保项目其余部分的准确性。

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

4 个答案:

答案 0 :(得分:2)

Alex R commented

  

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

使用submodule,因为它在父仓库(repoA)中记录了所使用的repoB的确切SHA1。 它会将其记录为 gitlink (a special entry in the index)。

  

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

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

  

如果您想回到repoA的旧提交,您必须跟踪并了解repoB中相应提交的内容。

同样,子模块记录了该信息 返回旧版repoA,执行git submodule update --initrepoB处于连贯状态,位于右侧sha1。

答案 1 :(得分:0)

没有。 git方法是使folderB11成为一个存储库,由repoA和repoB作为子模块包含。

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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