【问题标题】:Is it possible to manually modify move/new/edit mappings on a git commit?是否可以在 git 提交上手动修改移动/新建/编辑映射?
【发布时间】:2018-06-21 10:40:17
【问题描述】:

我已经阅读了其他问题(123)关于如何让 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的移动信息不会存储在提交中,而是在显示时计算?

标签: git git-rewrite-history


【解决方案1】:

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

  • Git 存储快照。 Deltas-diffs-不要在 Git 实际处理文件的级别上输入图片。 (它们确实出现在该级别的“下方”,在包文件中,如Lasse Vågsæther Karlsen notes in a comment。值得一提的是,这些使用xdelta 修改的增量不是逐行的;它们是字节范围的-按字节范围。所以这些不是 Git 显示给你的!)

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

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

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


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

【讨论】:

  • 谢谢。我编辑了您的答案,以添加我最终用于实现目标的实际案例,但是对于发布的问题,解释是 100% 完美的。
  • 好的。 (我将在那里编辑一些错别字并添加一条分割水平线)
猜你喜欢
  • 2016-03-22
  • 2021-05-14
  • 2012-02-21
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2016-08-17
  • 2016-02-08
  • 2014-02-02
相关资源
最近更新 更多