2010-06-18 9 views
40

Mon arborescence source contient plusieurs répertoires qui utilisent le contrôle source Git, et j'ai besoin de compresser l'arborescence entière en excluant toute référence aux métadonnées Git ou aux fichiers journaux personnalisés.Tarballage sans métadonnées Git

Je pensais que j'allais utiliser une combinaison de find/egrep/xargs/tar, mais en quelque sorte le fichier tar contient les répertoires .git et les fichiers * .log.

C'est ce que j'ai:

find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar 

Quelqu'un peut-il expliquer mon malentendu? Pourquoi tar traite-t-il les fichiers que find et egrep filtrent?

Je suis ouvert à d'autres techniques.

Répondre

74

Vous obtiendrez une mauvaise surprise lorsque le nombre de fichiers augmente à plus d'une commande xargs: Ensuite, vous devrez d'abord faire un fichier tar des premiers fichiers puis écrasent le même fichier tar avec le reste des fichiers.

GNU tar a l'option --exclude qui résoudra ce problème:

tar cvf ~/app.tar --exclude .git --exclude "*.log" . 
+3

fonctionne aussi avec bsdtar sur OS X. – rexford

2

git-archive peut être ce que vous cherchez.

+0

Probablement pas. Comme c'est plusieurs gits dans l'arbre source. – zaf

2

Vous pouvez le faire sans grep. trouver est puissant

find . -type f -not \(-iname ".git" -or -iname ".log" \) | xargs ... 
+0

Le problème était mes paramètres de recherche. Vois ma réponse. Merci pour l'alternative. – zaf

11

Essayez quelque chose comme ceci:

git archive --format=tar -o ~/tarball.tar -v HEAD 

Ajoutez vos fichiers .log et tout ce que vous ne voulez pas être emballé dans votre fichier .gitignore.

4

[slap] Bah! Les paramètres à trouver étaient dans le mauvais ordre! Je n'ai pas vu les avertissements parce qu'ils ont sifflé l'écran. Cela a permis '.' passer à travers egrep qui a fait gâcher tout le goudron.

Cela m'apprendra à noyer les messages importants dans le débogage détaillé.

Cela fonctionne:

find . -type f | egrep -v '\.git|\.log' | xargs tar cvf ~/app.tar 
9

Pour exclure les répertoires du système de contrôle de version:

tar --exclude-vcs

Cela exclut svn, métafichiers git etc.

0

Pour le faire depuis l'extérieur du répertoire de l'application:

tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/ 
40

Vous pouvez essayer directement avec l'option de goudron --exclude-vcs:

--exclude-vcs: 
      Exclude version control system directories 

Par exemple:

tar cvfj nameoffile.tar.bz2 directory/ --exclude-vcs 

Il fonctionne avec Git.

+1

Merci mais "Option --exclude-vcs n'est pas supporté" avec ma version de tar. – zaf

+1

@zaf oui = GNU tar uniquement. MacOSX est livré avec bsdtar qui ne l'a pas. – marko

+0

@Marko Aha, merci de m'avoir éclairé. Ces détails me dérangent toujours. – zaf

3

Le nouveau GNU tar a la possibilité d'exclure automatiquement les répertoires de contrôle de version en utilisant flag --exclude-vcs. Cela prendra également soin de .git.

0

Pour moi, le contenu .gitignore est ce que je avais besoin:

tar cvfz $PROJECT.tar.gz --exclude-from=$PROJECT/.gitignore $PROJECT

--exclude-from est en train de lire le contenu du fichier - et exlucde les motifs énumérés il

+0

il y a aussi --exclude-vcs-ignore qui lit les patterns exclus des fichiers ignorés de VCS. –

Questions connexes