Git culpar sin historia

88

Cuando ejecuto git blame en un archivo (usando msysgit) siempre obtengo el siguiente tipo de impresión:

00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   1) package co
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   2) {
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   3)      impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   4)      impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   5)      impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   6)      impor
00000000 (Not Committed Yet 2011-01-09 11:21:30 +0200   7)      impor

es decir, muestra todas las líneas como Aún no comprometidas.

Probé esto en muchos archivos, que tienen muchas confirmaciones, siempre los mismos resultados. También intenté usar la ruta relativa / completa, pero parece que no hay diferencia.

Cuando trato de usar la culpa de TortoiseGit, siempre muestra que cada línea se comprometió por última vez en la primera confirmación:

texto alternativo

incluso aunque, como he dicho, hay decenas de confirmaciones en el historial de estos archivos ...

Ideas?

Editar - Más información

  • La culpa de Git funciona bien en GitHub, donde se aloja este repositorio.
  • También funciona bien si lo clono en una máquina Linux y hago la culpa allí
  • Parece que solo en msysgit esto no funciona
Assaf Lavie
fuente
Para mí, este problema se debió al uso de una ruta de enlace simbólica opuesta a una ruta que el repositorio reconoció, por lo que pensó que el archivo era completamente nuevo.
Kzqai
Nota: A partir de git 2.0.1 (25 de junio de 2014), git blame debería dejar de informar todas esas líneas "Aún no comprometidas". Vea mi respuesta a continuación
VonC
En la lista de correo: git.661346.n2.nabble.com/… También ocurre en Linux.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Esto también afecta a WSL, así que agregué la etiqueta. Espero que esté bien.
mikemaccana

Respuestas:

127

git blame file.txtculpa a la versión de file.txt en su copia de trabajo. Si file.txt tiene Windows-newlines (CRLF) en el repositorio y usted lo tiene core.autocrlf = true, entonces cada línea de file.txt se considerará diferente y se informará git blameque aún no se ha confirmado.

La razón por la que git blame <my_branch>(o mejor aún git blame HEAD, lo que funciona sin importar en qué rama se encuentre) funciona es que no culpa a la versión de la copia de trabajo, por lo que no hay posibilidad de que las líneas aún no se hayan comprometido.

kusma
fuente
118
git blame -wignora el espacio en blanco, por lo que aún puede culpar a la copia de trabajo si lo desea
Kyle Heironimus
13
Git blame -w debería ser una respuesta separada y la aceptada;). La respuesta aceptada sin el comentario fue inútil para mí.
Guillaume Perrot
55

Encontré la solución, muy extraña.

Si ejecuto esto:

git blame file.txt

La historia está rota, como se publicó anteriormente.

Si hago esto en su lugar:

git blame my_branch file.txt

¡Funciona!

Esto es muy extraño, porque AFAICS el uso no requiere un nombre de rama:

$ git blame
usage: git blame [options] [rev-opts] [rev] [--] file
Assaf Lavie
fuente
7
Esto funciona para mí, gracias por publicarlo. Debe marcar este como la respuesta en mi opinión.
miércoles
Esto me funciona en msysgit, pero el nombre del archivo distingue entre mayúsculas y minúsculas. Entonces puedo escribir git blame mybranch cmakelists.txty fallará; pero si lo escribo git blame mybranch CMakeLists.txtfuncionará.
bucle
Estoy de acuerdo, wes; La culpa no mostraba historial hasta que especifiqué la rama, y ​​eso es inconsistente con la documentación.
josephdpurcell
Dios mío, la culpa está tan rota.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
8

A partir de git 2.0.1 (25 de junio de 2014), git blame debería dejar de informar todas esas líneas "Aún no comprometido".

Consulte la confirmación 4d4813a (26 de abril de 2014) de brian m. carlson ( bk2204) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso e934c67 , 06 de junio de 2014)

blame: manejar archivos correctamente independientemente de autocrlf

Si un archivo contenía CRLFfinales de línea en un repositorio con core.autocrlf=input, la culpa siempre marcaba las líneas como " Not Committed Yet", incluso si no estaban modificadas.
No intente convertir los finales de línea al crear la confirmación falsa para que la culpa funcione correctamente independientemente de la autocrlfconfiguración.

VonC
fuente
8
Todavía tengo el problema en git v2.1.3
DBedrenko
Tengo el problema con la versión de git 2.16.1.windows.1
Radon8472
@ Radon8472 ¿Puede agregar una nueva pregunta que ilustre el problema, con su git config -lsalida (y un enlace a esta respuesta): eso nos permitirá a mí y a otros intentar y ver si el problema persiste.
VonC
1

Otra posibilidad: error tipográfico en el nombre de archivo que distingue entre mayúsculas y minúsculas

Tuve el mismo problema con git blame file.txt, luego me di cuenta de que había cometido un error tipográfico en el nombre de archivo que distingue entre mayúsculas y minúsculas con file.txt

Lo cambié a File.txt (por ejemplo) y obtuve los resultados esperados sin tener que especificar my_branch: git blame File.txt

John Jacecko
fuente