2010-07-29 34 views
5

Extracting một blob (file) từ một phiên bản tùy tiện rất dễ dàng với git show, ví dụ:Cách tốt nhất để trích xuất một cây từ kho lưu trữ git là gì?

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

Tuy nhiên, tôi muốn biết nếu có một cách tương tự trong git để trích xuất một cây (thư mục) và mọi thứ theo nó đệ quy?

Tôi đã viết một tập lệnh nhỏ để thực hiện việc này, vì vậy tôi sẽ thêm câu trả lời đó làm câu trả lời có thể. Có vẻ như đây là loại thứ có thể được xây dựng trong git, nhưng tôi chỉ không biết cách tìm nó ...

Trả lời

13

Bạn có thể sử dụng git archive cho việc này.

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

Lòng tốt, một câu trả lời ngay lập tức! Cảm ơn, đó là lý tưởng - nhanh hơn nhiều so với kịch bản của tôi. –

+1

Một phần thưởng bổ sung cho điều này là bạn có thể làm điều đó từ xa, chống lại kho lưu trữ khác (thậm chí là trần) với --remote – cxreg

0

tôi đang làm điều này vào lúc với kịch bản này:

http://gist.github.com/498447

... mà phân tích đầu ra của git ls-tree -r -z <tree-ish>. Bạn có thể vượt qua nó bất cứ điều gì mà git ls-tree có thể hiểu như một cây, ví dụ:

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

Bạn có thể sử dụng read-treecheckout-index với tệp chỉ mục tạm thời:

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

(xuống dòng thêm cho rõ ràng, nhưng nó thực sự là một lớp lót.)

Đối với kho lưu trữ trần, bạn phải giả vờ rằng một cây đang hoạt động tồn tại và bạn đang ở trong đó:

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; } 

Nếu chạy từ bên trong kho trống, bạn có thể bỏ qua cài đặt GIT_DIR.

+0

Thông minh :) Có lý do cụ thể nào để trả lời cho câu trả lời 'git archive' của bạn hay không trên tar? –

+0

@Mark Longair: Đây là một 'cấp thấp' hơn; giải pháp lưu trữ là nhiều hơn một lệnh người dùng. Tôi không biết nếu cái này hoạt động tốt hơn hay tệ hơn. Tôi giữ các câu trả lời riêng biệt vì tôi thực sự quan tâm để biết cái nào phổ biến hơn. –

+0

Như cxreg ám chỉ, với kho lưu trữ trống và git 1.7.0.4 bước "git checkout-index" không thành công với "tử vong: Thao tác này phải được chạy trong một cây làm việc". (Điều này có vẻ hơi lạ trong trường hợp GIT_INDEX_FILE được đặt và --prefix được sử dụng, tôi nghĩ vậy.) Vì vậy, tôi sẽ chấp nhận câu trả lời khác, vì trường hợp kho lưu trữ trần quan trọng đối với tôi, nhưng điều này rất hữu ích để biết - cảm ơn cả hai. –

Các vấn đề liên quan