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