2010-07-29 112 views
5

提取從任意版本斑點(文件),很容易與git show,如:從git倉庫中提取樹的最佳方式是什麼?

git show master:src/hello-world.c > /tmp/hello.c 

不過,我想知道是否有在Git中類似的方法來提取一棵樹(目錄)和它下面的所有東西遞歸?

我已經寫了一個小腳本來做到這一點,所以我將其添加爲可能的答案。似乎這是可能內置於git的那種東西,但我只是不知道如何找到它...

回答

13

您可以使用git archive這個。

git archive master:src/ | tar -C destination -x 
+0

善良,即時答案!謝謝,這是理想的 - 比我的腳本快得多。 – 2010-07-29 16:11:49

+1

還有一個額外的好處是,你可以遠程執行此操作,而使用--remote – cxreg 2010-07-30 16:59:23

0

我在這個腳本正是這樣做的:

http://gist.github.com/498447

...這解析的git ls-tree -r -z <tree-ish>輸出。你可以傳遞任何git ls-tree可以理解爲一棵樹,如:

extract-tree-from-git.py master:src/tests/ /tmp/extracted-tests/ 
extract-tree-from-git.py HEAD^ /tmp/parent-of-head/ 
6

您可以使用read-treecheckout-index一個臨時索引文件:

GIT_INDEX_FILE=.tmp.index { git read-tree master:src && 
          git checkout-index -a --prefix=dest/; 
          rm -f .tmp.index; } 

(增加了清晰度換行符,但它的真的是一行代碼)。

對於裸倉庫,你必須假裝存在一個工作樹並且你在其中:

GIT_INDEX_FILE=.tmp.index GIT_DIR=/path/to/repo.git GIT_WORK_TREE=. { 
    git read-tree master:src && 
    git checkout-index -a --prefix=/path/to/dest/; 
    rm -f .tmp.index; } 

如果從裸倉庫內部運行,則可以省略設置GIT_DIR

+0

聰明:)另一個(甚至是裸機)存儲庫是否有任何特別的理由喜歡你的'git archive'答案的答案,除了不依賴在焦油? – 2010-07-29 16:16:16

+0

@Mark Longair:這個更「低級」;歸檔解決方案更多地是用戶命令。我不知道這一個表現好壞。由於我真的有興趣知道哪一個更受歡迎,所以我保留了答案。 – 2010-07-29 16:26:50

+0

正如cxreg所暗示的那樣,在裸倉庫和git 1.7.0.4中,「git checkout-index」步驟失敗,出現「致命錯誤:該操作必須在工作樹中運行」。 (這在設置GIT_INDEX_FILE並且使用--prefix的情況下似乎有點奇怪。)因此,我會接受其他答案,因爲裸存儲庫案例對我很重要,但是這對於瞭解這一點非常有用 - 感謝這兩個。 – 2010-08-02 06:40:50

相關問題