我们的小团队认为,如果项目A的库(X,Y,Z)被分成git子模块,那将是一个很酷的主意。我们几乎没有意识到这会带来多大的痛苦,特别是因为项目仍然处于早期阶段并且还没有很好地隔离。我认为项目负责人通过git filter-branch命令创建了子目录子模块(我不能问他b / c他在度假)。
我们可以以某种方式撤消此操作,并将子模块中的提交重新插入主项目中吗?
'痛苦'的例子:
答案 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”提交。
子模块的工作方式类似于跳过列表,因此可以预料到这一点。如果您不喜欢它,请考虑使用服务器端挂钩在子项目中完成提交时更新主项目。