Domanda

Voglio usare qualcosa come il seguente comando per creare un tarball da distribuire:

tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

Il comando interno git diff produce un elenco di file con relativo incluso il relativo percorso quando lo eseguo separatamente.

Sto riscontrando due problemi, però, devo essere in grado di uscire automaticamente dagli spazi nell'output, quindi tar non si lamenta dei file contenenti spazi e quando il tar viene creato, tutti i file hanno un "file nascosto" duplicato preceduto da un "." che non si presentano con ls -al . Questi sono metafile specifici per OSX, come notato da kch.

Qualcuno sa della soluzione a questi problemi o esiste un modo semplice per scrivere questo?

È stato utile?

Soluzione

Ho optato per la seguente soluzione con sed.

tar cjf ~/deploy.tar.bz2 \
`git diff --name-only 0abc 1def|sed -e "s/ /\\\ /g"`

Altri suggerimenti

I file di punti nascosti, sono file di punti di sottolineatura?

Se per il file foo hai un altro ._foo , e sei su un Mac, il file punto-sottolineatura è dove è conservato il fork / metadati della risorsa file .

Per quanto riguarda l'output di git, potresti provare a inviarlo tramite sed o perl per la quotazione. Credo che xargs potrebbe aiutare anche qui.

Perché non usare l'opzione --files-from = FILE o -T FILE di tar, dove FILE può essere '-' per indicare l'input standard?

 git diff --name-only 0abc 1def | tar -T - cjf ~/deploy.tar.bz2

Non dovresti avere problemi con spazi o tabulazioni nei nomi di file, o con virgolette singole, o backquotes o barre rovesciate (penso che la tua soluzione avrebbe problemi con la virgoletta singola " '" nel nome del file). Potresti avere problemi con le nuove righe nei nomi dei file, proprio come nella soluzione IFS.

Se le dimensioni non contano, puoi utilizzare git archive .

Non sono sicuro che sia possibile creare un tarball contenente solo le differenze tra due commit.

Puoi provare

eval tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def | while read x; do echo "'""$x""'"; done`

o prova la stessa cosa usando sed o

IFS='
' tar cjvf ~/deploy.tar.bz2 `git diff --name-only 0abc 1def`

Nota che esiste una sola nuova riga in IFS.

Tuttavia, se il nome dei tuoi file contiene nuove righe, sei condannato.

Ecco un'altra soluzione più elegante che aggira gli spazi di fuga nei nomi dei file

git diff --name-only 0abc 1def | \
    tr '\n' '\0' | \
    xargs -0 tar -rjvf ~/deploy.tar.bz2

Come ha sottolineato jpalecek, uno non vorrebbe eseguire " tar -c ... " più volte, è meglio usare -r.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top