Come posso comprimere una cartella ma escludere la sottocartella .git


196

Sto provando a creare un file zip da una cartella e vorrei escludere la .gitsottocartella dal file zip risultante.

Sono andato nella cartella principale di quella che voglio comprimere ( chiamata bitvolution ) e sto facendo:

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

Ma non esclude la .gitsottocartella.

Ho provato varie combinazioni, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. Ho anche provato a utilizzare il percorso completo per l'argomento exclude ... ma non ci sono arrivato.

Risposte:


234

L'espressione corretta è -x *.git*, quindi il comando completo dovrebbe essere:

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

Una spiegazione da http://selfsolved.com/problems/zip-command-exclude-svn-director :

L'incantesimo corretto è

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

Puoi anche aggiungere a
--exclude=*.DS_Store*per escludere i fastidiosi file di metadati di visualizzazione della directory di Mac OS X.

Si noti che l'espressione passata --excludeutilizza l'intero percorso della directory relativa originale come stringa originale per la corrispondenza. Quindi .svn/*da solo non funziona; il carattere jolly in primo piano assicura che corrisponda alle .svndirectory in qualsiasi punto dell'albero della directory.


20
Ho dovuto avvolgere il globo tra virgolette o sfuggire agli asterischi con barre rovesciate, come zip --exclude '*.git*' -r directory.zip directoryozip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky,

6
Se sei preoccupato di perdere altri file chiamati qualcosa. Qualcosa, puoi anche usare --exclude /.git*.
Erin Call,

4
in ZSH ho dovuto aggiungere una barra rovesciata:-x \*.git\*
DmitrySandalov il

2
La mia alternativa preferita a barre rovesciate e citazioni in zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien,

Come si usa con tar? Non funziona con il comando tar.
RN Kushwaha,

124

Se stai cercando di comprimere un progetto archiviato in Git, usa il git archivecomando. Dall'interno della directory di origine:

git archive -o bitvolution.zip HEAD

È possibile utilizzare qualsiasi ID di commit o tag anziché HEADarchiviare il progetto in un determinato punto.

Se si desidera aggiungere un prefisso (ad esempio una cartella di livello superiore) a ogni file:

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

Ad esempio, puoi anche regolare il livello di compressione tra 0 (nessuna compressione) e 9 (compressione massima) incluso

git archive -o bitvolution.zip -9 HEAD

Per altre opzioni, consultare la pagina di aiuto ( git help archive).


25
Non solo questo non includerà la cartella git, ma verrà anche escluso tutto ciò che si trova nel file gitignore. Signore, ottieni un voto.
JoeMoe1984,

1
Proprio quello che stavo cercando di fare!
Bjarte,

Sono in ritardo alla festa, ma questo mi ha lasciato senza fiato. Bella risposta!
Tom,

mi chiedo perché non sia questa la risposta migliore
nabtron

per me questo è stato il più grande TIL oggi ...
Shawn Cicoria

27

Ho aggiunto una barra rovesciata:

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

pagina man sulla barra rovesciata:

La barra rovesciata evita la sostituzione del nome file della shell, in modo che la corrispondenza dei nomi venga eseguita da zip a tutti i livelli di directory.


anteporre asterischi con forcelle su Ubuntu 14.04 per escludere le directory
Dimitry K

6

Supponendo che tu abbia installato git sul computer che stai facendo, puoi anche usare git stesso per creare il tuo archivio.

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

2

Se stai usando zsh, il comando dovrebbe assomigliare a:

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

Se si utilizza: zip -r target_name.zip source_dir -x /*.git/*. senza 'regex', zsh verrà elaborato prima dell'esecuzione di zip. Verrà visualizzato un messaggio di errore:

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

Grazie! Questo è ciò che ha funzionato per me usando Bash su Ubuntu su Windows.
Adriano Monecchi,

Non ho capito come funziona questo modello, ma ho lavorato per me su zsh.
insegni il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.