Git最佳实践:跨存储库文件夹的处理方法(TortoiseGit)

8
我相信此前已经有人回答过这个问题,但我找不到适合我的答案。最好的方法是什么,可以将一个应该保持最新的存储库集成到另一个存储库中?这个存储库应该存在于其他几个存储库中。我了解了以下两种方法:
- 子树(subtrees) - 子模块(submodules)
我尝试了子模块,但对于像我这样的Git新手来说,它似乎非常复杂。在我的想法中,当我拉取存储库时,子存储库也应该更新自己。有没有其他简单的方法我错过了?
例如:存储库Source_Global应该存在于存储库MyFramework以及MyGameEngine中。
我正在Windows上使用TortoiseGit。

如果可能的话,可以考虑使用NuGet来管理依赖项。如果不行,子模块似乎是最好的替代方案。然而,正如你所说,这很繁琐,因为每次想要更新它时,你都需要检出子模块的新版本并构建它。 - Cheesebaron
你能更具体地说明你正在使用哪些技术吗?在许多情况下,你需要寻找一个包管理器/依赖工具,例如上面提到的 NuGet,或者 Node.js 的 npm,或者用于 Web 前端项目的 Bower... - nwinkler
1
这是我们自己代码库中的 Delphi 代码,因此包管理器无法帮助。 - Krystex
在我看来,使用子树是最好的解决方案。缺点是Git扩展实际上无法处理它,因此必须使用命令行进行管理(如果不习惯使用命令行,则可能会有问题)。这里有一个关于它的教程:https://medium.com/@v/git-subtrees-a-tutorial-6ff568381844 - Jepessen
2个回答

3

距离上一次回答已经过去了几年,所以我认为重新审视这个问题是值得的。

子模块

这似乎是处理你的情况最普遍的方法(至少根据Google Trends)。但是有很多关于它难以使用的投诉。例如:

  • 必须小心保持您的子模块状态干净,避免制作损坏的提交
  • 具有子模块的仓库难以克隆
  • 无法在父仓库中查看子模块提交历史记录

子树

我认为Git实现的子树比子模块更加用户友好。子树不会受到我上面列出的任何三个问题的影响。但是TortoiseGit 仍然不支持创建、拉取或推送子树。(不过你可以查看和提交它们。)你可以尝试Atlassian Sourcetree作为替代,但那也有它自己的缺点。

我认为子树是被忽视的才华横溢的兄弟。


0

我曾经有过类似的问题,并发现在Git中子树可能是最好的解决方案。然而,目前TortoiseGit不支持子树,所以您需要使用命令行来使用该功能。

另外请注意,无论是子模块还是子树都不允许将一个存储库的部分导入到另一个存储库中(这对我很重要)。

对我来说,解决方案(可能对您没有帮助)是在Windows上使用Subversion(和TortoiseSVN),直到子树支持更好地集成和文档化。


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