【问题标题】:How to change the SHA-1 of a specific commit in place with git?如何使用 git 更改特定提交的 SHA-1?
【发布时间】:2011-08-16 07:39:32
【问题描述】:

目标提交可能有父母和后代。

它需要替换旧的提交就地

所以它不像cherry 命令那么简单。

我的问题将等待确切解决方案。

【问题讨论】:

  • 给定提交的哈希取决于一堆东西,包括内容、作者、日期和其父节点的哈希。如果您更改提交的哈希(通过--amend 或变基),这也将更改其所有“子”的哈希。你可以用移植物来伪造它,但我认为你所要求的精确是不可能的。
  • 也许您可以告诉我们您要解决的问题(而不是您想要的解决方案)?

标签: git


【解决方案1】:

不,你不能那样做。

SHA-1 的目的是防止此类更改。整个 git 架构依赖于 SHA-1 唯一标识所有 git 存储库中的对象的假设。没有办法解决这个问题(也就是说,必须重新设计一切)。

详情在Git Magic book中解释。

【讨论】:

  • 这不太可能,但仍有机会。这就是我的问题所依据的。
  • 它是为了“...防止意外或恶意的数据损坏。”。计算机将变化视为变化,您所做的与“恶意数据损坏”相同。 git 列表上有一些讨论,搜索 SHA-512 就可以了。
  • 如果您对可能发生的理解有疑问,请参阅此答案下的 cmets(尽管机会很小):stackoverflow.com/questions/7062192/about-gits-merge-and-rebase/…
  • 事实上。 Git 不存储 changes(就像 diff,像 cvs 一样),它存储 statetreeish 事物)。如果你想(比方说)删除一个文件,你需要更改所有包含该文件的提交。
  • 我知道 git 存储的是快照而不是增量,感谢之前的回答:)
【解决方案2】:

我不熟悉 Git,但在 Mercurial 中,您可以这样做:从存储库中弹出最新的提交并将其保存在“补丁”中 (hg qimport)。结果是没有任何最新提交痕迹的 repo 加上一个可以为您提供起始状态的补丁。

所以方法是从 repo 中弹出东西,直到提交修改成为 HEAD。也弹出它,修改补丁(或在不提交的情况下应用补丁并修改工作区)。

现在您可以提交新版本并应用所有其他补丁。

由于 Git 和 Mercurial 非常相似,可能有一个 Git 命令可以实现相同的功能,但我不知道它的名称。也许这个答案可以帮助:https://serverfault.com/questions/12373/how-do-i-edit-gits-history-to-correct-an-incorrect-email-address-name

【讨论】:

  • 更改别人的提交可能不礼貌……最好只更改自己的提交。
  • “更好”是错误的术语。如果您的新提交与其他人的提交发生冲突,您将不得不进行更改。这不是“好/坏”的问题,而是纯数学的问题。如果这不适合您,Git、Mercurial 和任何其他 DVCS 都不是适合您的工具。
  • Git 也可以做到这一点(在 Hg 之前)。但是提问者希望保留 commitid(长的,而不是本地的单号)——我认为 Hg 做不到。
  • @J-16:我看不出他说他想在哪里保留提交 ID。问题是“如何更改 SHA-1 ...”
【解决方案3】:

好的,让我们看看这是否有帮助。

警告:

  • 这个中断(一些)拉/推/取。
  • 并不是所有的 git 命令都支持这个。
  • 不与其他用户共享。
  • 这不会更改提交,而是替换它。

您确定要这样做吗? 如果是,请向下滚动。


这称为graft point。您创建了一个文件 .git/info/grafts 并拥有以下信息:

<commit-id> <new-parent-of-the-commit>

假设你有这个:

/---D
A---B---C

现在你想用D 替换B(不改变提交ID),你把它放在嫁接中:

<commit-id-of-C> <commit-id-of-D>

它保留了旧的commitid,但有上述限制。

【讨论】:

  • (我又撒谎了,git 1.6.6 有git-replace。但它更丑。丑到我不解释了。检查ProGit 博客,如果你愿意)
  • 您可以使用 git filter-branch 将其永久化,但这确实会重写您说您不想要的提交 SHA1 值...
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 2013-02-13
相关资源
最近更新 更多