Git子模块的替代品?


82

我觉得使用Git子模块在我的开发工作流程中有些麻烦。我听说过Git子树和Gitslave。

  • 是否有更多用于多个存储库项目的工具,它们之间的比较?
  • 这些工具可以在Windows上运行吗?

3
您是在谈论Git子树合并策略还是Avery Pennarun的git-subtree?两者从根本上是不同的。
kynan 2012年


3
请参阅我非官方的gitslave分支,希望比2.0.2版以来的版本更加活跃。
乔尔·普拉

1
还有git-subrepo
huggie

Answers:


101

哪种最适合您取决于您​​的需求,愿望和工作流程。从某种意义上说,它们是半同构的,只是对于某些特定任务,它们中的某些要比其他使用起来容易得多。

  • gitslave在控制和开发子项目的时间与超级项目的时间差不多的时候非常有用,此外,当您通常希望同时标记,分支,推入,拉入等所有存储库时,gitslave很有用。gitslave从未在我所知道的Windows上进行过测试。它需要perl。

  • 当您不控制子项目或者更具体地希望将子项目固定在特定版本时,即使子项目发生更改,git-submodule也会更好。git-submodule是git的标准部分,因此可以在Windows上运行。

  • git-subtree为git的内置子树合并策略提供了一个前端。如果您更希望使用一个单一存储库的“统一” git历史记录,那就更好了。与子树合并策略不同,将对不同(目录)树的更改导出回原始项目更容易,但是它不像gitslave甚至git-submodule那样自动。

  • 从理论上讲,repo与gitslave类似,但是对于我发现的非android操作,记录得不够好。它专用于Google Android开发模型,仅本地支持少数git命令(尽管您可以运行任意命令),而有限的本地支持则不支持,例如,用于推送和签出分支似乎相当困难。

  • 如果您正在使用多个版本控制系统,您将要使用kitenet的mr,但是由于其最低的公分母方法,因此kitenet的mr非常受限于仅限git的超级项目。有多种方法可以运行任意命令,但它们集成得不够好。


7
请注意,此答案中的git-subtree是(如上所述)指的是Git子树合并策略,而不是Avery Pennarun的git-subtree,这在本质上是不一样的。后者被明确设计为允许从子树中贡献出更改。
kynan 2012年

3
大故障!我很高兴看到它进行了修改,以区分git-subtree和“子树合并”,就像@kynan提到的那样。
BrianTheLion 2012年

1
@Tobu:我不认为先生运行任意命令的能力与集成git命令支持相同。我假设您在这里谈论的是类似mr run git config ...或什至(甚至更糟)配置文件方法为特定命令命名的别名。当然,如果您知道某些MR功能在阅读手册页时并不能立即显示出来,那么我想知道这一点。
塞斯·罗伯逊

4
@kynan:除了您的评论。我想指出的是,Avery的Pennarun的git-subtree现在在git 1.7.11及更高版本中可用。
slatunje 2012年

1
@sealTrip:可用,位于中git/contrib。在Ubuntu与安装sudo make install install-doc prefix=/usr libexecdir=/usr/lib/git-core从一个Git源代码树(也与包装Git的工作)。
kynan 2012年

1

我目前使用子模块进行开发,而不仅仅是相关的第三方库。有一些方法可以使子模块的工作变得更轻松,尤其是当子模块是合并或重新设置冲突的根源时。查看ls-tree以获取与子模块中的冲突有关的2个提交。这可能是人们要处理的子模块中最困难的部分。目前,脚本编写将使其更易于使用。未来的Git版本应该有更好的本机支持来处理它们。

希望这可以帮助。


0

在具有多种语言依赖性的项目中使用Git子模块时,我们遇到了类似的问题。为了解决这些问题,我们构建并开源了一个称为MDLR(“模块化”)的工具,该工具为您提供了声明式版本控制的Git依赖项,具有与Git子模块类似的功能,但没有烦人的工作流程。您可以通过GitHub存储库上的说明/下载来安装和管理依赖项


这个问题看起来不太好:github.com/exlinc/mdlr/issues/16
rjdkolb

0

对于某些用例,我喜欢以下两种简单方法中的每一种:

  • 嵌套存储库。如果您的软件项目具有插件机制,并且每个插件都在其自己的子目录中,则可以忽略这些插件目录,并在本地文件系统中将它们分别放入自己的git存储库中,这很有意义。这样,所有文件都形成一个目录树,但是在不同的git存储库中进行管理。它不会混淆git。

  • 每包存储库。对于使用某种源代码包管理系统(gem / bundler,npm,pear或类似工具)的软件项目,将重用的代码放入单独的git存储库中,然后从中创建源包是有意义的,然后使用包管理工具将它们安装到父项目中。您父项目的git存储库将仅包含对所需软件包及其版本的引用,而与所有其他软件包和外部库一样,这些软件包的实际代码也将被git忽略。与上面建议的嵌套存储库相比,这是一种更为复杂的方法,因为它允许指定要安装的软件包版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.