Bagaimana cara zip folder tetapi mengecualikan subfolder .git

196

Saya mencoba membuat file zip dari folder dan saya ingin mengecualikan .gitsub-folder dari file zip yang dihasilkan.

Saya telah membuka folder induk yang ingin saya zip ( disebut bitvolution ) dan saya lakukan:

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

Tapi itu tidak mengecualikan .gitsub-folder.

Saya sudah mencoba berbagai kombinasi, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Saya juga mencoba menggunakan path lengkap untuk argumen mengecualikan ... tetapi tidak sampai di sana.

Tom
sumber

Jawaban:

234

Ekspresi yang benar adalah -x *.git*, jadi perintah lengkapnya adalah:

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

Penjelasan dari http://selfsolved.com/problems/zip-command-exclude-svn-director :

Mantra yang benar adalah

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

Anda juga dapat menambahkan
--exclude=*.DS_Store*untuk mengecualikan file metadata tampilan direktori Mac OS X yang mengganggu.

Perhatikan bahwa ekspresi yang diteruskan --excludemenggunakan seluruh jalur direktori relatif asli sebagai string asli yang cocok dengan. Jadi .svn/*dengan sendirinya tidak bekerja; karakter wildcard di depan memastikan bahwa itu cocok dengan .svndirektori di mana saja di pohon direktori.

Yesaya
sumber
20
Saya harus membungkus gumpalan dengan tanda kutip atau melarikan diri dari tanda bintang dengan garis miring terbalik, seperti zip --exclude '*.git*' -r directory.zip directoryatauzip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky
6
Jika Anda khawatir kehilangan file lain yang disebut sesuatu. Apa pun, Anda juga dapat menggunakan --exclude /.git*.
Erin Call
4
di ZSH saya harus menambahkan backslash:-x \*.git\*
DmitrySandalov
2
Alternatif pilihan saya untuk garis miring terbalik dan kutipan di zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien
Bagaimana cara menggunakannya dengan tar? Ini tidak bekerja dengan perintah tar.
RN Kushwaha
124

Jika Anda mencoba untuk meng-zip proyek yang disimpan di Git, gunakan git archiveperintah. Dari dalam direktori sumber:

git archive -o bitvolution.zip HEAD

Anda dapat menggunakan ID komit atau tag daripada HEADmengarsipkan proyek pada titik tertentu.

Jika Anda ingin menambahkan awalan (misalnya, folder tingkat atas) ke setiap file:

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

Anda juga dapat menyesuaikan level kompresi antara 0 (tanpa kompresi) dan 9 (kompresi maksimum) inklusif, misalnya

git archive -o bitvolution.zip -9 HEAD

Untuk opsi lain, lihat halaman bantuan ( git help archive).

Blair
sumber
25
Ini tidak hanya akan tidak termasuk folder git tetapi juga segala sesuatu yang ada di file gitignore akan dikecualikan juga. Anda mendapatkan suara yang positif.
JoeMoe1984
1
Apa yang ingin saya lakukan!
Bjarte
Saya terlambat ke pesta tetapi ini benar-benar membuat saya terkejut. Jawaban bagus!
Tom
saya bertanya-tanya mengapa ini bukan jawaban terbaik
nabtron
bagi saya ini adalah TIL terhebat hari ini ...
Shawn Cicoria 8'18
27

Saya menambahkan backslash:

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

halaman manual tentang backslash:

Backslash menghindari substitusi nama file shell, sehingga pencocokan nama dilakukan oleh zip di semua level direktori.

Priit Tamboom
sumber
mengawali tanda bintang dengan forash slash untuk saya di Ubuntu 14.04 untuk mengecualikan direktori
Dimitry K
6

Dengan asumsi Anda telah menginstal git pada mesin yang Anda lakukan ini, Anda juga dapat menggunakan git sendiri untuk membuat arsip Anda.

git archive --format=zip HEAD -o bitvolution.zip
Tatu Lahtela
sumber
2

Jika Anda menggunakan zsh, perintah akan terlihat seperti:

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

Jika Anda menggunakan: zip -r target_name.zip source_dir -x /*.git/*. tanpa 'regex', zsh akan memproses sebelum menjalankan zip. Anda akan mendapatkan pesan kesalahan:

zsh: no matches found: /*.git/*
g10guang
sumber
Terima kasih! Itulah yang berhasil bagi saya menggunakan Bash di Ubuntu di Windows.
Adriano Monecchi
Saya tidak mengerti bagaimana pola ini bekerja, tetapi bekerja untuk saya di zsh.
lambang