4

我有源文件A,它越来越长并且包含两个大类。我想将其拆分为文件A,并B保留历史记录和“责备”数据。

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

当你这样做时svn log B,你会得到B's 分裂后的历史,加上A' 分裂前的历史。此外,svn blame B会将拆分前的更改归因于 历史中的正确作者A,而不是将其归因于进行拆分的任何人。

4

3 回答 3

4

Git 没有明确地跟踪重命名。相反,它会在需要时计算是否发生了重命名。例如,像git blame,git diff和之类的命令git merge可以利用 Git 的重命名检测机制。

出于这个原因,您应该只进行所需的更改并正常提交。

因此,这种情况下的正确步骤是:

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

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

如果“重命名”文件的相似性低于 Git 检测到的,或者可以配置为检测到,那么 Git 无法将其视为重命名。

于 2015-08-07T20:54:31.140 回答
0

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

$ cp A B

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

$ git add -A
$ git commit
于 2015-08-07T20:53:15.187 回答
0

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

另请参阅:使用 Git 记录文件复制操作

于 2015-08-07T20:53:44.463 回答