滥用git编辑不正确的提交消息而不进行重新定位或过滤

时间:2015-08-21 18:59:39

标签: git commit rebase

我问的是{{3>}的故意不正确的版本的问题,我已经根据{{3中的提交消息内容'读取了针对提交ID的正则响应}。

只有那些可能会说“不,你会以正确的方式去做”的人:这些回复是“唯一的好方法”,我知道它。只是,我认为以正确的方式做事并不是对我有用,因为现在成本太高了;我想我已经意识到可能发生的混乱,我准备在以后支付不一致的git repo副本的价格。我也知道,从项目管理的角度来看,这不是“正确的”方法,我必须考虑到当前的项目时间。 “正确”现在可能导致失败。

问题: 敏感信息最终出现在提交消息中,该消息已经被推送了很长时间,并且随后对repo进行了大量克隆和分支。我们稍后会纠正主要的回购和克隆(例如,在我们有时间的情况下重新定位提交然后重新定义后续开发),但我必须立即从原点中删除信息。

我想要: - 更改或删除提交消息内容而不更改ID;如果导致不一致应该无关紧要,因为该提交非常陈旧,并且非常,非常不可能被重新定位/樱桃/过滤分支。 要么 - 或核对提交,重新连接其父级作为子提交的父级,而不重写后者的ID(同样的不一致问题,是的)。

或类似的东西。

我偶然发现了 git-replace 手册条目但是我不完全清楚它是否要求原始提交(内容)持续存在,或者它是否可以“核对”(或者隐藏到后续克隆操作中。)

提前谢谢你;)

ps:你可能会徘徊为什么我没有继续在原始帖子中发帖;那是因为我所要求的绝对是“非经典”,而且我不想“欺骗”那些不在我特殊情况下的用户做出非常危险的事情。

是的,我们将保留原始仓库的多个备份以防万一。

2 个答案:

答案 0 :(得分:1)

简单地说:不,这是不可能的。您将重写历史记录,当您重写历史记录时,您将生成一个新的SHA。随后,所有提交到现在替换的提交或提交的提交将会悬挂。

有些工具可以让这种操作减轻痛苦,例如BFG Repo Cleaner,但最终还是会涉及:

  • 访问包含敏感信息文件的提交
  • 编辑文件
  • 提交更改
  • 强制更改通过所有子项传播

这样做本身就不会丢失任何数据;你只是摆脱了毒害的提交。

你不能简单地替换提交内容的原因是SHA is computed for a commit的方式 - 它不仅包括文件内容之类的内容,还包括文件内容的时间和日期创建了。

最后,剥离信息仍然是一项耗时的操作,因为您必须协调从其他人的框中删除信息。无论如何,认为该秘密被泄露并改变使用它的任何系统。

答案 1 :(得分:0)

有趣 - 我不知道git replace。以下可能可以工作,但我不确定是否存在一些会被它抛出的命令。让我们说糟糕提交的哈希是66ba4c10a3d85f33c1123b5107d5857d646c13eb

git checkout 66ba4c10a3d85f33c1123b5107d5857d646c13eb
git commit --amend -m "Safe message."
git replace 66ba4c10a3d85f33c1123b5107d5857d646c13eb `rev-parse HEAD`
rm .git/objects/66/ba4c10a3d85f33c1123b5107d5857d646c13eb

前三个命令创建已清除的提交并进行替换。最后一个命令以物理方式删除原始提交对象(请注意哈希前两个字符后面的斜杠)。之后我跑了git fsck,并没有抱怨,所以它看起来很安全。

但是,这仅在提交尚未包含在 packfile 中时才有效,您的提交很可能已经提交。您应该查看git prunegit repack。此外,我不确定此替换是否会由git pushgit pull传播。即使是这样,删除也不会被删除,因此需要重复rm / prune / repack替换后)其他回购。仍然不确定如何确认提交对象完全消失。