2

git历史可以被伪造吗?

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

  • 提交日期
  • 提交内容
  • 提交者的身份

如是 :

  • 有没有办法验证 git repo 的内容或使其可验证?
  • 如何知道 git 历史记录是否被修改?
4

3 回答 3

4

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

通常,当您有一个git提交 ID 时,它是迄今为止所有开发历史的加密哈希,以及包括的所有作者信息。该数据的任何变化都将是可检测的。

如果您想要额外的安全性,您可以使用 PGP 密钥签署提交git commit -S

于 2018-08-14T12:25:20.833 回答
1

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

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

有没有办法验证 git repo 的内容或使其可验证?

您可以使用 GPG 签署提交,但这仅标识作者。如果作者有恶意,这给我们带来了您的第二个问题:

如何知道 git 历史记录是否被修改?

这取决于您如何定义“修改”。据我所知,master过去指向的内容没有历史记录,因此您无法轻易区分常规分支和“修改”历史记录。您可能可以检查rev-log任何看起来很奇怪的东西。

于 2018-08-14T11:55:42.197 回答
0

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

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

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

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

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

于 2018-08-14T12:08:58.530 回答