2010-05-04 36 views

Trả lời

21

Tôi biết điều này là cũ, nhưng tôi nghĩ rằng tôi đã tìm thấy một giải pháp.

Run:

stashName=`git stash create`; 
git archive <options> $stashName 

Kể từ git muốn một chất rắn cam kết thực hiện một kho lưu trữ, chúng ta có thể làm cho một 'một off' cam kết sử dụng git stash. Lệnh create chỉ tạo cam kết stash (không đặt lại thư mục làm việc của bạn hoặc đẩy nó vào ngăn xếp stash) và trả về giá trị băm cho nó.

Nếu bạn lo lắng về khoảng trống từ cam kết lơ lửng, bạn có thể làm sạch nó bằng git gc --prune=now. Nếu không, chỉ cần chờ 2 tuần và nó sẽ biến mất.

+0

Các công trình lớn, cảm ơn! –

2

Nếu bạn chưa cam kết thay đổi, thì git archive sẽ không giúp bạn. Nếu bạn chỉ muốn một ảnh chụp nhanh của khu vực làm việc của bạn, tar có lẽ là đặt cược tốt nhất của bạn.

11

Cải thiện câu trả lời nevsan cho mục đích của tôi - để lưu trữ mã mới nhất trong mọi trường hợp (cam kết hay không):

uploadStash=`git stash create`; git archive -o code_outgoing.zip ${uploadStash:-HEAD} 
+3

Đã sửa lỗi: git stash create [now] luôn trả về thành công và không in được gì khi không có tệp để lưu trữ. Sử dụng cú pháp $ {var: -default} thay vì dựa vào mã thoát. –

+0

IIRC có một vấn đề với điều này, nó không đưa ra các tập tin git-gỡ bỏ từ kho lưu trữ. –

3

Một giải pháp với git ls-files:

git ls-files -z | xargs -0 tar -czvf archive.tar.gz 
+1

Đây là, theo tôi, câu trả lời hay nhất. Tuy nhiên, tôi khuyên bạn nên sử dụng tùy chọn -z của ls-files và tùy chọn -0 (zero) của xargs sao cho tên tệp có không gian được xử lý chính xác: git ls-files -z | xargs -0 tar -czvf archive.tar.gz . – S2108887

+0

Bạn hoàn toàn đúng! Cảm ơn. Tôi đã thêm các tùy chọn này vào dòng lệnh. –

+0

'git ls-files | tar Tczf - archive.tar.gz' không có giới hạn áp đặt hệ thống trên kích thước của một lệnh duy nhất của args. xargs không tốt cho bất kỳ lệnh nào bạn thực sự chỉ cần chạy một lần cho mọi thứ. – jthill

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