Bir klasörü nasıl sıkıştırırım ancak .git alt klasörünü hariç tutarım


194

Bir klasörden bir zip dosyası oluşturmaya çalışıyorum ve .gitalt klasörü ortaya çıkan zip dosyasından çıkarmak istiyorum .

Ziplemek istediğim birinin ( bitvolution ) ana klasörüne gittim ve yapıyorum:

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

Ancak .gitalt klasörü dışlamaz .

Ben, çeşitli kombinasyonları denedim -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Dışlama bağımsız değişkeni için tam yolu kullanmayı da denedim ... ... ama oraya ulaşamadım.

Yanıtlar:


232

Doğru ifade, -x *.git*tam komut şöyle olmalıdır:

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

Http://selfsolved.com/problems/zip-command-exclude-svn-director adresinden bir açıklama :

Doğru teşvik

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

Ayrıca
--exclude=*.DS_Store*can sıkıcı Mac OS X dizin ekranı meta veri dosyalarını dışlamak için bir ekleyebilirsiniz .

İletilen ifadenin --exclude, orijinal göreli dizin yolunun tamamını eşleşecek orijinal dize olarak kullandığına dikkat edin. Yani .svn/*kendi başına çalışmıyor; öndeki joker karakter .svn, dizin ağacındaki herhangi bir yerdeki dizinlerle eşleşmesini sağlar .


20
Glob'u tırnaklara sarmak ya da ters eğik çizgilerle yıldızlardan kaçmak zorunda kaldım, zip --exclude '*.git*' -r directory.zip directoryya dazip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky

6
Bir şey olarak adlandırılan diğer dosyaları kaybetme konusunda endişeleriniz varsa, kullanabilirsiniz --exclude /.git*.
Erin

4
-x \*.git\*
ZSH'de

2
Ters eğik çizgi ve tırnak zsh tercih benim alternatif:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien

Tar ile nasıl kullanılır? Tar komutuyla çalışmıyor.
RN Kushwaha

123

Git'te depolanan bir projeyi sıkıştırmaya çalışıyorsanız, git archivekomutu kullanın. Kaynak dizinin içinden:

git archive -o bitvolution.zip HEAD

HEADProjeyi belirli bir noktada arşivlemek yerine herhangi bir taahhüt veya etiket kimliğini kullanabilirsiniz .

Her dosyaya bir önek (örneğin, üst seviye bir klasör) eklemek istiyorsanız:

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

Ayrıca sıkıştırma seviyesini 0 (sıkıştırma yok) ve 9 (maksimum sıkıştırma) dahil arasında ayarlayabilirsiniz, örneğin

git archive -o bitvolution.zip -9 HEAD

Diğer seçenekler için yardım sayfasına bakın ( git help archive).


25
Bu sadece git klasörünü içermeyecek, aynı zamanda gitignore dosyasındaki herhangi bir şey de dışlanacaktır. Efendim, bir oy hakkınız olsun.
JoeMoe1984

1
Sadece yapmak istediğim şeydi!
Bjarte

Partiye geç kaldım ama bu kesinlikle beni mahvetti. Mükemmel cevap!
Tom,

neden bu en iyi cevap değil merak ediyorum
nabtron

benim için bu bugün en büyük TIL oldu ...
Shawn Cicoria

27

Ters eğik çizgi ekledim:

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

backslash hakkında man sayfası:

Ters eğik çizgi, kabuk dosya adı değişimini önler, böylece ad eşleştirmesi tüm dizin düzeylerinde zip ile gerçekleştirilir.


dizinleri dışlamak için Ubuntu 14.04'te benim için eğik çizgi çatalları olan yıldızları hazırlamak
Dimitry K

6

Bunu yaptığınız makineye gitmiş olduğunu varsayarsak, arşivinizi oluşturmak için git'in kendisini de kullanabilirsiniz.

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

2

Eğer zsh kullanıyorsanız, komut şöyle görünmelidir:

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

Eğer kullanın: zip -r target_name.zip source_dir -x /*.git/*. 'regex' olmadan, zsh zip run işleminden önce işlenir. Hata mesajı alacaksınız:

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

Teşekkürler! Windows'ta Ubuntu'da Bash kullanarak benim için çalıştı.
Adriano Monecchi,

Bu kalıbın nasıl çalıştığını anlamadım ama benim için zsh'de çalıştı.
Şubat’a
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.