如何拆分 Git 中的文件?

How do I split a file in Git?

我有源文件 A,它越来越长,包含两个大 类。我想将其拆分为文件 AB,保留历史记录和 "blame" 数据。

在 Subversion 中,这非常简单:执行 svn copy A B,删除 A 中应该只在 B 中的行,反之亦然,然后提交。但是项目的所有者遗憾地想切换到 Git,这是我不知道该怎么做的工作流程之一。

当您执行 svn log B 时,您将获得 B 拆分后的历史记录,以及 A 拆分前的历史记录。此外,svn blame B 会将拆分前的更改归因于 A 历史中的正确作者,而不是将它们归因于进行拆分的人。

首先,将原始文件复制到新文件名:

$ cp A B

接下来,从 B 和 A 中删除不需要的行,然后将新文件添加到 git 并提交:

$ git add -A
$ git commit

提交时您不需要做任何特别的事情。只需像往常一样提交新文件和删除的文件,然后在要跟踪复制的文件内容时使用 -C 选项和 git blame。 git 会自动解决所有问题。移动的文件也是如此。

另请参阅:Record file copy operation with Git

Git 没有明确跟踪重命名。相反,它会在需要的地方计算是否发生了重命名。例如,git blamegit diffgit merge 等命令可以利用 Git 的重命名检测机制。

因此,您应该只进行所需的更改并正常提交。

所以这个案例的正确步骤是:

<make the needed changes to the files>
git add A B
git commit

鉴于未明确跟踪重命名意味着重命名检测算法有时需要进行一些调整才能实现您的需要。 例如,在进行合并时,您可能需要调整 rename-threshold=<n> 以获得更好的自动合并。

如果 "renamed" 文件的相似度低于 Git 检测到的相似度,或者可以配置为检测到的相似度,则 Git 无法将其视为重命名。