git 历史可以伪造吗?
Can a git history be falsified?
git 历史可以伪造吗?
例如,我正在考虑以下信息:
- 提交日期
- 提交内容
- 提交者身份
如果是:
- 有没有办法验证 git 存储库的内容或使其可验证?
- 如何知道 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 密钥签署提交
git 历史可以伪造吗?
例如,我正在考虑以下信息:
- 提交日期
- 提交内容
- 提交者身份
如果是:
- 有没有办法验证 git 存储库的内容或使其可验证?
- 如何知道 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
.