2010-07-29 4 views
5

는 예를 들어, git show로 쉽게 : 나는 나무 (디렉토리)를 추출하는 자식에서 비슷한 방법이 있는지 알고 싶습니다, 그러나git 저장소에서 트리를 추출하는 가장 좋은 방법은 무엇입니까? 임의의 개정에서 BLOB (파일)을 추출

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

및 그것의 모든 것을 재귀 적으로?

나는이 작업을 수행하는 작은 스크립트를 작성 했으므로이를 가능한 대답으로 추가 할 것입니다. 이것이 git에 잘 들어 맞을 수있는 종류의 것 같지만, 나는 그것을 찾는 방법을 모른다. ...

답변

13

git archive을 사용할 수있다.

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

니스, 즉석 답변! 고마워, 내 스크립트보다 훨씬 빠르다. 이상적이다. –

+1

이것에 보너스를 더주는 것은 --remote – cxreg

0

나는이 스크립트 순간에이 일을 해요 : git ls-tree -r -z <tree-ish>의 출력을 구문 분석

http://gist.github.com/498447

을 ....

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 ls-tree이 트리로 이해할 수있는 일을 전달할 수 있습니다

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

Clever와 함께 다른 (심지어 맨손 인) 저장소에 대해 원격으로 할 수 있다는 것입니다 :'git archive' 답변에 의존하지 않는 특별한 이유가 있습니까 타르에? –

+0

@ Mark Longair :이 사람은 '저급'입니다. 아카이브 솔루션은 사용자 명령에 가깝습니다. 이 것이 더 좋든 나쁘 든간에 나는 잘 모른다. 나는 어느 것이 더 대중적인지를 진정으로 알기 때문에 답을 분리하여 보관했다. –

+0

cxreg는 맨 저장소와 git 1.7.0.4에서 "치명적 :이 작업은 작업 트리에서 실행되어야합니다"라는 단계에서 "git checkout-index"단계가 실패합니다. (이것은 GIT_INDEX_FILE이 설정되어 있고 --prefix가 사용 된 경우에 다소 이상하게 보입니다.) 그래서 맨손 저장소 사례가 중요하기 때문에 다른 대답을 받아 들일 것입니다. 그러나 이것에 관해서는 매우 유용합니다 - 둘 다 주셔서 감사합니다. –

관련 문제