当我使用 git-mv 在 git 中移动文件时,状态显示该文件已被重命名,即使我更改了某些部分,它仍然被认为几乎是相同的东西(这很好,因为它让我可以跟踪它的历史记录) 。
当我复制文件时,原始文件有一些历史记录,我想将其与新副本关联起来。
我尝试过移动文件,然后尝试在原始位置重新签出 - 一旦移动,git 将不允许我签出原始位置。
我尝试过进行文件系统复制,然后添加文件 - git 将其列为新文件。
有没有办法让 git 以类似于记录文件重命名/移动的方式记录文件复制操作,其中历史记录可以追溯到原始文件?
如果由于某种原因您无法开机复制检测 as in 雅库布·纳伦布斯基的回答 https://stackoverflow.com/a/1043566/1389680, 你可以forceGit 检测三个提交中复制文件的历史记录:
- 不要复制,而是切换到新分支并move将文件移动到新位置。
- 在那里重新添加原始文件。
- 使用 no-fastforward 选项将新分支合并到原始分支
--no-ff
.
致谢陈雷蒙德 https://devblogs.microsoft.com/oldnewthing/20190919-00/?p=102904。接下来是他的流程。假设文件名为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:上述方案的优点是不改变原文件的日志,不产生合并冲突,而且更短。前一个解决方案有四次提交:
- 不要复制,而是切换到新分支并move将文件移动到新位置。
- 切换到原来的分支并重命名文件。
- 将新分支合并到原始分支中,通过保留两个文件来解决细微的冲突。
- 在单独的提交中恢复原始文件名。
(解决方案取自https://stackoverflow.com/a/44036771/1389680。 https://stackoverflow.com/a/44036771/1389680.)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)