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

San*_*ira 4 git refactoring

是否有可能做一个大规模的重构,涉及移动和重命名许多目录而不会失去Git更改跟踪?

Mar*_*air 6

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

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

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

git log --follow -- filename
Run Code Online (Sandbox Code Playgroud)

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

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