2009-11-05 7 views
8

Gibt es eine einfache Möglichkeit, nur die geänderten Dateien von einem bestimmten Commit oder einer Serie von Commits in git zu exportieren/zu archivieren? Ich kann keine klaren Anweisungen finden, dies zu tun (und ich bin neu in Linux/Git).Exportieren/Archivieren geänderter Dateien nur in Git

Ich benutze msysgit, und in den meisten Fällen bin ich gut mit der Bereitstellung von ganzen Repositories, aber in vielen Fällen ist es viel effizienter, kleine Fixes ein paar Dateien auf einmal zu implementieren.

Push/Pull/Installation von Git auf den Remote-Servern ist nicht wirklich eine Option, da meine Zugriffsebene zwischen Projekten und Clients variiert.

Gibt es eine geradlinige Art und Weise zu (grobe Schätzung):

pipe 'diff --names-only' to 'git-archive'? 

Antwort

25

Ich glaube nicht, dass es keine Notwendigkeit git-Archiv einzubinden. Mit --name-only, können Sie die Dateien tar up:

tar czf new-files.tar.gz `git diff --name-only [diff options]` 

Da Sie zu Linux neu sind, dies eine Erklärung benötigen:

Die Backticks in der Befehlszeile die Shell dazu führen, zuerst den Befehl innerhalb die Backticks, dann ersetzen Sie die Ausgabe dieses Befehls in die Befehlszeile von tar. So wird zuerst die git diff ausgeführt, die eine Liste von Dateinamen erzeugt, einen auf jeder Zeile. Die Zeilenumbrüche werden auf Leerzeichen reduziert und die gesamte Liste der Dateien wird in der Befehlszeile tar platziert. Dann wird tar ausgeführt, um das angegebene Archiv zu erstellen. Beachten Sie, dass dadurch ziemlich lange Befehlszeilen generiert werden können. Wenn Sie also sehr viele geänderte Dateien haben, benötigen Sie möglicherweise eine andere Technik.

+4

Nur für die Nachwelt, diese andere Technik wäre etwas wie: 'git diff - nur-Name [diff Optionen] | xargs tar -czf files.tar.gz' – jason

+2

Mit 'xargs' hast du ein anderes Problem, weil' xargs' 'tar' mehr als einmal ausführt, wenn zu viele Dateien vorhanden sind, um sie alle in eine einzige Befehlszeile zu bringen. Dies führt dazu, dass 'tar' eine neue .tar-Datei erstellt, die die vorherige Datei überschreibt, so dass nur die Dateien für den letzten Stapel enthalten sind. –

+0

Danke für die Erklärung der Syntax! Die Backticks sind was ich brauchte :) Dies funktioniert perfekt in Bash Kommandozeile, die mit msysgit kommt, außer wo es Leerzeichen in Dateinamen (Windows ...) gibt. Gibt es eine Möglichkeit, ihnen automatisch zu entkommen? – AKS