2015-05-13 29 views
1

我正在編寫一個程序,需要從同一個存儲庫(如this question,但同時提取)同時提取不同的提交。Git管道:導出樹在提交時沒有觸摸HEAD/index

瓷器命令(如git checkoutgit archive)對索引進行操作,因此無論何時需要提取提交,都需要首先移動HEAD和/或通過索引。

有沒有簡單的方法來轉儲Git樹對象到文件系統的目錄?

+2

'git archive'不在索引上運行,並且不需要修改HEAD,索引或工作目錄。 'git archive -o /tmp/somefile.tar sha1-of-old-commit'可能就是你想要的。標籤,分支名稱或其他形式的引用(例如'dev @ {3 days ago}')同樣適用於sha1參數。 – twalberg

回答

0

以編程方式執行此操作的一種方法是使用git cat-file

以批處理模式(--batch)啓動時,可以將提交ID提供給其標準輸入,並立即將該對象轉儲到標準輸出(包括標題以指示對象類型和長度)。您可以通過產生一個git cat-file進程,將對象(blob和子樹)SHA寫入其標準輸入,將blob寫入磁盤併爲樹對象遞歸來遞歸遍歷提交的樹對象。

請注意,樹對象將以二進制格式轉儲;你可以在this answer找到格式的說明。

0

您可以使用git archive導出特定的tar檔案提交,並立即將其解壓到某個目標目錄:

git archive <commit> | tar -xf - -C <output-directory> 

這也將努力爲任何樹對象,而不是<commit>