Comment puis-je compresser un dossier mais exclure le sous-dossier .git


196

J'essaie de créer un fichier zip à partir d'un dossier et j'aimerais exclure le .gitsous-dossier du fichier zip résultant.

Je suis allé dans le dossier parent de celui que je veux compresser ( appelé bitvolution ) et je fais:

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

Mais cela n'exclut pas le .gitsous-dossier.

J'ai essayé différentes combinaisons, -x .git*, -x \.git/*, -x .git/\*, -x \.git/\*. J'ai aussi essayé d'utiliser le chemin complet pour l'argument d'exclusion ... mais je n'y suis pas parvenu.

Réponses:


234

La bonne expression est -x *.git*, donc la commande complète devrait être:

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

Une explication de http://selfsolved.com/problems/zip-command-exclude-svn-director :

La bonne incantation est

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

Vous pouvez également ajouter un
--exclude=*.DS_Store*pour exclure les fichiers de métadonnées d’affichage des répertoires Mac OS X.

Notez que l'expression transmise --excludeutilise l'intégralité du chemin du répertoire relatif d'origine comme chaîne d'origine. Donc, .svn/*par lui-même ne fonctionne pas; le caractère générique placé en face de vous garantit qu'il correspond aux .svnrépertoires situés n'importe où dans l'arborescence.


20
Je devais envelopper le glob entre guillemets ou échapper aux astérisques avec des barres obliques inverses, comme zip --exclude '*.git*' -r directory.zip directoryouzip --exclude \*.git\* -r directory.zip directory
Dmitry Minkovsky

6
Si vous craignez de perdre d’autres fichiers appelés quelque chose, quelque chose de ce genre, vous pouvez aussi utiliser --exclude /.git*.
Erin Call

4
dans ZSH je devais ajouter une barre oblique inverse:-x \*.git\*
DmitrySandalov

2
Mon alternative préférée aux barres obliques inverses et aux guillemets en zsh:noglob zip -r out.zip someFolder -x *someExcludedFolder*
Sébastien

Comment l'utiliser avec du goudron? Sa ne fonctionne pas avec la commande tar.
RN Kushwaha

124

Si vous essayez de compresser un projet stocké dans Git, utilisez la git archivecommande. Depuis le répertoire source:

git archive -o bitvolution.zip HEAD

Vous pouvez utiliser n'importe quel ID de validation ou de balise au lieu d' HEADarchiver le projet à un moment donné.

Si vous souhaitez ajouter un préfixe (par exemple, un dossier de niveau supérieur) à chaque fichier:

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

Vous pouvez également régler le niveau de compression entre 0 (pas de compression) et 9 (compression maximale) inclus, par exemple

git archive -o bitvolution.zip -9 HEAD

Pour d'autres options, voir la page d'aide ( git help archive).


25
Non seulement cela n'inclut pas le dossier git, mais tout ce qui se trouve dans le fichier gitignore sera également exclu. Vous obtenez un vote positif monsieur.
JoeMoe1984

1
Juste ce que je cherchais à faire!
Bjarte

Je suis en retard à la fête mais ça m'a complètement bouleversé. Très bonne réponse!
Tom

Je me demande pourquoi n'est-ce pas la meilleure réponse
nabtron

pour moi, c'était le meilleur TIL aujourd'hui ...
Shawn Cicoria

27

J'ai ajouté une barre oblique inverse:

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

page de manuel sur la barre oblique inversée:

La barre oblique inverse évite la substitution de nom de fichier dans le shell, de sorte que la correspondance du nom est effectuée par zip à tous les niveaux de répertoire.


les astérisques avec slash forks pour moi sur Ubuntu 14.04 pour exclure les répertoires
Dimitry K

6

En supposant que git soit installé sur votre machine, vous pouvez également utiliser git pour créer votre archive.

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

2

Si vous utilisez zsh, la commande devrait ressembler à ceci:

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

Si vous utilisez: zip -r target_name.zip source_dir -x /*.git/*. sans 'regex', zsh traitera avant l'exécution du zip. Vous obtiendrez un message d'erreur:

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

Merci! C'est ce qui a fonctionné pour moi avec Bash sous Ubuntu sous Windows.
Adriano Monecchi

Je ne comprenais pas comment ce motif fonctionnait, mais travaillais pour moi chez zsh.
insigne le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.