将文件的部分内容移动到其他文件中并保留git历史记录

6

我有一个历史复杂的大文件,其中包含许多作者的提交记录。

重构它意味着要将它分成多个小文件,但是,我需要保留历史记录。

为了更好地理解,假设我有一个包含所有代码的main文件:

function a() {}
function b() {}
function c() {}
function main() {
   a();
   b();
   c();
}

我需要将ab函数分别移动到ab文件中,同时保留main函数在main文件中--同时还需要在三个文件中保留历史记录。

我在这里找到了一些解决方案,但实际上没有任何一个在生产环境中实用。


@IMSoP的方法过于复杂和耗时。我有多个大文件需要拆分成多个子文件。 - Regis Portalez
我还没有仔细阅读,但在我看来,你可以大部分自动化雷蒙德的方法:创建各种结果文件,将它们放在存储库外的文件夹中,然后编写一个脚本循环创建每个结果文件的虚拟分支,并将它们全部合并在一起。 - IMSoP
1
我建议不要尝试保留这种历史记录。正如你所发现的那样,它会使简单的更改变得复杂。你花费的时间修改代码比进行代码考古学多得多,优化代码考古学并没有意义。 - Schwern
1
如果您想稍后查看历史记录,请查看原始文件的历史记录。 - William Pursell
1
请注意,在Git中不存在“文件历史”这样的东西:提交就是历史,仅此而已。像git loggit blame这样的程序通过读取实际(提交)历史来尝试召唤出文件历史;它们成功的程度在某种程度上取决于观察者的眼光。 - torek
显示剩余2条评论
1个回答

6

按照正常方式移动代码。Git可以帮助您阅读历史记录。

使用git blame -w -n -M -C -C -C。我喜欢将其别名为archeology

  • -w忽略微小的空格更改。
  • -n显示原始提交的行号。
  • -M检测文件内移动或复制的行。
  • -C -C -C检测任何提交中从其他文件移动或复制的行。

同样,使用git log -w -M -C -C -C

您还可以通过将代码复制到一个提交中,然后在下一个提交中更改该代码来使考古工作更轻松。然后,当您回顾责任历史记录时,会看到一个提交说“拆分文件X”。

最终,您花费的时间修改代码比进行代码考古工作多得多。优化开发过程以进行代码考古工作是没有意义的。相反,根据需要更改代码并更有效地使用Git。如果最终考古工作有点困难,那没关系;这比使开发更加困难要好。

如果你将接受变化作为开发的正常部分, 那么很快就会到来,没人会关心原始代码来自哪里。


虽然看起来这并不是OP的首要任务,但你上面的命令会让在拆分文件时合并代码变得更容易吗?我在进行一次重大的代码重构时时间不够用了,现在不幸地需要将新代码合并到重构后的分支中。大部分重命名已经完成,所以迄今为止大部分合并并不太具有挑战性;然而,还有一些文件需要拆分。我还有更多的重构工作要做,所以如果你的命令能在拆分文件时帮助“引导”合并,那就太棒了! - Todd
@Todd 这个问题如果有详细的细节会更好,回复我链接,我会看一下。然而,我的建议是尝试将重构分解成更小的增量重构。例如,重命名一个文件但不改变内容并合并它。拆分一个文件然后再合并它。 - Schwern

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