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