git ignore los archivos temporales de vim

238

¿Cuál es la forma correcta de hacer que git ignore los archivos temporales producidos por vim en todos los directorios (ya sea globalmente en todo el sistema o localmente para un solo proyecto)?

jrdioko
fuente
66
El patrón *.sw?resuelve el estándar .swppero también las extensiones alternativas de archivos de intercambio como .swo.
buley
77
@buley su sugerencia también ignorará los .swfarchivos. No recomendaría hacerlo, especialmente si está creando una aplicación Flash.
stephenmurdoch
1
@marflar Buen punto. .Sin embargo, el mismo patrón prefijado con el archivo oculto debería evitarlo.
buley
Hoy también vi un .swx.
Richard
2
Experimento demuestra que después de la creación de 16 archivos de copia de seguridad ( .tmp.swp, .tmp.swo, ..., .tmp.swa), crea vim .tmp.svz. Me falta la paciencia para ver lo que viene después .tmp.saa, .tmp.rzz¿ tal vez ? ACTUALIZACIÓN: Al buscar en la fuente ( src/memline.c, función findswapname()), se da por vencido .saacon un error: "E326: Se encontraron demasiados archivos de intercambio".
Keith Thompson

Respuestas:

392

Los archivos temporales de Vim terminan con ~ para que pueda agregar al archivo .gitignorela línea

*~

Vim también crea archivos de intercambio que tienen las extensiones swp y swo. para eliminar esos use las líneas:

*.swp
*.swo

Esto ignorará todos los archivos temporales de vim en un solo proyecto

Si desea hacerlo globalmente, puede crear un archivo .gitignore en su hogar (puede darle otro nombre o ubicación) y usar el siguiente comando:

git config --global core.excludesfile ~/.gitignore

Entonces solo necesita agregar los archivos que desea ignorar a ese archivo

nunopolonia
fuente
30
Vim creará archivos de intercambio sucesivamente nombrados (.swp, .swo, etc.), así que los uso .*.sw*en mi .gitignorepara ocultarlos a todos.
Drew Stephens
32
@DrewStephens, creo .*.sw?que es más preciso. (Aunque he visto a personas usar alguna variante de *.sw*para sospechar que a mí me falta algo realmente obvio ...)
Morten Siebuhr
10
@Morten Según vimdoc.sourceforge.net/htmldoc/recover.html ,. *. S ?? los atraparía a todos en Unix (los decrementos .s ?? de .swp a .saa).
Max Nanasy
66
Solo para ampliar un poco el excelente comentario de @MatrixFrog, ya que esta pregunta es para vim, puede encontrar el .gitignore correcto en ese proyecto aquí .
SnapShot
17
Ten cuidado. github .*.s[a-w][a-z]ignorará los .svgarchivos.
Jon
118

Alternativamente, puede configurar vim para guardar los archivos de intercambio en una ubicación separada, por ejemplo, agregando líneas similares a las siguientes en su .vimrcarchivo:

set backupdir=$TEMP//
set directory=$TEMP//

Vea este consejo vim para más información.

martinl
fuente
8
nota, en Mac OS X, puede usar $TMPDIRpara obtener el tempdir real :)
Alex Moore-Niemi
55
La doble barra inclinada después de su directorio preferido (uso ~ / tmp //) evita las colisiones de nombres de archivos al almacenar la ruta completa. De esa manera, aún puede editar archivos llamados, por ejemplo, config.xml en dos directorios al mismo tiempo.
Brian
1
Que $TEMPsignifica
temático
Tenga en cuenta que también tuve que agregar set undodir=$TEMP//, ya que también guardo archivos de deshacer persistentes.
Micah Lindstrom
24

Esto es algo que solo debe hacerse por usuario, no por repositorio. Si Joe usa emacs, querrá que se ignoren los archivos de respaldo de emacs, pero Betty (que usa vi) querrá que se ignoren los archivos de respaldo de vi (en muchos casos, son similares, pero existen alrededor de 24,893 editores comunes y es bastante ridículo tratar de ignorar todas las diversas extensiones de respaldo).

En otras palabras, no coloque nada adentro .gitignoreo core.excludesadentro $GIT_DIR/config. Ponga la información en su $HOME/.gitconfiglugar (como sugiere nunopolonia con --global). Tenga en cuenta que "global" significa por usuario, no por sistema.

Si desea la configuración en todo el sistema para todos los usuarios (lo que no quiere), necesitará un mecanismo diferente. (Posiblemente con la configuración de plantillas antes de la inicialización del repositorio).

William Pursell
fuente
3
Aparentemente, Betty es mucho más inteligente que Joe :-) Buen consejo y merecedor de un voto, a pesar de que terminé usando la respuesta de martinl (arreglándola en Vim en lugar de Git).
paxdiablo
11

