【发布时间】:2012-07-19 23:47:59
【问题描述】:
我目前正在从 SVN 迁移到 Git。代码库是一个 10-15 个模块的大型 Maven 项目。我们曾经为每个模块都有一个 repo。
我想知道 我的 Git 存储库应该采用什么架构来处理以下用例:
- 用户可以签出 1..N 个模块。
- John 提交并推入模块 M。Emma 从超级文件夹中提取更改。
- John 提交并从超级文件夹推送模块 M 的更改。 Emma 从模块文件夹中提取更改。
- John 将文件 A 从 M1 移动(使用 git mv)到 M2,提交并推送。 Emma 在提交前编辑文件 A 更新。该文件已随着 Emma 的更改而移动。
我想到了“单一存储库”架构,但没有处理 UC#1。 'submodule'、'subtree' 和以前的 'one-module-one-repo' 无法处理 UC#4。
此外,如果大多数用例都由“子模块”架构处理,我想引入尽可能少的复杂性。子模块引入了分离头之类的概念,并且在更频繁的错误后可能会导致痛苦的修复。
我进行了广泛的搜索,但我不确定在不引入太多复杂性的情况下是否可行,但我希望你们中的一些人一定找到了解决方法。
备注:我们当前的 SVN 架构无法处理这种用例。
非常感谢,马克西姆。
【问题讨论】:
-
您的模块是否在 SVN 存储库中以 SVN 外部形式存在?据我了解,您希望在 Git 中具有相同的功能。对吗?
-
即使我的模块没有通过 externals 定义注册到超级模块中(基本上对应 git 中的子模块功能),它是精神。但是,我也希望 Git 处理用例 #4
-
如果你足够努力,你可能会想出 git 处理不同于 subversion 的各种场景。如果这是你的目标,那就坚持颠覆吧。当然,相反的情况也是可能的——在某些情况下,颠覆处理也不是最佳的。如果您的目标是迁移到 git,那么您的重点应该是确定 git 的最有效使用方式,而不是如何使 git 与您的颠覆工作流程相匹配。
-
我一定是被误解了,我很抱歉。目前,SVN 不能正确处理(所有)这些情况。我不是在寻找 Git 中的缺陷,我只是不想利用这次迁移来改进我们的工作流程,让我们的日常工作更轻松。此外,我对 Git 的功能深信不疑,这就是我来到这里的原因,目的是寻求帮助并找到更好的解决方案。
-
如果您将所有模块放在一个存储库的子目录中,我认为 SVN 会很好地处理您的用例。所以如果这些对你很重要,为什么不保留 SVN 并改变你的结构呢? (使用
svnadmin dump和svnadmin load --parent-dir,您甚至可以保留您的历史记录。)
标签: git version-control migration git-submodules