Pergunta

Eu quero usar algo como o seguinte comando para criar um arquivo tar para implantar:

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

O comando interno git diff produz uma lista de arquivos com relativo incluindo o caminho relativo quando eu executá-lo separadamente.

Eu estou correndo em dois problemas, porém, eu preciso ser capaz de espaços auto de escape na saída, então tar não reclamar arquivos contendo espaços e quando o alcatrão não são criados, todos os arquivos têm uma duplicata 'arquivo oculto' precedido por um '' que não aparecem com ls -al . Estes são metarquivos específicas OSX como observado por kch.

De qualquer forma, alguém sabe da solução para estes problemas, ou há apenas uma maneira mais fácil claro para este script?

Foi útil?

Solução

Eu resolvida a seguinte solução com sed.

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

Outras dicas

Os dot-arquivos ocultos, são eles dot-sublinhado-files?

Se por foo arquivo que você tem outra ._foo, e você estiver em um Mac, o arquivo ponto-sublinhado é onde a bifurcação de recursos de arquivo / metadados é mantida.

Como para a saída de git, pode tentar tubulação através sed ou perl para citar. Acredito xargs poderia ajudar aqui também.

Por que não --files-from=FILE ou -T FILE opção de alcatrão, onde arquivo pode ser usar '-'? Para significar a entrada padrão

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

Você não deve ter problema com espaços ou tabulações em nomes de arquivos, ou com aspas simples ou crase, ou barras invertidas (acho que sua solução teria problemas com apóstrofo "'" no nome do arquivo). Você pode ter problema com novas linhas em nomes de arquivos, assim como na solução IFS.

Se o tamanho não importa, você poderia usar git arquivo .

Eu não tenho certeza se é possível criar um arquivo tar contendo apenas as diferenças entre dois commits.

Você pode tentar

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

ou tente a mesma coisa usando sed, ou

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

Note que existe apenas uma única nova linha no IFS.

No entanto, se o nome de seus arquivos conter novas linhas, você está condenado.

Aqui está uma outra solução, mais elegante que funciona espaços em torno escapando nos nomes de arquivo

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

Como jpalecek apontou, um Wold não quer correr "tar -c ..." várias vezes, é melhor usar -r.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top