当我使用git-mv在git中移动文件时,状态显示该文件已被重命名,即使我更改了某些部分,它仍然认为是几乎相同的东西(这很好,因为它让我跟踪它的历史)。
当我复制一个文件时,原始文件有一些历史记录,我希望将其与新的副本相关联。
我尝试过移动文件,然后尝试在原始位置重新签出-一旦移动,git就不会让我签出原始位置。
我尝试过复制文件系统,然后添加文件- git会将其作为新文件列出。
有没有办法让git以类似于记录文件重命名/移动的方式记录文件复制操作,其中历史记录可以追溯到原始文件?
发布于 2009-06-25 12:09:01
不做重命名跟踪也不做复制跟踪,这意味着它不会记录Git重命名或复制。相反,它所做的是重命名和复制检测。您可以使用-M
选项在git diff
(和git show
)中请求重命名检测,也可以使用-C
选项在已更改的文件中请求额外的复制检测,并且可以使用-C -C
在所有文件之间请求更昂贵的复制检测。请参阅git-diff手册页。
-C -C
表示-C
,-C
表示-M
。
-M
是--find-renames
的缩写,-C
表示--find-copies
和-C -C
也可以拼写为--find-copies-harder
。
你还可以通过将diff.renames
设置为布尔型真值(例如true
或1
)来配置git始终执行重命名检测,也可以通过将其设置为copy
或copies
来请求git执行复制检测。请参阅git-config手册页。
还要检查git diff
的-l
选项和相关的配置变量diff.renameLimit
。
注意,git log <pathspec>
在Git中的工作方式不同:这里的<pathspec>
是一组路径分隔符,其中path可以是一个(子)目录名称。在重命名和复制检测开始发挥作用之前,它可以过滤和简化历史。如果你想跟踪重命名和副本,使用git log --follow <filename>
(它目前有一点限制,只适用于单个文件)。
发布于 2017-09-29 16:33:16
如果由于某些原因你不能像Jakub Nar Git bski的答案中那样打开复制检测,你可以强制ę在三次提交中检测复制文件的历史记录:
使用无快进选项--no-ff
.将新分支合并到原始分支,而不是复制
致谢给Raymond Chen。下面是他的程序。假设文件名为orig
,而您希望副本名为apple
git checkout -b dup # create and switch to branch
git mv orig apple # make the duplicate
git commit -m "duplicate orig to apple"
git checkout HEAD~ orig # bring back the original
git commit -m "restore orig"
git checkout - # switch back to source branch
git merge --no-ff dup # merge dup into source branch
2020-05-19:上述方案的优点是不改变原始文件的日志,不会造成合并冲突,而且更短。前一个解决方案有四个提交:
切换到新分支并将文件移动到其新位置并将文件重命名为原始分支,而不是复制。
https://stackoverflow.com/questions/1043388
复制相似问题