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.
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" .
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.
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.
Pour exclure les répertoires du système de contrôle de version:
tar --exclude-vcs
Cela exclura les métafichiers svn, git, etc.
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.
[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
git-archive est peut-être ce que vous cherchez.
Vous pouvez le faire sans grep. trouver est puissant
find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...
Pour le faire en dehors du répertoire de l'application:
tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/
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