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.

À M
la source

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.

Isaïe
la source
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).

Blair
la source
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.

Priit Tamboom
la source
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
Tatu Lahtela
la source
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/*
g10guang
la source
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