git ignora arquivos temporários do vim

238

Qual é a maneira correta de fazer o git ignorar arquivos temporários produzidos pelo vim em todos os diretórios (globalmente no sistema ou localmente para um único projeto)?

jrdioko
fonte
6
O padrão *.sw?resolve o padrão, .swpmas também as extensões de arquivo de troca alternativas .swo.
Buley
7
@ Buley, sua sugestão também ignorará os .swfarquivos. Eu desencorajaria isso, especialmente se você estiver criando um aplicativo Flash.
stephenmurdoch
1
@marflar Bom ponto. O mesmo padrão prefixado com o arquivo oculto .deve impedir isso.
Buley
Também vi um .swx hoje.
Richard
2
Mostra experimento que depois de criar 16 arquivos de backup ( .tmp.swp, .tmp.swo..., .tmp.swa), vim cria .tmp.svz. Não tenho paciência para ver o que vem depois .tmp.saa- talvez .tmp.rzz? UPDATE: Procurando na fonte ( src/memline.c, função findswapname()), desiste depois .saacom um erro: "E326: Foram encontrados muitos arquivos de troca".
21416 Keith Thompson

Respostas:

392

Os arquivos temporários do Vim terminam com ~ para que você possa adicionar ao arquivo .gitignorea linha

*~

O Vim também cria arquivos de troca com as extensões swp e swo. para remover aqueles use as linhas:

*.swp
*.swo

Isso ignorará todos os arquivos temporários do vim em um único projeto

Se você quiser fazer isso globalmente, poderá criar um arquivo .gitignore em sua casa (você pode dar outro nome ou local) e usar o seguinte comando:

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

Então você só precisa adicionar os arquivos que deseja ignorar nesse arquivo

nunopolonia
fonte
30
O Vim criará arquivos de troca nomeados sucessivamente (.swp, .swo etc.), então eu uso .*.sw*no meu .gitignorepara ocultar todos eles.
Drew Stephens
32
@DrewStephens, acredito .*.sw?ser mais preciso. (Embora eu tenha visto pessoas usar alguma variante *.sw*a suspeitar de que eu sou a algo que falta realmente óbvio ...)
Morten Siebuhr
10
@ Morten De acordo com vimdoc.sourceforge.net/htmldoc/recover.html ,. *. S ?? pegaria todos eles no Unix (os .s ?? diminuem de .swp para .saa).
Max Nanasy
6
Apenas para expandir um pouco o excelente comentário do @MatrixFrog - já que esta pergunta é para o vim, você pode encontrar o .gitignore correto nesse projeto aqui .
SnapShot
17
Seja cuidadoso. O github's .*.s[a-w][a-z]ignorará os .svgarquivos.
Jon
118

Como alternativa, você pode configurar o vim para salvar os arquivos de troca em um local separado, por exemplo, adicionando linhas semelhantes à seguinte ao seu .vimrcarquivo:

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

Veja esta dica do vim para mais informações.

martinl
fonte
8
nota, no Mac OS X, você pode usar $TMPDIRpara obter o tempdir real :)
Alex Moore-Niemi
5
A barra dupla após o diretório preferido (eu uso ~ / tmp //) evita colisões de nomes de arquivos armazenando o caminho completo. Dessa forma, você ainda pode editar arquivos nomeados, por exemplo, config.xml em dois diretórios ao mesmo tempo.
Brian
1
O que $TEMPsignifica isso ?
themefield
Nota: eu também precisei adicionar set undodir=$TEMP//, pois também salvei arquivos desfazer persistentes.
Micah Lindstrom
24

Isso é algo que deve ser feito apenas por usuário, não por repositório. Se Joe usa o emacs, ele desejará que os arquivos de backup do emacs sejam ignorados, mas Betty (que usa o vi) desejará que os arquivos de backup do vi sejam ignorados (em muitos casos, eles são semelhantes, mas existem cerca de 24.893 editores comuns existentes e é bastante ridículo tentar ignorar todas as várias extensões de backup.)

Em outras palavras, não coloque nada dentro .gitignoreou core.excludesdentro $GIT_DIR/config. Em $HOME/.gitconfigvez disso, insira as informações (como sugere a nunopolonia --global.) Observe que "global" significa por usuário, não por sistema.

Se você deseja configurar o sistema para todos os usuários (o que você não deseja), precisará de um mecanismo diferente. (Possivelmente com a configuração de modelos antes da inicialização do repositório.)

William Pursell
fonte
3
Aparentemente, Betty é muito mais esperta que Joe :-) Bons conselhos e merecedor de votação, apesar de eu ter acabado de usar a resposta de martinl (corrigi-la no Vim e não no Git).
21415
11

Eu também recomendaria pensar em ignorar arquivos como:

.*.swp
.*.swo

pois você pode ter arquivos que terminam com .swp

Anastasios Andronidis
fonte
5

Saia do vim antes de "git commit".

para fazer vimuso de outras pastas para arquivos de backup ( /tmppor exemplo):

set bdir-=.
set bdir+=/tmp

para fazer com que o vim pare de usar a pasta atual para arquivos .swp:

set dir-=.
set dir+=/tmp

