【发布时间】:2018-06-21 10:40:17
【问题描述】:
我已经阅读了其他问题(1、2、3)关于如何让 git 意识到具体的行动,但他们没有回答我真正的疑问:是否可以手动处理 git在提交时、提交之前或之后(更改提交内部数据)移动理解。我愿意接受标准答案,甚至愿意破解 git 存储库文件。
我认真对待这一点,因为让 git 知道文件已被移动、编辑、替换等,在最近使用任何软件查看文件版本时非常重要,因为该软件将能够相应地显示文件版本否无论开发人员移动或重命名了哪个文件。我认为这是提交者应该注意正确设置的有价值的信息,因为这样提交可以保存 更多的是FS操作,也是开发者的逻辑意图,项目编辑的真正含义。
用例:
案例一:
- 将文件
main_configuration.txt移动到configurations/production/configuration.txt - 创建
main_configuration.txt,添加与之前类似的内容,但改变几行
git 了解到您在 configuration.txt 上编辑了几行并添加了一个新文件 configurations/production/configuration.txt。但我不想忘记生产配置文件的编辑。它不是在此提交上创建的新文件:(
案例 2:
- 删除文件
a/a.txt - 创建具有相似内容的文件
b/a.txt
git 理解文件移动,但我确实需要 git 历史记录来正确解释 a/a.txt 已在此提交中被删除,并且我需要保留 b/a.txt 已在此提交中创建的数据。这是一个非常重要的信息,git 告诉的最终信息是一个严重的错误,可能会产生分析后果。
有很多例子,还有一些更符合上下文的例子,但我尽量让它们尽可能简单。
【问题讨论】:
-
Git 根本不跟踪移动或复制,所以如果你找到了一个让 git 知道你移动了文件的解决方案,你将需要在每次想要应用此解决方案时应用此解决方案。
-
基本上,如果您正在查看您移动文件的提交,如果 git 告诉您您移动或重命名了该文件,那完全是因为您用来查看该文件的工具提交通过查看哪些文件消失和哪些文件出现来“解决”。 git 存储库中绝对没有信息显示“a 已移至 b”、无、nada、zip。其中一些工具具有参数支持,可指示此“解决”算法“更加努力地工作”,仅此而已。如果失败,您将无法在包含此知识的存储库中存储任何内容。
-
这也有一个反面,如果您想考虑删除一个文件而不是添加一个单独的文件,那么您无法在存储库中存储任何将其分开的内容,因为git 工具稍后会查看该提交,它与移动然后选择性地修改文件的操作是 100% 无法区分的。 可能有助于将删除与创建分开提交,这我不知道,但我确实知道移动和复制不会被跟踪。
-
所以回答你的问题“是否可以在 git 提交上手动修改移动/新建/编辑映射?”不幸的是“不”。
-
@LasseVågsætherKarlsen 所以git能够在日志命令中显示并且可以显示here的移动信息不会存储在提交中,而是在显示时计算?