有什么方法可以强制 git 将文件视为新文件而不是移动/复制?
用例:
index.js
Helper.js
(仅 index.js
的 10%)和重命名 index.js
至MyLib.js
. MyLib.js
将有一些与从 Helper.js
导入符号相关的小改动. index.js
作为一个新的 2 行文件,仅从 Helper.js
重新导出符号和 MyLib.js
. 我希望提交历史记录重命名
index.js
至MyLib.js
并处理 2 行 index.js
作为新的,但 git 将 MyLib.js
作为全新的,index.js
因为丢失了 99% 的内容,只剩下那 2 行。
最佳答案
简短的回答是:不,git
不允许您存储有关文件移动方式的信息。git
跟踪内容,而不是差异。
当git
显示信息:
$ git diff --name-status HEAD^ HEAD
M fileA # fileA has been modified
R oldB -> fileB # fileB has been renamed
A fileC # fileC has been created
它实际上是通过比较两个提交的内容来计算这些信息的。它没有存储信息:“实际上 fileC 是从 fileA 复制的,而 fileA 是作为新文件重新创建的”。
如果两个文件在两个提交中具有相同的名称,
git diff
将始终计算“此文件已被修改”。选项1:保留您拥有的历史,并接受它。
选项 2:您可以尝试在两次提交中进行
index.js
至MyLib.js
,MyLib.js
而不是 index.js
MyLib.js
中提取一个小类至Helper.js
, index.js
包含两行和导出符号的文件,使用选项 2,一些
git
命令(例如 git rebase
或 git log --follow
)会检测 repo 历史记录中的重命名步骤,因为它们总是一次检查一个提交的历史记录。其他一些不查看每个提交差异但查看“全局”差异的命令仍将表现为选项 1。
例如:如果您打开一个 merge 请求(想想
github
、gitlab
、Azure Devops
...), merge 请求界面仍会为您呈现:index.js
已修改,MyLib.js
是一个全新的文件关于Git - 将文件标记为新文件而不是移动/复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42700418/