ver salir registro modificados mis log filtrar como commits cambios archivos archivo git

salir - ver cambios en un archivo git



muy bien mostrar el historial de cambio de nombre de archivo en el registro git (3)

El comando git

git log --format=''%H'' --follow -- foo.txt

le dará la serie de confirmaciones que toque foo.txt , siguiéndola a través de renombrados.

Me pregunto si hay un comando git log que también imprima el nombre del archivo histórico correspondiente al lado de cada confirmación.

Sería algo como esto, donde podemos interpretar que ''%F'' es el marcador de posición (en realidad no existe) para el nombre de archivo.

git log --format=''%H %F'' --follow -- foo.txt

Sé que esto podría lograrse con

git log --format=''%H'' --follow --numstat -- foo.txt

pero la salida no es ideal ya que requiere un análisis no trivial; cada confirmación está repartida en varias líneas, y aún deberá analizar la sintaxis de cambio de nombre del archivo ( "bar.txt => foo.txt" ) para encontrar lo que está buscando.


Esto funciona en el terminal OSX:

git log --format=''%%%h'' --name-only --follow -- README.md | xargs echo | perl -pe ''s//%//n/g''


Puedes simplificarlo un poco así:

git log --format=''%H'' --name-only --follow -- README.md

lo que te dará una salida como esta

621175c4998dfda8da README.md d0d6ef0a3d22269b96 README.md

Lo que debería ser un poco más fácil de analizar. Por ejemplo, puede usar un centinela y eliminar las nuevas líneas como esta:

git log --format=''%H%%'' --name-only --follow -- README.md | sed '':a;N;$!ba;s/%/n/n/ /g''

lo que debería darle el hash y el nombre de archivo en la misma línea:

621175c4998dfda8da README.md d0d6ef0a3d22269b96 README.md

Para obtener información sobre la invocación de sed, consulte ¿Cómo puedo reemplazar una nueva línea (/ n) usando sed? que tiene la respuesta que basé ese bit en.


--name-status debería funcionar para usted:

git log --follow --name-status --format=''%H'' -- foo.txt

El resultado se verá así y se puede analizar fácilmente por Perl o Python:

''4da4d5e3e9c24251e14d20004a853b72bd096cce'' R100 b.txt c.txt ''4966238c97198d096f0424a0a23ec550297d8086'' M b.txt ''c0e41c11f0f7c5a7650cedfbad138c8941444023'' R100 a.txt b.txt ''4b2318c0fbabd836d50cabd70bf19013d3964856'' A a.txt

Si insistes en obtenerlo en una sola línea, esta línea de Perl resuelve el problema (funciona en Windows tal como está. En Linux, usa comillas simples o escape $ como /$ ):

git log --follow --name-status --format=''%H'' -- c.txt | perl -e "while(<>){chomp;print;<>;$_=<>;print q/ /,((split//t/)[-1]);}"

que imprime:

''4da4d5e3e9c24251e14d20004a853b72bd096cce'' c.txt ''4966238c97198d096f0424a0a23ec550297d8086'' b.txt ''c0e41c11f0f7c5a7650cedfbad138c8941444023'' b.txt ''4b2318c0fbabd836d50cabd70bf19013d3964856'' a.txt