在git中撤消子模块化?

时间:2010-12-27 23:53:20

标签: git

我们的小团队认为,如果项目A的库(X,Y,Z)被分成git子模块,那将是一个很酷的主意。我们几乎没有意识到这会带来多大的痛苦,特别是因为项目仍然处于早期阶段并且还没有很好地隔离。我认为项目负责人通过git filter-branch命令创建了子目录子模块(我不能问他b / c他在度假)。

我们可以以某种方式撤消此操作,并将子模块中的提交重新插入主项目中吗?

'痛苦'的例子:

  • 项目A必须通过'git://'链接指向X,Y,Z而不是'ssh://'如果我们希望用户能够在没有ssh访问权限的情况下检查它,那么我们就无法制作如果我们想要能够推送,则通过A / X副本直接更改为X - 我们必须单独克隆它,提交,推送,然后从A / X副本中提取。
  • 此外,TortoiseGit和其他Windows工具似乎不了解子模块,或者至少它们不会像仅仅克隆一样透明,所以现在我们用愚蠢的脚本和钩子拼凑东西。
  • 哦是的 - 对于X,Y或Z中的每个更改,我们必须在主项目中添加“Submodule updated”提交。我猜测子模块适用于由不同团队维护的更成熟的项目。

3 个答案:

答案 0 :(得分:2)

我不一定推荐这个作为行动方案,ⁱ但是我写了一个脚本(unsubmodule.py),它应该删除然后将每个子模块合并为同名的子目录,保留历史记录。每个子模块的承诺版本:

https://gist.github.com/763439

我没有测试过多,所以请小心,例如最初只在新鲜克隆上尝试。该脚本不会尝试保留子模块中的任何主题分支,只是在超级模块中提交的版本。

ⁱ(两者都是因为Jonathan Leffler在他的评论中提到的原因,因为我在几个使用子模块而没有出现重大问题的项目上工作。)

答案 1 :(得分:1)

您可以非常轻松地将所有存储库合并为一个存储库,它们不需要具有任何共同点来合并它们,您只需要防止文件冲突。因此,首先将单独存储库中的所有文件移动到所需的文件夹中,它们应该位于合并的文件夹中,而不是仅仅合并这些单独的存储库。

答案 2 :(得分:1)

  

项目A必须通过'git://'链接指向X,Y,Z而不是'ssh://'如果我们希望用户能够在没有ssh访问权限的情况下将其签出,那么我们就无法制作如果我们想要能够推送,则通过A / X副本直接更改为X - 我们必须单独克隆它,提交,推送,然后从A / X副本中提取。

听起来像你想要的......

[remote "origin"]
        url = git://foobar
        pushurl = ssh://user@corp.com/srv/git/foobar
  

哦是的 - 对于X,Y或Z中的每个更改,我们必须在主项目中添加“Submodule updated”提交。

子模块的工作方式类似于跳过列表,因此可以预料到这一点。如果您不喜欢它,请考虑使用服务器端挂钩在子项目中完成提交时更新主项目。