Git:大规模的重构保持更改日志

时间:2011-03-11 09:19:43

标签: git refactoring

是否可以执行大规模重构,包括移动和重命名许多目录而不会丢失Git更改跟踪?

1 个答案:

答案 0 :(得分:6)

git可以很好地处理移动/重命名目录,但要跟踪这些重命名的更改,您可能需要为您正在使用的任何命令添加一些额外的参数,或者设置几个配置选项。

这样做的原因是git只是在每次提交时存储树的状态,而不是为了从一个状态移动到另一个状态而发生的更改。如果你的源代码树中有很多文件,那么你可能需要告诉git积极尝试查找任何重命名。同样,如果您对特定文件感兴趣,则需要明确告诉git以搜索过去可能的重命名。

举一个后者的例子,典型案例是使用git log -- filename来检查特定文件的历史记录。为了告诉git在任何可能发生的重命名之前也查找它的历史记录,你必须这样做:

git log --follow -- filename

作为另一个示例,如果树中有许多文件,git log --stat的有用输出可能不包括所有重命名或副本,因为它需要检查所有文件对才能执行此操作。要在使用git loggit diff时强制git检测副本并重命名,您可以将配置选项diff.renameLimit设置为至少树中的文件数,并设置config选项{{ 1}}到diff.renames - 这意味着检测副本重命名。

或者,如果您不想将这些设置为配置选项,则可以使用copies-M选项-Cgit log。这些在JakubNarębski对这个问题的回答中有更详细的描述: