git 历史记录可以被伪造吗?



git 历史可以被伪造吗?

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

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

如果是:

  • 有没有办法对 git 存储库的内容进行身份验证或使其可进行身份验证?
  • 如何知道 git 历史记录是否被修改?

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

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

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

您可以相对轻松地修改提交的详细信息: 如何将更改的文件添加到 Git 中的较旧(不是最后一个(提交

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

有没有办法对 git 存储库的内容进行身份验证或使其可进行身份验证?

您可以使用 GPG 对提交进行签名,但这只能标识作者。如果作者有恶意,这就引出了你的第二个问题:

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

这取决于您如何定义"修改"。据我所知,过去没有关于master所指的历史,所以你不容易区分常规分支和"修改"的历史。您也许可以在rev-log中检查是否有任何看起来奇怪的内容。

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

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

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

这通常是在组织中所做的,以避免其他用户覆盖历史记录。并且通常只有与主生产历史路径相关的分支(例如分支 = prod、生产、主节点等(。这将是定义工作流的一部分。

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

最新更新