使用Git的子树或子模块管理外部资源

20

我读到了很多有关git子模块应该有多糟糕的文章,但我不确定这是否只是那些感觉它限制了他们的人的抱怨,还是它存在严重问题(特别是对于我的用例)。

我只是想像这样将不同的存储库包含到我的存储库中

website/
 libs/
  js/
   fs-slides [external]
   fs-dialog [external]

我需要能够轻松更新这些存储库。据我所知,没有一种简单的方法只包括来自一个repo的一个文件,对吗?(但那没关系)

我应该使用submodule吗?
还是有什么问题?或者子树更容易些?

1个回答

11

子模块非常适合您的情况,特别是因为您不介意将这些子仓库包含在它们自己的子目录中。

使用子模块可能会遇到的主要问题是在更新时出现更新正在进行时,如"Git子模块的工作原理"所述:

如果在子模块中提交时忘记设置分支,则这些提交将在分离的 HEAD 上进行,并且在下一次 git submodule update 时会丢失正在进行的更改(如果为子模块存储库激活了 reflog,则可以通过其获取它们)。

随后,正如Michael评论中提到的那样,并且正如我在上面的链接中详细说明的那样,您需要在提交和推送父仓库之前将子模块推送到其自己的上游(以避免推送未发表的子模块提交)。


1
在子模块中进行提交时,也应该记得执行 git push。因为如果你没有在主存储库中执行 git commit && git push,你就会推送一个对子模块提交的引用,而这个提交在其他地方不存在。 - Michael
@Michael 很好的观点。我已经将它包含在答案中以增加可见性。 - VonC

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