Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在git回购中推送子树_Git_Git Subtree - Fatal编程技术网

在git回购中推送子树

在git回购中推送子树,git,git-subtree,Git,Git Subtree,我对Git很陌生:我来自SVN,在那里我发现了非常强大的:外部特性。在Git中,我没有找到类似的内容: 子模块非常适合添加并非总是必需的项目模块。它们必须在repo克隆后初始化,并且不能只包含原始项目的子目录 子树非常适合添加库(它们还允许包含子目录),但推动它们确实是一件痛苦的事情 所以场景是这样的:我有一个项目,我想在其中包括一些库。我希望有可能改变所有这些图书馆,并将它们纳入自己的回购协议中。此外,这些库中的一些是更大项目的子目录(例如,如果一个项目还包含演示或自述文件,我不会在我的项

我对Git很陌生:我来自SVN,在那里我发现了非常强大的:外部特性。在Git中,我没有找到类似的内容:

  • 子模块非常适合添加并非总是必需的项目模块。它们必须在repo克隆后初始化,并且不能只包含原始项目的子目录
  • 子树非常适合添加库(它们还允许包含子目录),但推动它们确实是一件痛苦的事情
所以场景是这样的:我有一个项目,我想在其中包括一些库。我希望有可能改变所有这些图书馆,并将它们纳入自己的回购协议中。此外,这些库中的一些是更大项目的子目录(例如,如果一个项目还包含演示或自述文件,我不会在我的项目中包含这些目录)

我该怎么做

我试过:

  • +(不允许只合并子目录,或者我不能只看到它)
  • (如上所述,不处理子曲面包含)
  • (看不到任何关于推的东西)
  • (看不到任何关于推的信息)

好吧,如果你已经达到了这一点,感谢你的耐心,现在我想尝试其他东西,因为现在我的结论是:“Git”çç

评论中的几句话:

  • 对子模块所做的任何修改
  • “”说明您不能总是直接使用子模块,因为目录结构不是您所需要的
因此,我建议:

  • 加载(git签出)父repo及其所有子模块
  • 在其他地方创建正确的结构,并将其符号链接到子模块(或子模块的子目录),以实现所需的功能
  • 定期返回git ain父repo,以检测任何更改(来自git外部创建的其他目录结构的更改),以提交并推送所有子模块modif,然后提交并推送父repo
git签出

parent repo
  +
  +--> main project
    +
    +-> mainDir1
    +-> mainDir2
  +--> lib1
    +
    +-> lib1Dir1
    +-> lib1Dir2
  +--> lib2
    +
    +-> lib2Dir1
    +-> lib2Dir2
以及您自己的项目目录结构(例如)


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

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

如果需要重新设置项目,则需要签出项目+库,但它们可能都位于不同的分支上,并提交给以前的项目

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


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

:git子模块和external确实不同。但您可以更改子模块内容并推送到其repo:。基本上,我的答案与ok相同,谢谢……但是(如果我错了,请纠正我)子模块我不能“包括”只有一个特定的子模块目录??我的意思是:我的子模块有两个目录:Demos和Source,我只想在我的父项目中包含源内容…希望这是可以理解的…正确:子模块本身就是git repo:您应该签出所有内容。而稀疏签出是可能的(),不推荐使用。使用symlink仅链接您希望看到的内容更好。完美…最后一个“noob”问题:“仅使用symlink链接…”您的意思是我在另一个项目中签出我的“子模块”,然后对其进行symlink?但在这种情况下,git会认为我提交了“单个文件”与其他项目无关,对吗?或者有没有一种方式可以说“嘿,他们是另一个项目的!”我已经做了一个答案来说明我提出的解决方案,并回应你的最后评论。谢谢,你的答案真的是一个我从未想过的好主意。但现在我明白这不是我想要的…我的意思是:如果我想克隆项目,我必须用你的解决方案来做符号链接,所以这不是我想要的交钥匙解决方案提供。是的,这比我以前的子树解决方案简单得多,但现在我认为这是Git的“缺乏”,不是吗?顺便说一句,非常感谢您的耐心!!
  +--> 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)