git提交ID存储在哪里?

4

作为一个git仓库,我很好奇git提交ID存储在哪里以及它们是如何存储的。

是否有可能强制修改git提交ID为特定的内容,例如hello-world(或者可能是40个字符)?

4个回答

3

Git在其数据库中保存ID。

您不应更改它们的名称。如果您想对提交命名,请使用标签


2
实际上,这些提交 ID 是提交本身的哈希值;如果更改它,事情会变得非常非常糟糕。 - Marcus Müller
我不是在问我是否应该这样做,而是如果可能的话,如何去做?我想尝试一些疯狂的科学。 :-) - Ionică Bizău

3

好的,假设你现在在分支develop上。那么就会有一个名为.git/refs/heads/develop的文件。这个文件将存储指向提交的SHA哈希值。这对于所有操作而言都是入口点。对该分支所做的所有其他操作通常都是相对于此SHA进行的。

所有的Git数据库都存储在.git/objects目录中。你可以在其中找到提交记录。只需拆分提交SHA的前两个字母,并查找该名称的目录。例如,如果你的提交记录是5f352ad1adcaf5a4bfc638d53f13db62c23d34e9,则该文件可能称为.git/objects/5f/352ad1adcaf5a4bfc638d53f13db62c23d34e9。但是Git会采取许多方法来节省空间,因此如果你的Git仓库已经被打包了,则实际上它可能不叫这个名字。查看文件内容将显示压缩后的无法读取的数据。

显然,你不能将该文件重命名为其他名称并期望它能正常工作。除了名称之外,SHA哈希还用于检查文件的完整性。因此,随意更改哈希值是不可行的。


1
Git有一个名为对象数据库的数据存储。对于git而言,提交(commit)也是对象,并存储在此对象数据库中。详细信息请参见git内部文档
对象数据库中存储的每个对象都通过其SHA-1哈希进行存储。例如:
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

一个提交只是一个纯文本文件,正如你所看到的。它包含以下内容:
  • 树(tree)
  • 父提交(parent)
  • 作者(author)
  • 提交者(committer)
  • 提交信息(commit message)
因此,如果至少有一个这些属性发生变化,提交的ID才会改变。

是否有可能强制修改git提交ID为特殊的内容,例如hello-world

不可能。提交ID是对象内容的SHA-1哈希值,因此只有当对象内容发生更改时,提交ID才会更改。Git使用SHA-1来比较对象的相等性。例如,如果您执行git fetch,Git可以轻松检测到本地对象数据库中是否已经存在一个对象。

0

这是对上面答案的补充,对于那些刚开始使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接