拥有一个git存储库我很好奇git commit id存储在哪里以及它们是如何存储在那里的。
是否可以强制将git commit id修改为特殊内容,例如hello-world
(或者可能有40个字符)?
答案 0 :(得分:3)
Git将id保存在其数据库中。
你不应该改变他们的名字。如果要为提交命名,请改用Tags。
答案 1 :(得分:2)
好的,让我们说你在分行develop
。然后会有一个名为.git/refs/heads/develop
的文件。这将存储它指向的提交的SHA哈希。出于所有意图和目的,这是所有操作的切入点。此分支完成的所有其他操作通常都与此SHA相关。
所有git数据库都存储在.git/objects
目录中。你可以在那里找到提交。只需拆分提交SHA的前两个字母,然后查找该名称的目录。例如,如果您的提交是5f352ad1adcaf5a4bfc638d53f13db62c23d34e9
,则可能会调用该文件
.git/objects/5f/352ad1adcaf5a4bfc638d53f13db62c23d34e9
。但是git做了很多事情来节省空间,所以如果你的git repo已被打包,它可能不会被称为。在文件中查看将显示压缩的不可读数据。
显然,您无法将该文件重命名为其他内容并希望它能够正常运行。除了命名之外,SHA哈希还用于检查文件的完整性。所以随机字符串不会发生。
答案 2 :(得分:1)
Git有一个名为object database的数据存储。提交也是git的对象并存储在此对象数据库中。有关详细信息,请查看git internals documentation。
存储在对象数据库中的每个对象都由它的SHA-1哈希存储。 E.g。
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才会更改。
是否可以强制将git commit id修改为特殊内容,例如
hello-world
没有。 commit id是对象内容的SHA-1哈希值,因此只有在对象的内容发生更改时才会更改。 Git使用SHA-1比较对象是否相等。例如。如果您执行git fetch
,git可以轻松检测对象是否已存在于本地对象数据库中。
答案 3 :(得分:0)
这是上述答案的补充,可能对那些开始使用GIT的人有所帮助。
使用'git init'
命令初始化git后
每次我们运行类似
回声“你好,世界” | git hash-object --stdin -w
Git生成一个哈希,例如
6b820fd9037ce516d22549dde403f3bb9a41ad8e
,长度为40个字符。 这保存在Git数据库中;项目文件夹的路径。
转到.git文件夹,然后转到objects文件夹,该文件夹包含生成的HASH的前两个字母,此处将出现 6b
,其余文件将包含38个字符出现在里面。
此外,如果要解压缩HASH,请运行以下命令:
git cat文件6b820fd9037ce516d22549dde403f3bb9a41ad8e -p
其中 -p
表示打印原始内容,这里hello-world