También recomendaría pensar en ignorar archivos como:

.*.swp
.*.swo

ya que puede tener archivos que terminan con .swp

Anastasios Andronidis
fuente
5

Salga de vim antes de "git commit".

para vimusar otras carpetas para archivos de copia de seguridad ( /tmppor ejemplo):

set bdir-=.
set bdir+=/tmp

para hacer que vim deje de usar la carpeta actual para archivos .swp:

set dir-=.
set dir+=/tmp

El uso -=, +=sería generalmente bueno, porque vim tiene otros valores predeterminados para bdir, dir , no queremos borrar todo. Consulte la ayuda de vim para obtener más información sobre bdir, dir :

:h bdir
:h dir
Andrew_1510
fuente
55
Tenga cuidado donde almacena sus archivos de intercambio vim. Podría filtrar accidentalmente credenciales u otros datos de un archivo que está editando: security.stackexchange.com/questions/65883/…
Mnebuerquo
5

Aquí está el código VIM real que genera las extensiones de archivo de intercambio:

/* 
 * Change the ".swp" extension to find another file that can be used. 
 * First decrement the last char: ".swo", ".swn", etc. 
 * If that still isn't enough decrement the last but one char: ".svz" 
 * Can happen when editing many "No Name" buffers. 
 */
if (fname[n - 1] == 'a')        /* ".s?a" */
{   
    if (fname[n - 2] == 'a')    /* ".saa": tried enough, give up */
    {   
        EMSG(_("E326: Too many swap files found"));
        vim_free(fname);
        fname = NULL;
        break;  
    }
    --fname[n - 2];             /* ".svz", ".suz", etc. */
    fname[n - 1] = 'z' + 1;
}
--fname[n - 1];                 /* ".swo", ".swn", etc. */

Esto generará archivos de intercambio del formato:

[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-v][a-z]
[._]sw[a-p]

Que es más o menos lo que se incluye en el propio archivo gitignore de github para VIM .

Como otros han señalado correctamente, esto .gitignore también ignorará .svg archivos de imagen y SWF archivos flash de adobe.

rublo
fuente
3

Descubrí que esto hará que git ignore los archivos temporales creados por vim:

[._]*.s[a-w][a-z]
[._]s[a-w][a-z]
*.un~
Session.vim
.netrwhist
*~

También se puede ver aquí .

Instantánea
fuente
55
También ignorará esos molestos .swfarchivos que siguen apareciendo cada vez que crea una aplicación flash.
stephenmurdoch
Lo que funciona bien siempre y cuando no sea un desarrollador que necesite registrar sus archivos Flash :-)
paxdiablo
1
Esto ignorará .svgcuál puede ser un problema.
Bruno Bronosky
1
Es redundante incluir *.un~ya que tienes*~
Bruno Bronosky
2

Por supuesto,

solo tiene que crear un ".gitignore" en el directorio de inicio de su proyecto y debe contener

*.swp

Eso es

en un comando

