2010-05-28 12 views
11

He estado usando git junto con fugitive.vim para administrar el código cuando estoy en Windows. Sin embargo, me encontré con un problema. De acuerdo con el documentation, el comando: GDiff debe tener una ventana de diferencia y me permite representar solo partes de un archivo. Sin embargo, cuando ejecuto el comando en un archivo con cambios, aparece el siguiente mensaje de error: alt textError al usar el comando: GDiff de fugitive.vim usando gvim para windows y msys git 1.7.0.2

¿Este es un problema con Windows? ¿empuje? ¿fugitivo? msysgit? permisos de archivos? ¿Alguien sabe?

+3

Tengo el mismo * _exact_ * mismo problema, por favor, háganos saber si/cómo se resuelve esto. – Charles

Respuesta

1

Eso puede estar relacionado con el issue 428 of msysgit mentioned in my SO answer.

Intente reparar el cmd/git.cmd como lo describo en mi respuesta anterior y vea si esta ayuda.

Baring que, 2 opciones sigue siendo:

  • sea un problema de bloqueo (el archivo está bloqueado por un proceso): una utilidad como process monitor o process explorer podría ayudar a ver si es el caso (y lo asa exactamente hay en ese archivo de intercambio)
  • o un problema de Git. Un buen truco es entonces instalar el instalador de red de msysgit, que construirá la última versión de Git en su Windows. A continuación, puede intentar y ver si el problema persiste con esa versión actualizada.
    Nota: tercera opción, intentar degradar Git, nuevamente para descartar cualquier enlace con esa herramienta.
+0

Ya he parcheado git.cmd, que solucionó el problema anterior (gracias por eso, dicho sea de paso). –

+0

@Paul: ¡No me di cuenta de que eras tú quien hacía la pregunta anterior! ;) – VonC

+0

@Paul: He actualizado mi respuesta con algunas pruebas más para hacer. – VonC

1

BTW mismo error que obtuve, cuando traté de: archivo no guardado de gdiff - cuando lo guardé (: w) ¡funciona!

14

Tuve el mismo problema: así es como lo solucioné.

De forma predeterminada, Vim intentará almacenar archivos de intercambio junto al original. Fugitive crea un búfer que no se corresponde con ninguna ruta de archivo real, por lo que Vim barfs cuando intenta crear el archivo de intercambio. La solución es asegurarse de que Vim tiene una ruta en la que puede escribir a.

Así es como me fijo esto:

if has("win32") || has("win64") 
    set directory=$TMP 
else 
    set directory=~/tmp 
end 

Aquí está el tema original en GitHub: https://github.com/tpope/vim-fugitive/issues/9

EDIT:

Como fow puntos siguientes, que probablemente es mejor usar algo como el siguiente:

set directory+=,~/tmp,$TMP 

Vim debe usar la primera ruta que pueda.

+1

Puede valer la pena señalar que la opción ''directorio' es una lista de directorios, y Vim utilizará la primera que pueda. Lo mejor es simplemente agregar un valor a la lista en lugar de borrar todo, como en 'set directory + = $ TMP'. Es seguro hacer esto sin una comprobación del sistema operativo, ya que '~/tmp' se agrega de manera predeterminada en Unix, e incluso si' $ TMP' está vacío en Unix, agregando que no hará nada – fow

+0

@fow: +1 - Necesito para incluir ',' cuando hago 'set directory + =', right (ya que es una lista delimitada por comentarios)? – Charles

+0

