Usando xargs com git

2

Estou tentando praticar usando xargs . Eu tentei o seguinte, passando o SHA1 via xargs :

$ git show SHA1 --name-only

Eu também tentei:

$ git log --author=jim --grep="patch" |head -n 1|cut -d ' ' -f2|xargs {} git show {} --name-only

Ele retornou xargs: {}: No such file or directory

Então, mudei para isso:

$ git log --author=jim --grep="patch" |head -n 1|cut -d ' ' -f2|xargs -0 -I {} git show {} --name-only

Que retornou:

fatal: ambiguous argument 'a1237ac27321f2daea365787664e4119b339c483': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

O SHA mencionado é o correto, mas não entendo por que isso não funciona

    
por Jim 08.07.2014 / 10:12

1 resposta

3

xargs -0 significa usar somente bytes nulos para separar registros de entrada e incluir caracteres de nova linha e outro espaço em branco na entrada. Você terá uma nova linha no final da saída da revisão, que head e cut deixarão lá e que serão incluídos no argumento dado a git . Git não gosta disso. Acho que você editou a nova linha fora da mensagem de erro, mas na verdade é uma parte da mensagem aqui e o que está causando o problema.

Remover -0 faz seu comando funcionar para mim. Dada a entrada que você está gerando, o comportamento padrão separado por nova linha de xargs é seguro.

Você realmente não precisa usar -I {} neste caso - git está muito feliz em ter a revisão como o último argumento, mas eu acho que você está usando isso por prática. Por padrão, xargs apenas coloca os argumentos no final do comando especificado (ao contrário de find -exec , que usa a substituição {} ).

Você também está fazendo um pouco de trabalho com seu cut . O Git é mais do que capaz de organizar sua saída em um formato que você pode usar com xargs . Usando o a opção --pretty=tformat... , podemos fazê-lo cuspir apenas os hashes SHA1, um por linha:

git log --author=jim --grep="patch" --pretty=tformat:'%H'

produzirá todos os hashes de commits correspondentes em seu repositório, um por linha. --pretty define a formatação de saída; tformat significa colocar uma nova linha no final de cada hash; '% H' significa o hash.

Você pode canalizar isso em xargs e, como a entrada inteira é "limpa" [a-f0-9], você pode usá-la com a separação de linha padrão

    
por 08.07.2014 / 10:48