web-dev-qa-db-fra.com

Tarballing sans métadonnées Git

Mon arbre source contient plusieurs répertoires qui utilisent le contrôle de source Git et je dois archiver tout l’arbre, à l’exclusion de toute référence aux métadonnées Git ou aux fichiers journaux personnalisés.

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

Voici ce que j'ai

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

Est-ce que quelqu'un peut expliquer mon malentendu ici? Pourquoi tar traite-t-il les fichiers qui trouvent et egrep filtrent?

Je suis également ouvert à d'autres techniques.

43
zaf

Vous aurez une mauvaise surprise lorsque le nombre de fichiers atteindra plusieurs commandes xargs: vous créerez d'abord un fichier tar contenant les premiers fichiers, puis écraserez 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" .
84
Ole Tange

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

--exclude-vcs:
          Exclude version control system directories

Par exemple:

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

Cela fonctionne avec Git.

48
Ivan

Essayez quelque chose comme ça:

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

Ajoutez vos fichiers .log et tout ce que vous ne voulez pas emballer dans votre fichier .gitignore.

11
jkramer

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

tar --exclude-vcs

Cela exclura les métafichiers svn, git, etc.

11
PeloNZ

Le GNU tar le plus récent a la possibilité d'exclure automatiquement les répertoires de contrôle de version à l'aide de l'indicateur --exclude-vcs. Cela prendra soin de .git aussi.

4
KeshV

[claque] Bah! Les paramètres à trouver étaient dans le mauvais ordre! Je n'ai pas vu les avertissements parce qu'ils sont sortis de l'écran. Cela a permis "." passer par egrep ce qui a provoqué goudron de tout gâcher.

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

Cela marche:

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

git-archive est peut-être ce que vous cherchez.

2
Skilldrick

Vous pouvez le faire sans grep. trouver est puissant

 find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...
2
Jürgen Steinblock

Pour le faire en dehors du répertoire de l'application:

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

Pour moi, le contenu .gitignore est ce dont j'avais besoin:

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

--exclude-from est en train de lire le contenu du fichier - et d’exclure les motifs indiqués ici

0
Ricky Levi