Usando xargs con git

Estoy tratando de practicar usando xargs . Intenté lo siguiente, pasando el SHA1 a través de xargs :

 $ git show SHA1 --name-only 

También probé:

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

Devolvió xargs: {}: No such file or directory

Entonces, pasé a esto:

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

Que regresó:

 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>...]' 

El SHA mencionado es el correcto, pero no entiendo por qué esto tampoco funciona

xargs -0 significa usar solo bytes nulos para separar loggings de input, e include caracteres de nueva línea y otros espacios en blanco en la input. Tendrás una nueva línea al final de la salida de revisión allí, que head y cut saldrán de allí, y que se includeán en el argumento dado a git . A Git no le gusta eso. Creo que ha editado la nueva línea del post de error, pero en realidad es una parte del post y lo que está causando su problema.

Eliminar -0 hace que tu command funcione para mí. Dada la input que está generando, el comportamiento pnetworkingeterminado de new- xargs de xargs es seguro.

En realidad, no necesitas usar -I {} en este caso, git está muy contento de tener la revisión como el último argumento, pero supongo que la estás usando para el bien de la práctica. De forma pnetworkingeterminada, xargs simplemente coloca los arguments al final del command dado (a diferencia de find -exec , que usa la {} sustitución).


Sin embargo, también estás haciendo un gran trabajo, con tu cut . Git es más que capaz de organizar su salida en un formatting que puede usar con xargs . Usando la --pretty=tformat... podemos hacer que escupe solo los hashes SHA1, uno por línea:

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

generará todos los hash de las confirmaciones de coincidencia en su repository, uno por línea. --pretty establece el formatting de salida; tformat significa poner una nueva línea al final de cada hash; '% H' significa el hash.

Puede canalizar eso en xargs, y como toda la input está "limpia" [a-f0-9], puede usarla con la separación de línea pnetworkingeterminada