2009-10-07 88 views
15

使用OS X終端,如何在不使用git的情況下查看git對象和索引

如何以純文本的形式查看這些文件的內容?

+0

這些文件本身不支持純文本,並視其爲這樣,你需要一個程序,從他們的格式轉換成文本。。 Git是一個包含精心設計的組件的程序。如果有人再寫一篇,我會非常驚訝。 – Cascabel 2009-10-07 15:38:32

+0

那麼對象(特別是提交對象)將不會轉換爲純文本? – 2009-10-07 15:56:32

+0

它們*至少*使用zlib(deflate)壓縮進行壓縮。 – 2009-10-07 17:22:37

回答

9

看看「Object storage format」 in Git User Manual

它是使用zlib的原始壓縮數據。可以使用'zlib1g-dev'軟件包中的zpipe。編譯the examplegcc -o zpipe zpipe.c -lz。這不是一個標準.gz什麼的。

./zpipe -d < .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133 

打印BLOB的內容(頭+數據)

如果您要檢查的SHA-1,你必須把未壓縮的BLOB文件(myblob)和做

sha1sum myblob 
+0

不幸的是,這不適用於打包對象(一些已經在倉庫中一段時間​​了)。 – 2012-12-05 13:26:32

+1

你的意思是說目標文件只包含DEFLATE有效載荷,而不包含其他元數據字段,如:https://www.ietf.org/rfc/rfc1952.txt中所述,所以這就是爲什麼'gunzip'不能工作? – 2014-09-05 08:17:48

10

如果要查看Git對象的純文本形式(提交和/或斑點,即文件內容)使用Git 沒有,它不會是容易的,特別是如果儲存庫包裝。難道你不能在本地安裝git到你的主目錄(或MacOS X上的等價物)嗎?

寬鬆對象的格式,作爲文件存儲在.git/objects/扇出目錄中,例如, .git/objects/02/43019ddb4d94114e5a8580eec01baeea195133(扇出目錄和文件名稱形式的對象的SHA-1標識符)被描述,例如, 「Pro Git」書(可在線免費)和Chapter 7.1 "How Git Stores Objects"「Git Community Book」中的Chapter 9.2 "Git Objects"

格式,其中對象的集合存儲在.git/objects/pack/的單個文件中,例如, .git/objects/pack/pack-1db7aa96d95149a4dd341490a3594181a24415ee.pack,在Documentation/technical/pack-format.txt和「Git的社區書」 Chapter 7.5 "The Packfile"描述(在「臨Git的」的Chapter 9.4 "Packfiles"提到的)如果你想找到最新的提交,在.git/HEAD文件先來看看找


當前分支。它將包含如下內容:

ref: refs/heads/master 

(如果它包含SHA-1,您可以將其作爲上次提交的ID並跳過一個步驟)。然後檢查例如.git/refs/heads/master找到分支指向的地方。它將包含SHA-1的承諾,例如:

dbc1b1f71052c084a84b5c395e1cb4b5ae526fcb 

最後(最近)承諾將很可能在寬鬆的格式;在這個例子中它將在.git/objects/db/c1b1f71052c084a84b5c395e1cb4b5ae526fcb文件中。

8

我將用不同的方式解釋你的問題。如果你想了解對象文件是什麼,你可以使用git直接查看它們,而無需瀏覽歷史記錄或使用git checkout,diff等。例如:

對於文件.git/objects/04/a42e9a7282340ef0256eaa6d59254227b8b141

執行命令

git show 04a42e 

其組合來自所述/04/04剩餘數量a42e的前四個字符。

> git show 04a42e 
commit 04f7db976fa54c72fcc6350dd7d0aa06cb249df6 
Author: Alex Brown <[email protected]> 
Date: Fri Jan 8 11:02:21 2010 +0000 
a text file 

diff --git a/1.txt b/1.txt 
new file mode 100644 
index 0000000..04a42e9 
--- /dev/null 
+++ b/1.txt 
@@ -0,0 +1,3 @@ 
+Woo 
+# boo 
+# choo 

這一個是一個提交,其他目的可以是文件的斑點,樹木等

+0

這似乎是* some *問題的一個很好的答案:P – 2013-07-11 20:03:58

12
alias deflate="perl -MCompress::Zlib -e 'undef $/; print uncompress(<>)'" 

deflate .git/objects/4b/3083256dedabd68e839d7717aa785424119990 | sha1sum 
4b3083256dedabd68e839d7717aa785424119990 - 
0

該指數是.git/index下儲存。

這是一個二進制無壓縮格式,指定爲:https://github.com/git/git/blob/master/Documentation/technical/index-format.txt,因此讀取它的唯一方法是使用像hd這樣的工具。

index文件包含文件及其元數據的列表,包括inode,權限和修改時間。它還包含內容的SHA-1,將其存儲爲對象,這意味着當您執行git add時,它可能會創建新對象。

我鼓勵您創建一個簡單的測試回購,如git init init && cd init && echo a > a && git add a,然後hd .git/index以逐字段驗證格式。

下面的問題更側重於指數:What does the git index contain EXACTLY?

相關問題