是否可以在 git 提交时手动修改 move/new/edit 映射?

Is it possible to manually modify move/new/edit mappings on a git commit?

我已经阅读了其他问题 (1, 2, 3) 关于如何让 git 实现一个具体的举动,但他们没有回答我真正的疑问:是否可以手动处理 git 在提交时、提交之前或之后(更改提交内部数据)移动理解。我愿意接受标准答案,甚至愿意破解 git 存储库文件。

我很认真地对待这件事,因为让 git 知道文件已被移动、编辑、替换等,这在最近使用任何软件查看文件版本时非常重要,因为该软件将能够相应地显示文件版本,无论开发人员移动或重命名哪个文件。我认为这是一个有价值的信息,提交者应该注意正确设置,因为这样提交可以保存 更何况是一个FS操作,也是开发者的逻辑用心,项目编辑的真谛。

用例:

案例一:

git 了解到您在 configuration.txt 上编辑了几行并添加了一个新文件 configurations/production/configuration.txt。但我不想失去对生产配置文件编辑的跟踪。它不是在此提交上创建的新文件:(

案例二:

git 理解文件移动,但我确实需要 git 历史记录来正确解释 a/a.txt 已在此提交中删除,我需要保留数据b/a.txt 已在此提交中创建。这是一个非常重要的信息,git 告诉的最终信息是一个严重的错误,可能会产生分析后果。

有很多示例,其他示例甚至更具体,但我尽量使它们尽可能简单。

我想将其作为 How does git handle moving files in the file system? 的副本来关闭,但您已经在您的问题中引用了它。我想从评论中你已经得到了答案,但让我们正式提出一个:

  • Git 存储快照。增量 — 差异 — 不要在 Git 实际处理文件的级别输入图片。 (它们确实出现 "below" 那个级别,在包文件中,如 . It's worth mentioning that these deltas, which use a modification of xdelta,不是逐行的;它们是逐字节范围的。所以这些是 不是 Git 给你看的!)

  • Git 存储程序员的意图。 Git 只存储每个文件的快照;它必须在 git diffgit show 时间,尝试重建开发人员 的 逻辑意图,如您所说。

  • 因此,正如您得出的结论,Git 能够在日志命令中显示的移动信息...不存储在提交中,而是在显示时间.

您应该将 git diff(因此 git log -p)输出视为对计算机或人类的 指令,关于如何将左侧的文件更改为使其匹配右边的文件实际上 发生的变化并不重要; Git 只是试图提出一个最小的(ish)指令集来让它再次发生,如果你想让它再次发生的话。即使您将存储库中的第一个提交与最后一个提交进行比较也是如此:Git 跳过所有中间提交,提取第一个和最后一个快照,并计算一个变更集,它将带您从从第一到最后。


作为最后的结论,为了正确记录开发人员的意图并允许以后基于软件的文件编辑历史记录,这些战略性的和可能会被误解的更改可以拆分成多个提交,以便复制、编辑、移动或删除操作是明确的,不能被两个重叠的动作隐藏。这取决于开发人员的能力,最终将更改组织成有据可查、易于理解、自我解释和高质量的提交。