git 历史可以伪造吗?

Can a git history be falsified?

git 历史可以伪造吗?

例如,我正在考虑以下信息:

如果是:

您可以相对轻松地修改提交的详细信息:How to add a changed file to an older (not last) commit in Git

但是,由于每个提交的 SHA-1 哈希都包含父提交的哈希,这会更改所有后续提交的哈希。

Are there ways to authenticate a git repo's content or make it authenticatable?

您可以sign commits using GPG,但这只能识别作者。如果作者有恶意,这就引出了你的第二个问题:

How to know if a git history was modified?

这取决于您如何定义"modified"。据我所知,master 过去指向的内容没有历史记录,因此您不能轻易区分常规分支和 "modified" 历史记录。您也许可以检查 rev-log 是否有任何看起来奇怪的东西。

所有版本控制系统(clearcase、subversion、CVS、git)历史都可以更改,如果您有权访问历史。 Git 正在分发,您拥有整个历史的副本(即分叉)。您只能更改您自己的分叉的历史记录(请参阅 答案)。

当您想分发回您的副本时,将您的更改推送到另一个分支,使用 --force 您可以覆盖目标历史记录:

  • 仅当您对目标远程分支具有写入权限时
  • 仅当远程分支未设置为只读时
  • 任何现有的分叉(除了你当前的分叉)都会注意到历史被覆盖,并会询问你要做什么(即合并)。

这通常是组织中为了避免其他用户覆盖历史记录而做的。通常只有与主要生产历史路径相关的分支(例如 branch = prod、production、master 等)。这将是定义工作流程的一部分。

许多拥有 github 镜像的组织^2 都有此设置,以确保 Github 本身(有意或无意)例如,不会覆盖历史记录。

您提到的所有字段都是用于识别提交的 SHA-1 的一部分。 因此,如果不创建新的提交就不可能更改这些字段。而新的提交意味着,没有 git 实现会接受重写的提交来替代原创,除非你强迫它。

通常,当您有一个 git 提交 ID 时,它是到那时为止所有开发历史的加密哈希,以及包括的所有作者身份信息。该数据的任何更改都将被检测到。

如果您想要额外的安全性,您可以使用 git commit -S.

使用 PGP 密钥签署提交