在git回购中推送子树
我对Git很陌生:我来自SVN,在那里我发现了非常强大的:外部特性。在Git中,我没有找到类似的内容:在git回购中推送子树,git,git-subtree,Git,Git Subtree,我对Git很陌生:我来自SVN,在那里我发现了非常强大的:外部特性。在Git中,我没有找到类似的内容: 子模块非常适合添加并非总是必需的项目模块。它们必须在repo克隆后初始化,并且不能只包含原始项目的子目录 子树非常适合添加库(它们还允许包含子目录),但推动它们确实是一件痛苦的事情 所以场景是这样的:我有一个项目,我想在其中包括一些库。我希望有可能改变所有这些图书馆,并将它们纳入自己的回购协议中。此外,这些库中的一些是更大项目的子目录(例如,如果一个项目还包含演示或自述文件,我不会在我的项
- 子模块非常适合添加并非总是必需的项目模块。它们必须在repo克隆后初始化,并且不能只包含原始项目的子目录
- 子树非常适合添加库(它们还允许包含子目录),但推动它们确实是一件痛苦的事情
- +(不允许只合并子目录,或者我不能只看到它)李>
- (如上所述,不处理子曲面包含)李>
- (看不到任何关于推的东西)李>
- (看不到任何关于推的信息)
好吧,如果你已经达到了这一点,感谢你的耐心,现在我想尝试其他东西,因为现在我的结论是:“Git”çç评论中的几句话:
- 对子模块所做的任何修改
- “”说明您不能总是直接使用子模块,因为目录结构不是您所需要的
- 加载(git签出)父repo及其所有子模块
- 在其他地方创建正确的结构,并将其符号链接到子模块(或子模块的子目录),以实现所需的功能
- 定期返回git ain父repo,以检测任何更改(来自git外部创建的其他目录结构的更改),以提交并推送所有子模块modif,然后提交并推送父repo
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)