使用Git记录文件复制操作

时间:2009-06-25 11:22:12

标签: git file copy

当我使用git-mv在git中移动文件时,状态显示该文件已被重命名,即使我改变了一些部分,它仍然认为是几乎相同的东西(这很好,因为它让我跟踪历史它)。

当我复制文件时,原始文件有一些我想与新副本关联的历史记录。

我尝试移动文件然后尝试在原始位置重新结帐 - 一旦移动git就不会让我查看原始位置。

我尝试过制作文件系统副本,然后添加文件 - git将其列为新文件。

有没有办法让git记录文件复制操作的方式与记录文件重命名/移动的方式类似,历史记录可以追溯到原始文件?

2 个答案:

答案 0 :(得分:107)

Git不会重命名跟踪也不会复制跟踪,这意味着它不会记录重命名或复制。它的作用是重命名和复制 detection 。您可以使用git diff选项在git show(和-M)中请求重命名检测,您可以使用-C选项在-C选项中请求更改文件中的其他副本检测1}}隐含-M),您可以在--find-copies-harder-C -C(隐含-C的所有文件中请求更昂贵的副本检测,这意味着-M )。请参阅git-diff联机帮助页。

您还可以配置的git总是不通过设置diff.renames为true值重命名检测(例如true1),您可以要求混帐做拷贝检测过将其设为copycopies。请参阅git-config联机帮助页。

同时检查-l的{​​{1}}选项以及相关的配置变量git diff


请注意diff.renameLimit在Git中的工作方式不同:此处git log <pathspec>是一组路径分隔符,其中path可以是(子)目录名。在重命名和复制检测发挥作用之前,它会过滤并简化历史。如果您想关注重命名和副本,请使用<pathspec>(目前有点限制,仅适用于单个文件)。

答案 1 :(得分:29)

您可以强制Git检测复制文件的历史记录:

  • 而不是复制,切换到新分支并文件移动到那里的新位置。
  • 切换到原始分支并重命名该文件。
  • 将新分支合并到原始分支中,通过保留两个文件来解决琐碎的冲突。
  • 在单独的提交中恢复原始文件名。

(解决方案取自https://stackoverflow.com/a/44036771/1389680。)