推送 Git 仓库中的子树

5

我对Git还很陌生:我之前使用SVN,那里有一个非常强大的:external功能。在Git中,我没有找到类似的东西:

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

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

我该如何做到这一点?

我尝试过:

好吧,如果您已经到达这个地步,感谢您的耐心,现在我想尝试其他东西,因为我现在的结论是:“在Git中不允许子树推送” ç_ç


git子模块和外部不同。但是你可以更改子模块内容并将其推送到其存储库:https://dev59.com/mXI-5IYBdhLWcg3wMFMf#1979194。基本上,我的答案与http://stackoverflow.com/questions/9394286/planning-repository-layout-for-git-migration/9395375#9395375相同。 - VonC
好的,谢谢...但是(如果我理解错了,请纠正我)使用子模块时,我不能仅“包含”特定的子模块目录吗?我的子模块有两个目录:Demos和Source,我想在父项目中仅包含Source内容...希望这样清楚明白... - noliv-mov
正确的翻译:子模块是一个独立的git仓库:您应该检出所有内容。虽然可以使用稀疏检出(https://dev59.com/WHE95IYBdhLWcg3wE52C#2467629),但不建议这样做。使用符号链接只链接您想要查看的内容更好。 - VonC
完美...最后一个“新手”问题:对于“使用符号链接仅链接...”,您的意思是我在另一个项目中检出我的“子模块”,然后创建符号链接吗?但在这种情况下,git会认为我正在提交与不同项目无关的“单个文件”,对吧?还是有一种方法可以说“嘿,它们属于另一个项目!”? - noliv-mov
我已经给出了一个答案来说明我提出的解决方案并回应了您的最后一条评论。 - VonC
2个回答

3

以下是评论中的一些要点:

因此,我建议:

  • 加载(git checkout)父级仓库及其所有子模块
  • 在其他地方创建正确的结构,并使用符号链接连接到子模块(或子模块的子目录),以实现您的需求。
  • 定期返回git主父级仓库,以检测任何更改(从Git之外创建的其他目录结构),以便提交和推送所有子模块修改,然后提交和推送父级仓库。

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这样的目录(例如),因为在您实际的项目中不需要它。


谢谢,你的回答真是一个绝妙的想法,我从未想过。但现在我明白这不是我要找的...我的意思是:使用你的解决方案,如果我想克隆项目,我必须做符号链接,所以它不是我想提供的一站式解决方案。是的,它比我之前使用子树的解决方案更容易,但现在我会认为这是 Git 的“缺陷”,不是吗?顺便说一句,非常感谢你的耐心!! - noliv-mov

1

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

如果您需要重新设置项目,则需要检出项目+库,但它们可能都在不同的分支和提交中,与之前的不同。

因此,如果您遵循VonC的建议,可以在每个存储库中创建标记,以在发布项目时的同一点再次检出它们。

否则,始终向前移动,永远不要检出旧版本。


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