Además, intente 'establecer directorio^= $ TMP' (ver [': help: set^= '] (http://vimhelp.appspot.com/options.txt.html#%3Aset%5E%3D)). –

2

No tengo una máquina con Windows, pero pude reproducir y aislar este problema en un sistema Mac OS X 10.6.

O crear C:\TMP o C:\TEMP (:help 'directory' dice que ambos están en el valor predeterminado de la opción directory en Windows construye de Vim), o añadir un directorio existente al valor de la opción directory.

Utilizo un directorio temporal específico de Vim en mi directorio de inicio (de nuevo, no aparece Windows aquí) y agrego dos barras diagonales (~/tmp/.vim-swaps//). Este tipo de configuración centraliza los archivos de intercambio pero les da nombres únicos basados ​​en los directorios de los archivos que se están editando. Consulte "Ventajas" y "Desventajas" en :help :swapname, así como "si un directorio finaliza en dos separadores de ruta" en el bit :help 'directory'.

Uso ^= anteponer su directorio (de modo que siempre se utiliza, si es que existe):

set directory^=C:\\some\\existing\\directory// 

O bien, utilizar += para añadir el directorio (de modo que sólo se utiliza si existe y no existen otros directory entradas aplicables):

set directory+=C:\\some\\existing\\directory// 

Charles’ answer sugiere que $TMP (una referencia a una variable de entorno) podría ser un buen valor para Windows:

set directory+=$TMP// 

La causa está relacionada con el valor predeterminado de la opción directory combinado con el nombre de ruta del archivo de índice ‘pseudo’ :Gdiff ‘s.

El tampón para el lado de índice de una vista :Gdiff utiliza una ruta especial que se parece a fugitive:///path/to/repository/.git//0/path/to/file/under/repository (capturas de fugitivos lee y escribe a los tampones así designados y los redirige al índice invocando Git comandos “fontanería”).

La primera entrada en directory es generalmente .. Esto significa que Vim intentará colocar el archivo de intercambio en el mismo directorio que el archivo editado (es decir, foo/bar.txt intentará usar foo/.bar.swp). Si no se puede crear este archivo de intercambio preferido, se intentarán las entradas siguientes desde directory.

Con . como la primera directory, el archivo de intercambio preferido para fugitive:///path/to/repository/.git//0/path/to/file/under/repository será fugitive:///path/to/repository/.git//0/path/to/file/under/.repository.swp. Los principales componentes de este nombre de ruta (fugitive:, path, to, etc.) probablemente no existan, por lo que Vim pasará a la siguiente entrada desde directory. Si ninguna de las otras entradas directory se puede utilizar para crear archivos de intercambio (por ejemplo, no existen), entonces obtiene el error E302.

I fue capaz de reproducir su problema en un sistema Unix-y mediante el uso de set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir (es decir, tomando el valor Unix predeterminado y el cambio de las apariciones de tmp-no-such-dir). Ninguno de los directorios "no-tal-dir" realmente existió. Obtuve el mismo error cuando uso :Gdiff.

:help :set^= sólo se dice “add”, pero el código de muestra que set listopt^=… antepone similar a cómo set listopt+=… APPENDs (ya que este último está documentado que hacer). Ambos deben insertar comas automáticamente según sea necesario (aunque puede haber errores en esta área).

+0

Me pregunto por qué fugitive permite tanto leer como escribir en los buffers 'fugitive: /// path/to/repository/.git // 0/path/to/file/under/repository' ¿Por qué no son de solo lectura? En mi caso, puedo modificar esos buffers, y si los guardo y luego ejecuto 'git diff', la salida se ve afectada. –

+1

@ HảiPhong: También intente 'git diff --cached'. Con esos nombres de pseudo-path (como 'fugitive: // .../.git // 0/...'), editarlos y guardarlos es equivalente a cambiar directamente el contenido que se organiza para la siguiente confirmación (es decir, el '' índice '' de Git). : etapa 0). Si confía en usar el índice para elaborar su próxima confirmación, puede ser una herramienta poderosa (como 'git add' o' git reset' con '--patch', pero mucho más directa). Si no desea utilizar el índice, puede "borrar" su contenido (hacer que coincida con HEAD) con 'git reset ' (o ': Gread -' en el búfer en cuestión). –

+0

Guau, eso lo explica. Gracias –

Cuestiones relacionadas