¿Cómo abro un archivo desde otra rama de git?

35

Me gustaría abrir un archivo desde otra rama en el repositorio git actual. He visto esta pregunta SO , pero las sugerencias para combinarlo con Vim son engorrosas (canalizar a Vim, abrir stdin, establecer tipo de archivo, etc. manualmente). ¿Hay alguna forma más sencilla de conservar el resaltado de sintaxis, la configuración del tipo de archivo, etc.?

Si ayuda:

  • Tengo instalado el complemento fugitivo (aunque rara vez se usa).
  • No necesito modificarlo.

El archivo puede ser el archivo del búfer abierto actualmente o uno diferente.

muru
fuente

Respuestas:

49

Puede usar :Gedit/ :Gsplit/ :Gvsplit/ ... con el formulario{revision}:{filename}

:Gedit branch:/foo/bar.c

Nota: Si el archivo es el mismo que el archivo actual se puede abreviar el comando de esta manera: :Gsplit branch:%.

A menudo, se prefiere una diferencia del archivo actual que simplemente abrir el archivo en una rama diferente. Puedes hacerlo a través de :Gdiff {branch}.

Para más ayuda ver:

:h fugitive-:Gedit
:h fugitive-revision
:h fugitive-:Gdiff
:h c_%

También es posible que desee ver los episodios de Vimcasts en la serie Fugitive .

Peter Rincker
fuente
¡Hermosa! Curioso: ¿qué sucede si modifico un archivo tan abierto?
muru
1
@muru Notará que el búfer se abre en un búfer de solo lectura (probablemente observe un [RO]en la línea de estado).
Peter Rincker
Sí, está ahí.
muru
fugitivenecesita la ruta desde la raíz del repositorio. La respuesta ya cubre esto, pero supuse erróneamente que el fugitivo podría entender cuando estamos en un subdirectorio particular del repositorio.
Paschalis
increíble ... primera vez usando fugitivo ... aunque lo tuve instalado durante mucho tiempo :)
alpha_989
14

Esto es un poco más amplio de lo que OP solicitó, pero para las personas que no desean usar complementos, y posiblemente otros sistemas de control de revisión, este pequeño fragmento tiende a funcionar bastante bien:

:new
:r! git show branch:file
:1d

Crea una nueva ventana y muestra el archivo allí leyendo la salida del comando dado en el nuevo búfer. Esto, por supuesto, funciona con cualquier comando externo, no solo con git.

Ejemplo para bzr (donde la sintaxis REV puede especificar una rama):

:new
:r! bzr cat -r REV file
:1d

Ejemplo para hg (no estoy seguro acerca de las ramas en hg; no lo use lo suficiente)

:new
:r! hg cat -r REV file
:1d

Ejemplo para svn (

:new
:r! svn cat file@REV
:1d

Probablemente aún desee configurar el tipo de archivo para obtener resaltado de sintaxis como en las publicaciones SO, pero al menos no tiene que meterse con las tuberías.

Una vez abierto, puede guardarlo con un nuevo nombre con :w filenameo :saveas filename, ya que Vim todavía no tendrá un nombre de archivo. Si no desea poder editarlo, también puede agregar ay :setlocal readonly/ o :setlocal nomodifiable.

-Editar: tipo de archivo automático-

Es un poco más de trabajo, pero puedes pedirle a Vim que adivine el tipo de archivo con

:filetype detect

Pero, dado que Vim aún no tiene un nombre, esto no siempre funciona bien (por ejemplo, saqué un código C y lo adivinó filtype=conf.

Podemos darle un nombre guardándolo, pero no queremos sobrescribir un archivo posiblemente existente. También podemos establecer el nombre del archivo (¡Gracias @PeterRincker!), Pero de nuevo, no queremos arriesgarnos a colisiones. Como es poco probable que exista un archivo que sea el nombre de la rama y el nombre del archivo juntos, los concatenaremos con un separador arbitrario

:exe "silent file " . "branch" . "-" . "file"
:filetype detect

Donde "file"se reemplaza con el nombre de archivo real y "branch"con el nombre de la sucursal

Por supuesto, en este punto casi estamos escribiendo un complemento ;-)

Al unirlo todo, aquí está como una función específica de git que podría colocar en su vimrc:

function! GitFile(branch,file)
    new
    exe "silent r! git show " . a:branch . ":" . a:file
    1d
    exe "silent file " . a:branch . "-" . a:file
    filetype detect
    setlocal readonly     "don't allow saving
    setlocal nomodified   "allow easy quitting without saving
    setlocal nomodifiable "don't allow modification
endfunction

que podría envolver en un comando o llamar directamente, por ejemplo call GitFile("whateverBranch","myfile.c"). Obtendrá una nueva ventana con un búfer llamadowhateverBranch-myfile.c

John O'M.
fuente
¿Y puedo hacer que detecte automáticamente el tipo de archivo, la sintaxis, etc. con este método?
muru
Lamentablemente, no sin un poco más de trabajo;
Actualicé
1
Recomiendo usar el método de complemento de la publicación de @ PeterRinker si puedes. Debería hacer muchas de las cosas buenas que te gustaría. Principalmente quería mostrar que no es necesario dejar el editor ni lidiar con las molestias de las tuberías para obtener los datos, y sé que hay algunas personas que odian tener que usar complementos.
John O'M.
1
Acabo de agregar un poco para poder detectar el tipo de archivo. Ya no es algo que desee escribir solo sobre la marcha, pero podría funcionar como una adición fácil a un .vimrc. El uso de un complemento específico probablemente seguirá funcionando mejor.
John O'M.
Es posible que desee considerar el uso :filepara nombrar su archivo en lugar de tener un archivo temporal. Ver:h :file
Peter Rincker