Combinando magit con undo-tree para una fácil navegación en el historial


16

Me encanta undo-tree(captura de pantalla a continuación). Proporciona una manera fácil para navegar a través de diferentes versiones de un archivo (ventana superior) al permitir que el usuario se mueven alrededor del árbol historial del archivo en una ventana separada (ventana inferior) con claves simples, tales como n, py C-by C-fal conmutador a través de los descendientes de la misma padre.

En particular, undo-treeactualiza el búfer que contiene el archivo con la versión correspondiente en función de la selección en la vista de árbol, automáticamente.

Por supuesto, magites fenomenal para git, y sería sorprendente si tuviera una capacidad similar, es decir, permitir que los usuarios naveguen el historial de git de un archivo de forma interactiva mientras actualizan simultáneamente el búfer que contiene el archivo automáticamente.

¿Es esto posible con el magitdía de hoy?

ingrese la descripción de la imagen aquí


No sé si es posible con magit, pero eche un vistazo a github.com/pidu/git-timemachine
clemera

No estoy seguro, pero creo que undo-treeusa un árbol (está en el nombre :-p), mientras que el historial de Git es un gráfico acíclico dirigido . Puede ser no trivial.
suvayu

2
Magit admite algo como esto, pero actualmente estoy cambiando la forma en que se activa la función. Publicaré una respuesta cuando termine con eso.
tarsius

Respuestas:


7

Magit recientemente obtuvo soporte para algo como esto, pero la característica aún es un poco tosca y debe habilitarse explícitamente.


Ha existido una característica similar durante mucho tiempo: cuando se mueve de un commit a otro en un búfer de registro, y otra ventana en el mismo marco es el búfer de revisión del repositorio, entonces ese búfer se actualiza para mostrar ese commit en lugar de cualquier commit. estaba mostrando previamente.

Hasta hace muy poco, el búfer de revisión se creó cuando se movió por primera vez de una confirmación a otra. He cambiado ese comportamiento y ahora el búfer de revisión solo se actualiza . Si ninguna ventana en el mismo marco ya muestra ese búfer, entonces moverse alrededor del registro ya no hará que el búfer se muestre en una nueva ventana o en una ventana existente que previamente mostraba algún otro búfer.

Entonces ahora debe presionar SPCuna vez para mostrar el búfer de revisión. Solo entonces comenzará a actualizarse cuando se mueva por el búfer de registro.

Si no desea que se actualice el búfer de revisión, haga esto:

(remove-hook 'magit-section-movement-hook
             'magit-log-maybe-update-revision-buffer)

Si, por otro lado, también desea que el búfer de revisión se actualice al moverse en el búfer de estado, entonces use esto:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-revision-buffer)

Ahora es posible que un búfer de blob se actualice automáticamente de manera similar. Primero agregue esto:

(add-hook 'magit-section-movement-hook
          'magit-log-maybe-update-blob-buffer)

Y tal vez también:

(add-hook 'magit-section-movement-hook
          'magit-status-maybe-update-blob-buffer)

Luego, dentro de un búfer de registro (o estado), presione RETpara mostrar o actualizar el búfer de revisión, y también para cambiar a ese búfer. Vaya al archivo que le interesa y presione RETnuevamente. Ahora está en un búfer de "visita de blobs", que es similar a un búfer de visita de archivos, excepto que no visita el archivo en el árbol de trabajo sino el archivo como estaba en alguna confirmación.

Vuelva al búfer de registro (o estado) y pase a otra confirmación. El búfer de blob se está actualizando.


Tenga en cuenta que mostrar otro blob no reutiliza el búfer de blob existente. En su lugar, crea un nuevo búfer que visita ese blob y luego muestra ese búfer en la ventana que anteriormente mostraba el otro búfer de blob. Ese otro búfer no se está eliminando, lo que desafortunadamente significa que se pueden acumular bastantes búferes en un corto período de tiempo. Cuál sería uno de esos bordes ásperos, mencioné anteriormente. Al presionar qun búfer de blob lo elimina, por lo que puede limpiar yendo a la ventana que se utilizó para mostrar los diversos búferes de blob y seguir presionando qhasta que se hayan eliminado todos los búferes.

Además, es posible navegar al blob siguiente o anterior desde un buffer de blob usando py n. Supongo que, en la mayoría de los casos, comienza con un blob reciente y luego retrocede a blobs más antiguos usando p. Si haces eso y luego quieres moverte en la otra dirección, te recomiendo que uses qpara matar el búfer actual y así pasar al búfer anterior, es decir, al siguiente blob.

También tenga en cuenta que no es necesario que primero visite una revisión para poder visitar un blob. También podría usarlo M-x magit-find-file RET <revision> RET <file> RETdirectamente, pero me parece menos conveniente.


Gracias tarsius. Estoy trabajando con magit 20151014.231(lo último que puedo decir). Intenté seguir los pasos que describiste anteriormente. Fui a lo magit-log-buffer-fileque me permite navegar por los commits arriba y abajo con ny ppero cuando presiono SPCo RETen uno de ellos obtengo:Symbol's value as variable is void: magit-blame-mode
Amelio Vazquez-Reina

Usted probablemente añadida magit-blame-maybe-update-revision-buffera magit-section-movement-hookpor error.
tarsius
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.