remove - git tag best practices
Usando emacs(y magit?) Para visitar un archivo en commit/branch/etc dado (4)
Si quiero ver cómo se veía foo.bar
en un cierto compromiso <COMMIT_ID>
entonces puedo invocar:
git show <COMMIT_ID>:foo.bar
Niza ... ¿Cómo puedo hacerlo en emacs
? Utilizando magit
? Utilizando vc
? Digamos que estoy visitando el archivo foo.bar
y quiero ver cómo se veía en <COMMIT_ID>
.
Hay un paquete llamado git-timemachine
que hace que el proceso de visualización de versiones anteriores de un archivo sea casi completamente transparente; Consulte el enlace para obtener instrucciones de instalación y una demostración. (Si ya está utilizando MELPA, solo haga Mx package-install
RET git-timemachine
RET ).
La forma en que funciona es que usted llama a Mx git-timemachine
RET desde un búfer que visita un archivo rastreado. Entonces tú puedes:
p
Visita anterior version historican
Visita la próxima versión históricaw
Copia el hash abreviado de la versión histórica actualW
Copia el hash completo de la versión histórica actualq
Salir de la máquina del tiempo.
Tenga en cuenta que si conoce el hash del compromiso que desea visitar, el comando personalizado de la solución de @phils le servirá mejor para ese caso de uso específico. Pero para navegar entre diferentes versiones de un archivo, encuentro que usar git-timemachine
es incluso más fácil que usar la funcionalidad que proporciona VC.
Por supuesto, puede enlazar git-timemachine
a un enlace clave de su elección.
La forma canónica de hacerlo en Emacs es usar VC: Cx v ~
desde el búfer del archivo, le pedirá una revisión y luego mostrará ese archivo tal como estaba en esa revisión. Debería funcionar para cualquier sistema de control soportado por VC, como Git, Bzr, ...
Si está viendo la confirmación en magit, simplemente presione Entrar en el archivo o parte del archivo que le interesa.
- Cx v l para ver el historial del archivo.
- nyp para moverse entre comillas.
- f para visitar el archivo a partir de la confirmación en el punto.
Eso está sujeto a la log-view-find-revision
, y si miramos el código que vemos, el bit crítico es:
(switch-to-buffer (vc-find-revision file revision)))
Así que podríamos envolver eso en una función personalizada así:
(defun my-vc-visit-file-revision (file revision)
"Visit FILE as it was at REVISION."
(interactive
(list (expand-file-name
(read-file-name (if (buffer-file-name)
(format "File (%s): " (file-name-nondirectory
(buffer-file-name)))
"File: ")))
(read-string "Revision: ")))
(require ''vc)
(switch-to-buffer
(vc-find-revision file revision)))
Edición: Stefan ha proporcionado una mejor respuesta, pero si le gustó poder seleccionar el archivo y la revisión, aquí tiene una versión de mi función que mantiene la selección de archivos interactivos, pero usa el código de vc-revision-other-window
Para la revisión de manejo.
Llegué a la conclusión de que el uso de otra ventana por defecto tiene más sentido, así que he hecho lo mismo aquí, a menos que proporcione un argumento de prefijo, en cuyo caso utiliza la ventana actual.
(defun my-vc-visit-file-revision (file rev)
"Visit revision REV of FILE in another window.
With prefix argument, uses the current window instead.
If the current file is named `F'', the revision is named `F.~REV~''.
If `F.~REV~'' already exists, use it instead of checking it out again."
;; based on `vc-revision-other-window''.
(interactive
(let ((file (expand-file-name
(read-file-name
(if (buffer-file-name)
(format "File (%s): " (file-name-nondirectory
(buffer-file-name)))
"File: ")))))
(require ''vc)
(unless (vc-backend file)
(error "File %s is not under version control" file))
(list file (vc-read-revision
"Revision to visit (default is working revision): "
(list file)))))
(require ''vc)
(unless (vc-backend file)
(error "File %s is not under version control" file))
(let ((revision (if (string-equal rev "")
(vc-working-revision file)
rev))
(visit (if current-prefix-arg
''switch-to-buffer
''switch-to-buffer-other-window)))
(funcall visit (vc-find-revision file revision))))