【问题标题】:Pushing subtrees in a git repo在 git repo 中推送子树
【发布时间】:2012-02-22 12:34:03
【问题描述】:

我对 Git 很陌生:我来自 SVN,在那里我发现 :external 功能非常强大。在 Git 中我没有找到类似的东西:

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

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

我该怎么做?

我试过了:

好吧,如果您已经达到了这一点,感谢您的耐心等待,现在我想尝试其他方法,因为现在我的结论是:“Git 中不允许子树推送”ç_ç

【问题讨论】:

  • stackoverflow.com/questions/3131912/…: git submodules 和 external 确实不同。但是您可以更改子模块内容并推送到它的仓库:stackoverflow.com/questions/1979167/git-submodule-update/…。基本上,我的回答与stackoverflow.com/questions/9394286/… 相同
  • 好的,谢谢...但是(如果我错了,请纠正我)子模块我不能只“包含”一个特定的子模块目录?我的意思是:我的子模块有两个目录:Demos 和 Source,我想在我的父项目中包含 only Source 内容...希望可以理解...
  • 正确:子模块是它自己的 git repo:你应该检查所有内容。虽然稀疏结帐是可能的 (stackoverflow.com/a/2467629/6309),但不建议这样做。使用符号链接仅链接您想看到的内容会更好。
  • 完美...最后一个“菜鸟”问题:对于“仅使用符号链接来链接...”,您的意思是我在另一个项目中签出我的“子模块”,然后对其进行符号链接?但在这种情况下,git 会认为我正在提交与不同项目无关的“单个文件”,对吧?或者有没有办法说“嘿,他们属于另一个项目!”
  • 我已经做出了回答,以说明我提出的解决方案并解决您的最后评论。

标签: git git-subtree


【解决方案1】:

来自 cmets 的几句话:

所以我推荐:

  • 加载(git checkout)父仓库及其所有子模块
  • 在其他地方创建正确的结构,并带有指向子模块(或子模块的子目录的符号链接,以实现您的需要。
  • 定期返回 git ain 父 repo 以检测任何更改(从在 Git 之外创建的其他目录结构完成)以提交和推送所有子模块 modif,然后提交并推送父 repo。

git 结帐

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 的“缺乏”,不是吗?顺便说一句,非常感谢您的耐心等待!
【解决方案2】:

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

如果您需要重新设置项目,则需要检查您的项目 + 库,但它们可能都位于不同的分支上,并提交到您之前的内容。

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

否则,请始终前进,永远不要签出旧版本。

【讨论】:

    猜你喜欢
    • 2021-12-19
    • 2020-05-26
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多