2009-11-05 6 views
8

Esiste un modo semplice per esportare/archiviare solo i file modificati da un determinato commit o serie di commit in git? Non riesco a trovare istruzioni chiare per farlo (e sono nuovo di Linux/Git).Esportare/archiviare i file modificati solo in Git

Sto usando msysgit e per la maggior parte sto bene con la distribuzione di interi repository ma in molti casi è molto più efficiente distribuire piccole correzioni pochi file alla volta.

Spingere/tirare/installare git sui server remoti non è un'opzione in quanto il mio livello di accesso varia tra progetti e client.

Esiste un modo straight-forward a (occhio e croce):

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

risposta

25

Io non credo che ci sia alcuna necessità di coinvolgere git-archivio. Utilizzando --name-only, si potrebbe tar i file:

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

Dal momento che siete nuovi a Linux, questo potrebbe aver bisogno di qualche spiegazione:

Gli apici inversi nella riga di comando causa la shell da eseguire per primo il comando all'interno i backtick, quindi sostituire l'output di tale comando nella riga di comando di tar. Quindi viene eseguito prima il git diff, che genera un elenco di nomi di file, uno su ogni riga. Le nuove righe vengono compresse negli spazi e l'intera lista di file viene posizionata sulla riga di comando tar. Quindi viene eseguito tar per creare l'archivio specificato. Nota che questo può generare linee di comando piuttosto lunghe, quindi se hai un numero molto grande di file modificati potresti aver bisogno di una tecnica diversa.

+4

Proprio per l'amor di posterità, quella tecnica diversa sarebbe qualcosa come: 'git diff --name-only [diff options] | xargs tar -czf files.tar.gz' – jason

+2

Con 'xargs', hai un problema diverso perché' xargs' eseguirà 'tar' più di una volta se ci sono troppi file per metterli tutti su una singola riga di comando. Questo farà sì che 'tar' crei un nuovo file .tar sovrascrivendo quello precedente, quindi conterrà solo i file per l'ultimo batch. –

+0

Grazie per aver spiegato la sintassi! I backtick sono quello che mi serviva :) Funziona perfettamente in bash commandline che viene fornito con msysgit tranne dove ci sono spazi nei nomi dei file (windows ...). C'è un modo per sfuggirli automaticamente? – AKS