2015-06-30 102 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哈希還用於檢查文件的完整性。所以隨機字符串不會。