采用一个项目,例如,具有主存储库M中的可执行源以及几个子模块S1,S2等中的从属库。决定将可执行文件中的某些代码迁移到子模块S1中的库中。使其他项目通常可以访问它。我们将主存储库和子模块都分支了,迁移过程的第一步是将N个文件从M中的目录简单地移动到S1中的特定目录(具有不同外观的路径)。天真的方法是简单地从M git rm文件,将它们移动到S1中的新目录,将cd移到子模块,然后git添加它们。当然,问题在于这些文件的所有历史记录都丢失了。这不是一个大问题,因为我不认为例如pull-merge可以跟踪从M中的文件到S1中新位置的更改,但是很好,能够以差异的形式恢复对文件进行了调整以适应其新位置以及重构前后的其他必要更改。
所以这是我的问题:是否有比简单的rm-and-add更好的方法来完成从M到S1的文件迁移,从而至少保留文件的历史记录。当然,如果它在M之内,则只需使用git-mv。我已经看到了在任意存储库之间移动文件的一些公式,但是A,我发现几乎不可能遵循它们,而B,我希望主模块和子模块之间的托管关系可以使完成起来更容易或更优雅。如果答案是出于这些目的,那么M和S1只是两个任意不同的存储库,也许有人可以用比我在其他地方看到的更好的方式来安排解释步骤。实际上,这实际上是我现在要完成的任务,因此请您提供任何相关反馈。
编辑:合理地建议这是Git: Moving files into an existing submodule的重复。这似乎是对的,这对我来说并不奇怪,但是对于拥有git的基本知识的读者来说,答案是相当简洁的。我希望对这些步骤进行分解,以更详细地描述所涉及的命令。
Edit2:在我看来,假定的重复项(以及其他类似的问题和答案)对我不起作用的原因有两个。一方面,花了很多时间阅读所有这些书,以了解正在做的事情,因为我需要加深我对git进行的模型。就是我了但是,这样做之后,现在就了解了这些拆分合并方法所发生的情况,我意识到我要解决的问题更深了-实际上,我已经开始意识到它可能很深git无法传递的独角兽。
如果您拥有一个整体存储库-没有子模块,则可以使用git mv
移动文件,它为系统提供了更多信息,而不仅仅是从一个位置删除并添加到另一个位置。它保留了历史记录,但是我相信它也允许git跟踪在已移动文件中所做的更改,而不管它们在其他本地存储库中的位置。因此,如果我将文件移动到分支中,而其他人则在他们自己的文件视图中修改文件,然后提交并推送这些更改并将其合并到主分支,那么我相信git具有足够的记账信息,可以在我进行这些更改时使用,它们在我的存储库视图中合并到新位置的文件中。 (我认为)这比保存历史要多得多。如果我从主存储库中删除文件并将其添加到子模块中,则它们在新位置中将没有历史记录,但是仍可通过已删除文件的“重影”来检索其在旧位置中的历史记录。不方便,但不是灾难性的。但是,如果有一种方法可以从其他开发人员的角度管理更改,并将更改定向到子模块中存在的文件,那就太了不起了。太神奇了,这似乎超出了git的范围。总而言之,我想我正在寻找一个可以在存储库中运行的魔术“ git mv”,而现在我考虑了一下,我怀疑这样的事情是否存在。