存储git commit id在哪里?

时间:2015-06-30 07:54:42

标签: git

拥有一个git存储库我很好奇git commit id存储在哪里以及它们是如何存储在那里的。

是否可以强制将git commit id修改为特殊内容,例如hello-world(或者可能有40个字符)?

4 个答案:

答案 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