Làm cách nào để tôi nén thư mục nhưng loại trừ thư mục con .git


195

Tôi đang cố gắng tạo tệp zip từ một thư mục và tôi muốn loại trừ .gitthư mục con khỏi tệp zip kết quả.

Tôi đã đi đến thư mục mẹ của thư mục tôi muốn nén ( được gọi là bitvolution ) và tôi đang làm:

zip -r bitvolution.zip bitvolution -x ".git"

Nhưng nó không loại trừ .gitthư mục con.

Tôi đã thử kết hợp khác nhau, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Tôi cũng đã thử sử dụng đường dẫn đầy đủ cho đối số loại trừ ... nhưng chỉ không đạt được điều đó.

Câu trả lời:


233

Biểu thức đúng là -x *.git*, vì vậy lệnh đầy đủ phải là:

zip -r bitvolution.zip bitvolution -x *.git*

Một lời giải thích từ http://elfsolve.com/probols/zip-command-exclude-svn-director :

Câu thần chú đúng là

zip -9 -r --exclude=*.svn*  foo.zip [directory-to-compress]

Bạn cũng có thể thêm một
--exclude=*.DS_Store*để loại trừ các tệp siêu dữ liệu hiển thị thư mục Mac OS X gây phiền nhiễu.

Lưu ý rằng biểu thức được truyền tới --excludeđang sử dụng toàn bộ đường dẫn thư mục tương đối ban đầu làm chuỗi gốc để khớp với. Vì vậy, .svn/*bản thân nó không hoạt động; ký tự đại diện ở phía trước đảm bảo rằng nó khớp với các .svnthư mục ở bất cứ đâu trong cây thư mục.


20
Tôi đã phải bọc toàn cầu trong dấu ngoặc kép hoặc thoát khỏi các dấu sao bằng dấu gạch chéo ngược, như zip --exclude '*.git*' -r directory.zip directoryhoặczip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky

6
Nếu bạn lo lắng về việc mất các tệp khác được gọi là gì đó, bất cứ điều gì, bạn cũng có thể sử dụng --exclude /.git*.
Erin Gọi

4
trong ZSH tôi đã phải thêm dấu gạch chéo ngược:-x \*.git\*
DmitrySandalov

2
Lựa chọn thay thế ưa thích của tôi cho dấu gạch chéo ngược và dấu ngoặc kép trong zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien

Làm thế nào để sử dụng nó với tar? Nó không hoạt động với lệnh tar.
RN Kushwaha

124

Nếu bạn đang cố gắng nén một dự án được lưu trữ trong Git, hãy sử dụng git archivelệnh. Từ trong thư mục nguồn:

git archive -o bitvolution.zip HEAD

Bạn có thể sử dụng bất kỳ ID cam kết hoặc thẻ thay vì HEADlưu trữ dự án tại một thời điểm nhất định.

Nếu bạn muốn thêm tiền tố (ví dụ: thư mục cấp cao nhất) vào mọi tệp:

git archive -o bitvolution.zip --prefix=bitvolution/ HEAD

Ví dụ, bạn cũng có thể điều chỉnh mức nén giữa 0 (không nén) và 9 (nén tối đa)

git archive -o bitvolution.zip -9 HEAD

Đối với các tùy chọn khác, xem trang trợ giúp ( git help archive).


25
Điều này không chỉ không bao gồm thư mục git mà còn bất kỳ thứ gì có trong tệp gitignore cũng sẽ bị loại trừ. Bạn có được một upvote.
JoeMoe1984

1
Chỉ là những gì tôi đang tìm kiếm để làm!
Bjarte

Tôi đến bữa tiệc muộn nhưng điều này hoàn toàn thổi bay tôi đi. Câu trả lời chính xác!
Tom

tôi tự hỏi tại sao đây không phải là câu trả lời hay nhất
nabtron

Đối với tôi đây là TIL lớn nhất hôm nay ...
Shawn Cicoria

27

Tôi đã thêm dấu gạch chéo ngược:

zip -r bitvolution.zip bitvolution -x \*.git\*

trang man về dấu gạch chéo ngược:

Dấu gạch chéo ngược tránh sự thay thế tên tệp shell, do đó việc khớp tên được thực hiện bằng zip ở tất cả các cấp thư mục.


chuẩn bị dấu hoa thị bằng dấu gạch chéo cho tôi trên Ubuntu 14.04 để loại trừ các thư mục
Dimitry K

6

Giả sử bạn đã cài đặt git trên máy bạn đang thực hiện việc này, bạn cũng có thể sử dụng chính git để tạo tệp lưu trữ của mình.

git archive --format=zip HEAD -o bitvolution.zip

2

Nếu bạn đang sử dụng zsh, lệnh sẽ giống như:

zip -r target_name.zip source_dir -x '/*.git/*'

Nếu bạn sử dụng : zip -r target_name.zip source_dir -x /*.git/*. không có 'regex', zsh sẽ xử lý trước khi chạy zip. Bạn sẽ nhận được thông báo lỗi:

zsh: no matches found: /*.git/*

Cảm ơn! Đó là những gì làm việc cho tôi khi sử dụng Bash trên Ubuntu trên Windows.
Adriano Monecchi

Tôi không hiểu làm thế nào mô hình này hoạt động, nhưng làm việc cho tôi tại zsh.
phù hợp
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.