Tar un dossier sans fichiers .git?

16

Si je tar un dossier qui est un référentiel git, puis-je le faire sans inclure les .gitfichiers associés? Sinon, comment pourrais-je procéder via une commande?

chrisjlee
la source

Réponses:

23

Regardez d'abord git help archive. archiveest une commande git qui permet de créer des archives contenant uniquement des fichiers suivis git. Probablement ce que vous recherchez. Un exemple répertorié à la fin de la page de manuel:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz
Stéphane Gimenez
la source
6
cela archive uniquement le dépôt root git. Si des sous-modules ont été utilisés - leurs répertoires seront vides.
Stann
@Stann: Merci, d'un autre utilisateur de sous-module
Mark K Cowan
22

Réponse la plus simple: ajouter --exclude-vcs

--exclude-vcs

Cela exclut tous les répertoires du système de contrôle de version

Personnellement j'utilise

tar -zcvf foo.tar.gz ./FOLDER_NAME --exclude-vcs

donc tout ce que vous avez à faire est d'ajouter le --exclude-vcs à la fin de la commande.

mtelesha
la source
Tous connus , je suppose? ;)
phk
3
Toutes les options doivent être réunies avant les arguments sur GNU / Linux.
Josh Habdas
2
Comme indiqué pour GNU / Linuxtar --exclude-vcs -zcvf foo.tar.gz ./FOLDER_NAME
Michael Irey
20

Si vous souhaitez que l'archive inclue les fichiers suivis par git, mais pas le référentiel git lui-même ou tout fichier généré ou non suivi, utilisezgit archive .

Si vous souhaitez spécifiquement exclure .gitmais inclure tout le reste, sous Linux ou FreeBSD ou OSX ou Cygwin, tar a une option simple pour exclure un répertoire:

tar -c --exclude .git -f - foo | gzip >foo.tgz

Avec GNU tar (c'est-à-dire sous Linux ou Cygwin), vous pouvez le raccourcir en tar czf foo.tgz --exclude .git foo .

La manière POSIX de créer des archives est pax.

pax -w -t -s '!.*/\.git$!!' -s '!.*/\.git/.*!!' foo | gzip >foo.tgz
Gilles 'SO- arrête d'être méchant'
la source
Est - gitcompiles sur tout système où tarn'est pas disponible? :-)
Stéphane Gimenez
1
@ StéphaneGimenez Probablement pas. Mais il compile sur des systèmes où taril n'y a pas d' --excludeoption, comme OpenBSD (qui duplique certes l' soption de pax , mais ce n'est pas une extension de syntaxe de commande tar commune).
Gilles 'SO- arrête d'être méchant'
0

Grâce à une réponse que j'ai obtenue sur l'une de mes questions, j'ai trouvé une autre solution. Donc, par souci d'exhaustivité, voici une solution utilisant find:

find . -path './.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Et si vous souhaitez exclure des .gitdossiers possibles dans (sous) + dossier:

find . -path '*/.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Ce dernier peut également être atteint grâce à:

find . -type d -name '.git' -prune -o -print |
  tar -czvf ../archive.tgz --no-recursion -T -

Assez pratique si vous pouvez utiliser les autres techniques de filtrage de find , par exemple la date de modification, les autorisations,…

(Comme on suppose souvent des noms de fichiers bien formés, sinon vous devez utiliser des octets nuls comme séparateurs, ce qui peut signifier -print0pour findet --nullpour tarsi pris en charge.)

phk
la source