作为一个git仓库,我很好奇git提交ID存储在哪里以及它们是如何存储的。
是否有可能强制修改git提交ID为特定的内容,例如hello-world
(或者可能是40个字符)?
作为一个git仓库,我很好奇git提交ID存储在哪里以及它们是如何存储的。
是否有可能强制修改git提交ID为特定的内容,例如hello-world
(或者可能是40个字符)?
Git在其数据库中保存ID。
您不应更改它们的名称。如果您想对提交命名,请使用标签。
好的,假设你现在在分支develop
上。那么就会有一个名为.git/refs/heads/develop
的文件。这个文件将存储指向提交的SHA哈希值。这对于所有操作而言都是入口点。对该分支所做的所有其他操作通常都是相对于此SHA进行的。
所有的Git数据库都存储在.git/objects
目录中。你可以在其中找到提交记录。只需拆分提交SHA的前两个字母,并查找该名称的目录。例如,如果你的提交记录是5f352ad1adcaf5a4bfc638d53f13db62c23d34e9
,则该文件可能称为.git/objects/5f/352ad1adcaf5a4bfc638d53f13db62c23d34e9
。但是Git会采取许多方法来节省空间,因此如果你的Git仓库已经被打包了,则实际上它可能不叫这个名字。查看文件内容将显示压缩后的无法读取的数据。
显然,你不能将该文件重命名为其他名称并期望它能正常工作。除了名称之外,SHA哈希还用于检查文件的完整性。因此,随意更改哈希值是不可行的。
echo 'test content' | git hash-object -w --stdin
d670460b4b4aece5915caf5c68d12f560a9fe3e4
由于提交只是一个对象,因此也会被存储为其SHA-1哈希值。您可以使用git cat-file
查看提交对象的内容。以下是来自apache commons-io存储库的示例。
git cat-file -p 35f306967d0641e7d49cafb25938a4f69a36e77a
tree 289b9d5a11b7f52d330e86a30fd1c7d138703f4b
parent c57af0ad5604e8280884f6183e05eb30751883ef
author Sebastian Bazley <sebb@apache.org> 1431094588 +0000
committer Sebastian Bazley <sebb@apache.org> 1431094588 +0000
Each Version must be in its own release section
git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/trunk@1678358 13f79535-47bb-0310-9956-ffa450edef68
不可能。提交ID是对象内容的SHA-1哈希值,因此只有当对象内容发生更改时,提交ID才会更改。Git使用SHA-1来比较对象的相等性。例如,如果您执行是否有可能强制修改git提交ID为特殊的内容,例如
hello-world
?
git fetch
,Git可以轻松检测到本地对象数据库中是否已经存在一个对象。这是对上面答案的补充,对于那些刚开始使用GIT的人可能会有所帮助。
在使用'git init'
命令初始化git之后,
每次运行像
echo "hello-world" | git hash-object --stdin -w
这样的命令时,Git会生成一个哈希值,例如
6b820fd9037ce516d22549dde403f3bb9a41ad8e
这是一个40个字符长的内容。
它保存在Git数据库中,路径位于您的项目文件夹中。
进入.git文件夹,然后进入objects文件夹,其中将存在一个以生成的哈希的前两个字母命名的文件夹,例如6b
,并且其中将存在一个包含其余38个字符的文件。
此外,如果我们想要解压哈希,请运行以下命令:
git cat-file 6b820fd9037ce516d22549dde403f3bb9a41ad8e -p
其中-p
表示打印原始内容,在这里是hello-world
。