Mein Quellbaum enthält mehrere Verzeichnisse, die Git-Quellcodeverwaltung verwenden, und ich muss den gesamten Baum tarieren, wobei alle Verweise auf die Git-Metadaten oder benutzerdefinierte Protokolldateien ausgenommen sind.
Ich dachte, ich würde eine Kombination aus find/egrep/xargs/tar ausprobieren, aber irgendwie enthält die tar-Datei die .git-Verzeichnisse und die * .log-Dateien.
Das ist was ich habe:
find -type f . | egrep -v '\.git|\.log' | xargs tar rvf ~/app.tar
Kann jemand mein Missverständnis hier erklären? Warum verarbeitet tar die Dateien, die von find und egrep gefiltert werden?
Ich bin auch offen für andere Techniken.
Sie erhalten eine böse Überraschung, wenn sich die Anzahl der Dateien auf mehr als einen xargs-Befehl erhöht: Dann erstellen Sie zunächst eine tar-Datei aus den ersten Dateien und überschreiben dann dieselbe tar-Datei mit den restlichen Dateien.
GNU tar hat die Option --exclude, mit der dieses Problem gelöst werden kann:
tar cvf ~/app.tar --exclude .git --exclude "*.log" .
Sie können es direkt mit der tar-Option versuchen --exclude-vcs:
--exclude-vcs:
Exclude version control system directories
Zum Beispiel:
tar cvfj nameoffile.tar.bz2 directory/ --exclude-vcs
Es funktioniert mit Git.
Versuchen Sie etwas so:
git archive --format=tar -o ~/tarball.tar -v HEAD
Fügen Sie Ihre .log-Dateien und alles andere hinzu, das Sie nicht in Ihre .gitignore-Datei packen möchten.
So schließen Sie Versionskontrollsystemverzeichnisse aus:
tar --exclude-vcs
Dies schließt SVN, Git Metafiles etc. aus.
Mit dem neueren tar GNU können Versionskontrollverzeichnisse mit dem Flag --exclude-vcs automatisch ausgeschlossen werden. Dies wird sich auch um .git kümmern.
[Schlag] Bah! Die zu findenden Parameter waren in der falschen Reihenfolge! Ich habe die Warnungen nicht gesehen, weil sie vom Bildschirm abgehauen sind. Dies erlaubt '.' durch Egrep zu gehen, was dazu führte, dass Teer alles schlurfte.
Das wird mich lehren, wichtige Nachrichten im ausführlichen Debug zu ertränken.
Das funktioniert:
find . -type f | egrep -v '\.git|\.log' | xargs tar cvf ~/app.tar
git-archive ist vielleicht das, wonach Sie suchen.
Das geht auch ohne grep. find ist mächtig
find . -type f -not \( -iname ".git" -or -iname ".log" \) | xargs ...
Um dies von außerhalb des App-Verzeichnisses zu tun:
tar cvfz app.tar.gz --exclude ".git/*" --exclude ".git" app/
Für mich ist der .gitignore
-Inhalt genau das, was ich brauchte:
tar cvfz $PROJECT.tar.gz --exclude-from=$PROJECT/.gitignore $PROJECT
--exclude-from
liest den Inhalt der Datei - und erklärt die dort aufgeführten Muster