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