project-home-directory$ echo '*.swp' >> .gitignore
forellana
fuente
44
Creo que echo *.swp >> .gitignorees mejor evitar anular el anterior .gitignore.
Cesar A. Rivas
2
No desea que el shell expanda el '*'. Entonces, useecho '*.swp' >> .gitignore
Eddified
Tampoco quieres perderte accidentalmente uno de esos >personajes. Una vez le hice eso al passwdarchivo y luego
cerré la
2
# VIM: Temperory files
*~

# VIM: Swap-files
[._]*.s[a-w][a-z]
[._]s[a-w][a-z]

# VIM: Commands :cs, :ctags
tags
cscope.*

# VIM session
Session.vim

# VIM: netrw.vim: Network oriented reading, writing, browsing (eg: ftp scp) 
.netrwhist

El nombre del archivo de intercambio es normalmente el mismo que el archivo que está editando, con la extensión ".swp".

  • En Unix, un '.' se antepone para intercambiar nombres de archivos en el mismo directorio que el archivo editado. Esto evita que el archivo de intercambio aparezca en una lista de directorio.
  • En máquinas MS-DOS y cuando la opción 'nombre corto' está activada, cualquier '.' en el nombre del archivo original se reemplaza con '_'.
  • Si este archivo ya existe (por ejemplo, cuando se está recuperando de un bloqueo) se emite una advertencia y se usa otra extensión, ".swo", ".swn", etc.
  • Un archivo existente nunca se sobrescribirá.
  • El archivo de intercambio se elimina tan pronto como Vim deja de editar el archivo.

El reemplazo de '.' con '_' se hace para evitar problemas con los sistemas de archivos compatibles con MS-DOS (p. ej., crossdos, multidos).

http://vimdoc.sourceforge.net/htmldoc/recover.html

http://www.vim.org/scripts/script.php?script_id=1075

usuario31986
fuente
0

En mi caso, los archivos temporales ya están comprometidos por acciones anteriores, por lo que modificar .gitignore no afectará a esos archivos comprometidos ..., git rm files_to_be_ignored --cacheprimero tiene que confirmar, luego confirmar, y HECHO.

ddwolf
fuente
0

Esto funciona en una Mac como lo señaló Alex Moore-Niemi:

set backupdir=$TMPDIR//
set directory=$TMPDIR//

Asegúrese de usar TMPDIRy no TEMPDIR.

Potestades
fuente
-4

Si está utilizando el control de fuente. Los archivos temporales de vim son bastante inútiles.
Por lo tanto, es posible que desee configurar vim para no crearlos.

Simplemente edite Su ~ / .vimrc y agregue estas líneas:

set nobackup
set noswapfile
Arnis Lapsa
fuente
66
El control de origen no funciona con la misma granularidad que las copias de seguridad o los archivos de intercambio de Vim. Incluso si se estaba comprometiendo después de cada guardado (o después de un cierto número de caracteres o segundos, una simplificación de lo que le dan los archivos de intercambio de Vim), es muy probable que desee editar archivos que no están controlados por la fuente (para qué copias de seguridad y swapfiles siguen siendo deseables).
Chris Johnsen
8
Los archivos temporales de VIM son extremadamente útiles para los bloqueos del editor y por varias otras razones. Apagarlos es arrojar al bebé con el agua del baño.
Brian Riehman
55
@Arnis Say, ¿un apagón? O que tu sesión X muera por alguna razón. Los archivos temporales vim son bastante importantes para la OMI.
jrdioko
1
@jrdioko X crash es la razón por la que uno puede querer usar screen(o dtachsi no quiere todas las funciones de la pantalla). Los cortes de energía son manejados por UPS. Las copias de seguridad las realiza {su software favorito para hacer una copia de seguridad de todos los archivos importantes}. Utilizo los archivos de intercambio para recibir notificaciones cuando intento editar archivos que ya están editados, archivos de copia de seguridad porque tener N + 1'th lugar con copia de seguridad no daña y deshacer archivos porque deshacer persistente es útil. Solo deshacer archivos son un poco importantes para mí.
ZyX
55
Es mejor decirle a Vim que almacene archivos temporales en otro lugar que apagarlos por completo.
Kyle