tag tab remove practices crear commits commands best git

tab - Logrando que Git reconozca archivos previamente movidos



git tag commits (5)

He movido un montón de archivos manualmente sin pensarlo, y no puedo encontrar una manera de que git reconozca que los archivos solo se han movido y en realidad no son archivos diferentes. ¿Hay alguna forma de hacer esto que no sea eliminar lo antiguo y agregar lo nuevo (y así perder el historial), o rehacer todos los cambios con git-mv?


Creo que ya hace esto. Ahora, podría estar equivocado, pero he leído que git rastrea archivos en función de su contenido, no en función de su posición en el sistema de archivos o en función de delta / diferencias. En la pila, creo que lo muestra como si los archivos se eliminaran y luego se volvieran a agregar, pero creo que lo intenté una vez y aún mantengo el historial, debido a la manera mencionada en que Git rastrea las cosas.

Aún sería útil para alguien verificar si estoy en lo correcto o no. Lo siento si entendí mal tu pregunta.


Para comprender mejor por qué Git hace cambio de nombre de detección en lugar de (más común) el seguimiento de cambio de nombre explícito, y cómo funciona la limitación de la ruta del git log de Git, puede leer la última publicación del blog de la herramienta de seguimiento de contenido de Linus por Junio ​​C Hamano, mantenedor de Git (y las referencias en el mismo) ).


Para que git elimine los archivos que ya se eliminaron o movieron, simplemente ingrese

git add -u


Puede mover / cambiar el nombre del nuevo archivo a su antiguo nombre y ruta fuera de git y luego usar git mv para organizar solo el movimiento; por ejemplo en bash:

mv $NEW $OLD && git mv $OLD $NEW

Es un poco engorroso 1 , especialmente si tienes que hacerlo a mano. Pero tiene la ventaja de que deja sin cambios otros cambios, como cambiar el espacio de nombres o el nombre de la clase para que pueda inspeccionarlos y ponerlos en escena solo cuando intente hacerlo.

1 Espero encontrar una mejor alternativa y actualizaré mi respuesta cuando la encuentre.

Ejemplo: moví un montón de archivos de oldDir a newDir y comencé con entusiasmo con algunos otros cambios. Ahora quiero comprobar qué otras modificaciones se hicieron. El uso de git xargs gawk y bash dio como resultado lo siguiente (en una sola línea):

git status --short | gawk ''/^/?/?/ && match($0, /newDir//(*./.cs)/, a) {print "newDir/" a[1] " " "oldDir/" a[1]}'' | xargs -n 2 bash -c ''mv $0 $1; git mv $1 $0''

Ahora el git status muestra los nombres como "Cambios para confirmar" y las modificaciones textuales en "Cambios no preparados para confirmación"


git no rastrea el historial de archivos individuales y no trata los movimientos y las copias especialmente, es decir, no hay metadatos especiales que indiquen que ocurrió un movimiento o una copia. En su lugar, cada git commit es una instantánea completa del árbol de trabajo.

Si desea ver movimientos en el git log , puede proporcionar -M además de una opción que enumera qué archivos han cambiado, por ejemplo

git log --summary -M

git mirará los árboles adyacentes en el historial de confirmación e inferirá si algún archivo fue movido por cada confirmación.

Para encontrar copias y renombrar puede usar la opción -C , puede suministrarla dos veces para hacer que git parezca más difícil para posibles fuentes de copia a expensas de cierto rendimiento.

git log --summary -M -C -C

Tenga en cuenta que, como git no almacena el historial de archivos (solo el historial de confirmación), incluso si git rm y git mv el archivo, no perdería ningún historial. Todos los cambios en la ruta seguirían siendo registrados y visibles en un git log .