在git repo中推送子树

时间:2012-02-22 12:34:04

标签: git git-subtree

我对Git很新:我来自SVN,在那里我发现了非常强大的外部功能。在Git中我找不到类似的东西:

  • 子模块非常适合添加并非总是需要的项目模块。它们必须在repo克隆后初始化,并且不能只包含原始项目的子目录。
  • 子树非常适合添加库(它们也允许包含子目录),但是推送它们真的很痛苦。

所以场景是这样的:我有一个项目,我想在其中包含一些库。我希望有可能改变所有这些库并将它们推送到自己的回购中。此外,这些库中的一些是较大项目的子目录(例如,如果项目还包括演示或自述文件,我将不会在项目中包含这些目录)。

我该怎么做?

我试过了:

好吧,如果你已达到这一点,感谢你的耐心,现在我想要别的东西尝试,因为现在我的结论是:“在Git中不允许子树推送”ç_ç

2 个答案:

答案 0 :(得分:3)

评论中的几点评论:

所以我建议:

  • 加载(git checkout)父回购及其所有子模块
  • 在其他地方创建正确的结构,使用符号链接到子模块(或子模块的子目录,以实现您的需要。
  • 定期返回git ain父repo以检测任何更改(从Git外部创建的其他目录结构中的dones),以便提交并推送所有子模块modif,然后提交并推送父repo。 / LI>

git checkout

parent repo
  +
  +--> main project
    +
    +-> mainDir1
    +-> mainDir2
  +--> lib1
    +
    +-> lib1Dir1
    +-> lib1Dir2
  +--> lib2
    +
    +-> lib2Dir1
    +-> lib2Dir2

您自己的项目目录结构(例如)

  +--> main project (symlink to ../parent/main project)
    +
    +-> mainDir1
    +-> mainDir2
    +-> lib1Dir1    (symlink to ../parent/lib1/lib1Dir1)
    +-> lib1Dir2    (symlink to ../parent/lib1/lib1Dir2)
    +-> lib2Dir2    (symlink to ../parent/lib1/lib2Dir2)

(注意没有lib2Dir1(例如),因为在你的实际项目中你不需要它)

答案 1 :(得分:1)

VonC的解决方案很简洁,但它有一个缺点: 没有好的方法可以在某个时间点捕获项目+库的配置。

如果您需要再次设置项目,则需要检查项目+库,但它们可能都在不同的分支上,并承诺以前的内容。

因此,如果您遵循VonC的建议,可能会在您发布项目时在每个回购中创建标记,以便您至少可以在同一点再次检查它们。

否则,请始终向前移动,不要查看旧版本。