2015-06-30 100 views
3

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

是否有可能强制修改一个git commit id到一些特殊的东西,例如hello-world(或可能有40个字符)?

回答

1

Git有一个称为对象数据库的数据存储。提交也是git的对象,并存储在这个对象数据库中。详情请看git internals documentation

存储在对象数据库中的每个对象都被它的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 <[email protected]> 1431094588 +0000 
committer Sebastian Bazley <[email protected]> 1431094588 +0000 

Each Version must be in its own release section 

git-svn-id: https://svn.apache.org/repos/asf/commons/proper/io/[email protected] 13f79535-47bb-0310-9956-ffa450edef68 

提交只是一个纯文本文件,你可以看到。它包含

  • 作者
  • 提交者
  • 提交信息

所以,如果这些属性中的至少一个改变提交的ID唯一变化。

是否可以强制修改的git提交ID为一些特别的东西,例如hello-world

号提交ID是对象的内容的SHA-1散列,因此它只会改变如果对象的内容改变。 Git使用SHA-1比较对象是否相等。例如。如果你做了一个git fetch,git可以很容易地检测出一个对象是否已经存在于你的本地对象数据库中。

3

Git将ID保存在它的数据库中。

你不应该改变他们的名字。如果您想命名提交,请改为使用Tags

+2

实际上,这些提交ID是提交本身的散列;如果你改变了这一点,事情会变得非常非常错误。 –

+0

我不是问我是否应该,但如果可能的话,如果可能的话,如何?我想尝试一些疯狂的科学。 :-) –

2

好吧,让我们假设你在分支develop。然后会有一个名为.git/refs/heads/develop的文件。这将存储它指向的提交的SHA哈希值。对于所有意图和目的而言,这是所有操作的切入点。对这个分支所做的一切通常都与这个SHA相关。

所有git数据库都存储在.git/objects目录中。你可以在那里找到提交。只需拆分SHA的前两个字母并查找该名称的目录即可。例如,如果您的提交是5f352ad1adcaf5a4bfc638d53f13db62c23d34e9,则该文件可能被称为 .git/objects/5f/352ad1adcaf5a4bfc638d53f13db62c23d34e9。但git做了很多事情来节省空间,所以如果你的git回购已经被打包,毕竟它可能不会被调用。在文件中偷看会显示压缩的不可读数据。

显然,您不能将该文件重命名为其他内容,并期望它可以正常工作。除了命名之外,SHA哈希还用于检查文件的完整性。所以随机字符串不会。