使用Git记录文件复制操作


141

当我使用git-mv在git中移动文件时,状态表明该文件已被重命名,即使我更改了某些部分,它仍然被认为是几乎相同的东西(这很好,因为它使我可以遵循它的历史记录) 。

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

我尝试过移动文件,然后尝试在原始位置重新签出-移动后的git不会让我签出原始位置。

我尝试进行文件系统复制,然后添加文件-git将其列为新文件。

有什么方法可以使git记录文件复制操作,类似于它记录文件重命名/移动的方法,从而可以将历史记录追溯到原始文件?

Answers:


112

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

您还可以配置GIT中经常做重命名检测设置diff.renames为true值(如true1),您可以要求混帐将其设置为做拷贝检测过copycopies。请参见git-config手册页。

还要检查和相关配置变量的-l选项。git diffdiff.renameLimit


请注意,它git log <pathspec>在Git 中的工作方式不同:这<pathspec>是一组路径分隔符,其中path可以是(子)目录名称。重命名和复制检测开始发挥作用之前,它可以过滤和简化历史记录。如果要遵循重命名和副本,请使用git log --follow <filename>(当前受限制,并且仅适用于单个文件)。


1
@allyourcode:您对什么感到困惑?默认情况下,要打开复印检测,请设置diff.renamescopies(例如' git config diff.renames copies')。我同意这有点违反直觉。
JakubNarębski2010年

我似乎无法解析的一个部分是“您可以请求默认情况下也重命名检测”。您是说diff.renames可以使用四个值(true,1,copy,副本),并且它们都执行相同的操作吗?
allyourcode

1
@allyourcode:对不起,我没有注意到这一点。立即修复,谢谢。
JakubNarębski2010年

4
@peschü:Git使用内容寻址对象数据库作为存储库。文件内容存储在“ blob”内容中,其地址为内容的SHA-1哈希(很好,type + length + contents)。这意味着给定的内容仅存储一次。Nb。这种自动重复数据删除是使用git pack格式创建“ bup”备份系统的原因。
JakubNarębski2014年

1
与以下解决方案不同,此方法不适用于一定范围内的更改跟踪。Git日志允许一个范围参数(git log -L123,456:file.xyz)正确地跟随重命名,但不能复制,在这种情况下,您不能传递--follow;同样,AFAICT,这不适用于git blame。
克莱门特

57

2020-05-19:以下解决方案的优点是不更改原始文件的日志,不创建合并冲突且更短。

您可以强制Git通过三次提交来检测复制文件的历史记录:

  • 代替复制,而是切换到新分支并移动文件到那里的新位置。
  • 在此处重新添加原始文件。
  • 使用no-fast-forward选项将新分支合并到原始分支--no-ff

(版权归Raymond Chen所有。)


前一个解决方案有四个提交:

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

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


7
简单,简洁,100%...这个答案是公共服务...支持一切
见闻

1
move和之间有什么区别rename
沃文

@vovan您是指在bash中您将同时使用mv这两种操作吗?对于可能涉及更改文件目录的情况,我使用了“移动”,对于没有更改的情况,我使用了“重命名”。
罗伯·波拉克

1
我尝试遵循此(新)食谱,但没有成功。如果显示了实际命令,可能会有所帮助。
格雷格·林达尔

@RobertPollak我尝试了各种版本,但没有用。“移动文件”是什么意思git mv orig new?“阅读原件”是什么意思cp new orig && git add orig
ᆼ ᆺ ᆼ
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.