2016-12-01 43 views
0

我想在repo歷史記錄中的某個點訪問一些blob。Git:在.git目錄中獲取blob路徑

目前,我用git show $REV:$PATH來做。但是文件非常大,我不希望它們被讀取並通過腳本進行傳送。我想獲得他們的路徑,然後閱讀爲純文件。

我可以依賴當前文檔中描述的佈局(例如.git/objects/ee/2403ffd236587a2b17ddc35b0e711fc99ba6a0),獲取文件散列並將其手動轉換爲路徑?我的意思是,它在將來的版本中不會很快發生變化,對象目錄總是具有這種結構。 是否有簡單的方法來做到這一點與一些管道命令?

+1

[封裝存儲庫](https://git-scm.com/docs/git-repack)(例如,在執行'git repack -ad'之後)呢?在打包的存儲庫中,blob可能不作爲獨立文件存在。 – Leon

+1

.git/objects中的文件不是原始數據。他們被壓縮,並有一個小頭。通過直接訪問文件你什麼也得不到。 – j6t

+0

@Leon @ j6t換句話說,我想要的只是一個夢,直接訪問'.git'目錄仍然是個壞主意?我認爲blob始終保持不變... –

回答

1

雖然BLOB數據inviolablesacrosanct,它也是一個格式不可用凡人:

  • 由於j6t said in a comment,它的zlib-癟了(但是這是一個實現細節,而不是一個承諾,也就是說,你不應該打開並閱讀它,並使用zlib充氣機來恢復它,你應該讓Git爲你做)。

  • 由於Leon said in a comment,它可能已被包裝,在這種情況下,沒有解壓目標文件打開並在第一時間閱讀。相反,您必須打開包索引文件(以查找正確的包文件),然後打開正確的包文件(以查找包含查找對象及其基底的目錄的包裝數據),然後撤消xdelta樣式,但是not actually xdelta,這些項目的壓縮。

如果你想閱讀與管道命令的文件,你可以先找到哈希:

$ git rev-parse HEAD~20:Makefile 
bdb55792f11a9f9565c4aad147a492caed7f09c3 

,然後用git cat-file -p提取原始對象,或git cat-file -t得到它的類型(或--batch-check以讀取關於對象的信息等)。請注意,您可實際上只是直接傳遞的路徑,git cat-file本身以及:

$ git cat-file -t HEAD~20:Makefile 
blob 

但要注意,多了一個潛在的絆腳石:無論使用哪種git cat-file -p <blob-specifier>git show <blob-specifier>訪問Blob的內容時,你得到的資料庫內格式的數據。也就是說,在檢出特定提交時(使用git checkout),Git將提取.gitattributes文件和/或使用git config設置來查找要進行的塗抹過濾器和/或CR-LF調整。這些過濾器應用於庫內數據以生成文件的工作樹副本。但是當您使用git showgit cat-file -p訪問存儲庫數據時,沒有使用過濾器

+0

感謝您的詳細解答。是的,我知道使用管道命令可以做到這一點,但重點是獲取文件本身...我現在明白這個想法不能實現,並會使用'git show'的輸出。另外,您明確指出,git不會觸及新行符號。 –