使用Git记录文件复制操作

3pvhb19x  于 2023-06-20  发布在  Git
关注(0)|答案(2)|浏览(144)

当我使用git-mv在git中移动一个文件时,状态显示该文件已被重命名,即使我改变了一些部分,它仍然认为几乎是相同的(这很好,因为它让我可以跟踪它的历史)。
当我复制一个文件时,原始文件有一些我想与新副本相关联的历史记录。
我试过移动文件,然后尝试在原来的位置重新 checkout -一旦移动git不会让我 checkout 原来的位置。
我试过复制一个文件系统,然后添加文件- git将其列为一个新文件。
有没有什么方法可以让git记录一个文件复制操作,就像它记录一个文件重命名/移动的方式一样,其中的历史可以追溯到原始文件?

t0ybt7op

t0ybt7op1#

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值(例如:true1),你也可以通过将其设置为copycopies来请求git进行复制检测。参见git-config手册页。
同时检查git diff-l选项和相关的配置变量diff.renameLimit

  • 请注意,git log <pathspec>在Git中的工作方式不同:这里<pathspec>是路径分隔符集合,其中path可以是(子)目录名。在重命名和复制检测发挥作用之前,它过滤并简化了历史记录。如果你想跟踪重命名和复制,请使用git log --follow <filename>(目前有点限制,只适用于单个文件)。
i7uq4tfw

i7uq4tfw2#

如果由于某种原因,你不能像Jakub Narbski的回答那样打开复制检测,你可以强制Git在三次提交中检测复制文件的历史记录:

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

这是Raymond Chen。接下来是他的程序。假设文件名为SomeFile.cpp,您希望将副本命名为SomeOtherFile.cpp

origFile=SomeFile.cpp
copyName=SomeOtherFile.cpp
branchName=duplicate-SomeFile

git checkout -b $branchName # create and switch to branch

git mv $origFile $copyName # make the duplicate
git commit -m "duplicate $origFile to $copyName"

git checkout HEAD~ $origFile # bring back the original
git commit -m "restore duplicated $origFile"

git checkout - # switch back to source branch
git merge --no-ff $branchName -m "Merge branch $branchName" # merge dup into source branch

请注意,这可以在Windows上的 Git Bash 中执行。

  • 2020-05-19:上述解决方案具有不改变原始文件的日志、不产生合并冲突以及更短的优点。前一个解决方案有四个提交:*
    • 而不是复制,切换到一个新的分支和 * 移动 * 文件到它的新位置。*
    • 切换到原始分支并重命名文件。*
    • 将新分支合并到原始分支中,通过保留两个文件来解决琐碎的冲突。*
    • 在单独提交中恢复原始文件名。*
  • (取自https://stackoverflow.com/a/44036771/1389680.)*

相关问题