-=, +=Geralmente, o uso seria bom, porque o vim tem outros padrões para bdir, dir , não queremos limpar tudo. Verifique a ajuda do vim para obter mais informações sobre o bdir, dir :

:h bdir
:h dir
Andrew_1510
fonte
5
Cuidado ao armazenar seus arquivos de troca vim. Você poderia acidentalmente vazamento de credenciais ou outros dados de um arquivo que você está editando: security.stackexchange.com/questions/65883/...
Mnebuerquo
5

Aqui está o código VIM real que gera as extensões de arquivo de troca:

/* 
 * 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. */

Isso irá gerar arquivos de troca do formato:

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

Que é praticamente o que está incluído no próprio arquivo gitignore do Github para o VIM .

Como outros observaram corretamente, esse .gitignore também ignorará os arquivos de imagem .svg e os arquivos flash .swf adobe.

rublo
fonte
3

Eu descobri que isso terá o git ignore os arquivos temporários criados pelo vim:

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

Também pode ser visto aqui .

Instantâneo
fonte
5
Ele também ignorará os .swfarquivos incômodos que aparecem sempre que você cria um aplicativo em flash.
stephenmurdoch
O que funciona bem, desde que você não seja um desenvolvedor que precisa verificar seus arquivos Flash :-) #
384
1
Isso ignorará o .svgque pode ser um problema.
de Bruno Bronosky
1
É redundante incluir *.un~desde que você o tenha*~
Bruno Bronosky 26/10
2

certo,

basta criar um ".gitignore" no diretório inicial do seu projeto e conter

*.swp

é isso aí

em um comando

project-home-directory$ echo '*.swp' >> .gitignore
forellana
fonte
4
Acho echo *.swp >> .gitignoremelhor evitar a substituição do .gitignore anterior.
Cesar A. Rivas
2
Você não deseja que o shell expanda o '*'. Então, useecho '*.swp' >> .gitignore
Eddified
Você também não quer perder acidentalmente um desses >personagens. Uma vez eu fiz isso com o passwdarquivo e depois desconectado :-) #
285
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

O nome do arquivo de troca normalmente é o mesmo que o arquivo que você está editando, com a extensão ".swp".

  • No Unix, um '.' é anexado para trocar nomes de arquivos no mesmo diretório que o arquivo editado. Isso evita que o arquivo de troca seja exibido em uma lista de diretórios.
  • Em máquinas MS-DOS e quando a opção 'shortname' estiver ativada, qualquer '.' no nome do arquivo original é substituído por '_'.
  • Se esse arquivo já existir (por exemplo, quando você estiver se recuperando de uma falha), um aviso será dado e outra extensão será usada, ".swo", ".swn", etc.
  • Um arquivo existente nunca será substituído.
  • O arquivo de troca é excluído assim que o Vim para de editar o arquivo.

A substituição de '.' com '_' é feito para evitar problemas com sistemas de arquivos compatíveis com MS-DOS (por exemplo, crossdos, multidos).

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

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

user31986
fonte
0

No meu caso, os arquivos temporários já foram confirmados por ações anteriores, portanto, modificar .gitignore não afetará esses arquivos git rm files_to_be_ignored --cacheconfirmados ..., você deve primeiro, depois confirmar e, em seguida, CONCLUÍDO.

ddwolf
fonte
0

Isso funciona em um Mac, como observado por Alex Moore-Niemi:

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

Certifique-se de usar TMPDIRe não TEMPDIR.

Poderes
fonte
-4

Se você estiver usando o controle de origem. os arquivos temporários do vim são bastante inúteis.
Portanto, você pode querer configurar o vim para não criá-los.

Apenas edite seu ~ / .vimrc e adicione estas linhas:

set nobackup
set noswapfile
Arnis Lapsa
fonte
6
O controle de origem não opera na mesma granularidade dos backups ou dos arquivos de troca do Vim. Mesmo se você estivesse confirmando após cada salvamento (ou após um certo número de caracteres ou segundos - uma simplificação do que os arquivos de troca do Vim oferecem), ainda é altamente provável que você queira editar arquivos que não são controlados pela origem (para os quais backups e swapfiles ainda são desejáveis).
precisa saber é o seguinte
8
Os arquivos temporários do VIM são extremamente úteis para falhas do editor e por vários outros motivos. Desligá-los está jogando fora o bebê com a água do banho.
Brian Riehman
5
@ Arnis Diga, uma queda de energia? Ou sua sessão X morre por algum motivo. Os arquivos temporários do vim são IMO bastante importantes.
Jrdioko
1
@jrdioko X crash é a razão pela qual alguém pode querer usar screen(ou dtachse ele não deseja todos os recursos da tela). As falhas de energia são tratadas pelo UPS. Os backups são feitos pelo {seu software favorito para fazer backup de todos os arquivos importantes}. Eu uso arquivos de troca para ser notificado quando tento editar arquivos que já foram editados, arquivos de backup, porque ter N + 1 º lugar no backup não prejudica e desfaz arquivos, porque desfazer persistente é útil. Apenas desfazer arquivos são um pouco importantes para mim.
ZyX 28/01
5
É melhor dizer ao vim para armazenar arquivos temporários em outro lugar do que desativá-los completamente.
Kyle