git-filter-repo 回调提交或回调消息和 --preserve-commit-hashes 不起作用?

git-filter-repo callback commit or callback message and --preserve-commit-hashes not working?

我正在尝试更新提交消息,但同时要保持相同的哈希值。

我尝试了 --message-callback 和 --commit-callback 这两个选项,但无论我选择哪一个,它都会生成新的哈希值。 我是怎么做的:

python3 git-filter-repo.py --preserve-commit-hashes --message-callback (or --commit-callback) '
if b"blabla" not in message:
    message = b"MyMessage " + message
return message' --force

这是一种错误吗?或者我做错了什么?

感谢任何帮助

I'm trying to update commit messages but on same time to keep the same hash.

这是不可能的。哈希是提交的 全部内容 的加密校验和。更改 message 中的一位对校验和的影响与更改时间戳中的一位相同:新提交获得一个新的、唯一的哈希 ID。这就是其他 Git 命令(在任何计算机上)如何识别这不是 与原始提交相同的提交。如果散列 没有 更改,您将无法存储更新的提交,也无法将其发送给任何其他 Git.

这是 Git 存储模型核心的一个基本概念:哈希 ID 对象。 pigeonhole principle be damned, every bitstream must have its own unique hash ID. If you can break the hash function, you can break—or at least stymie—progress in the repository.

--preserve-commit-hashes 选项使内置的默认消息重写选项不查找类似于提交哈希 ID 的模式,在 filter-repo 生成的翻译 table 中查找它们,并使用结果。这与您想要的存储库相反,在该存储库中广泛使用 git cherry-pick -x,其中每个精心挑选的提交都会说它是对先前提交的精心挑选 [=20] =]H,对于一些哈希。filter-repo 程序试图确保首先处理较早的提交,然后在后续提交中替换过时的哈希 ID。我不知道这在实践:目标很明显,但细节变得很棘手。我不完全确定为什么这个选项存在,但如果你正在重写历史记录和一些类似于提交哈希的东西,但实际上并不是提交哈希, 正在损坏,这可能就是您使用此选项的原因。)