Como eu configuro o git para ignorar alguns arquivos localmente?

1350

Posso ignorar arquivos localmente sem poluir a configuração global do git para todos os outros? Tenho arquivos não rastreados que são spam no meu status git, mas não quero confirmar alterações de configuração do git para cada pequeno arquivo aleatório não rastreado que tenho em minhas filiais locais.

Bjorn
fonte

Respostas:

1863

Na documentação relevante do Git :

Padrões específicos de um repositório específico, mas que não precisam ser compartilhados com outros repositórios relacionados (por exemplo, arquivos auxiliares que vivem dentro do repositório, mas são específicos ao fluxo de trabalho de um usuário) devem ser inseridos no $GIT_DIR/info/excludearquivo.

O .git/info/excludearquivo tem o mesmo formato que qualquer .gitignorearquivo. Outra opção é definir core.excludesFileo nome de um arquivo que contém padrões globais.

Observe que, se você já possui alterações em estágios, execute o seguinte após editar seus padrões de ignição:

git update-index --assume-unchanged <file-list>

Nota sobre$GIT_DIR : Esta é uma notação usada em todo o manual do git simplesmente para indicar o caminho para o repositório do git. Se a variável de ambiente estiver definida, ela substituirá o local de qualquer repositório em que você esteja, o que provavelmente não é o que você deseja.


Edit : Outra maneira é usar:

git update-index --skip-worktree <file-list>

Inverta-o por:

git update-index --no-skip-worktree <file-list>
Josh Lee
fonte
204
Como uma nota, certifique-se de executar git update-index --assume-unchanged [<file>...]depois de adicionar o arquivo de exclusão. As alterações não serão detectadas até então.
Tollmanz 30/03
30
Não precisei executar o 'git update-index ...' para que as alterações entrassem em vigor usando o git 1.7.9.5.
Jeffrey Martinez
39
Você só precisa usar o git update-index se você já fez uma alteração no arquivo e agora deseja que ele seja ignorado. Se você alterar excluir antes de fazer a alteração, não será necessário.
Brady Emerson
13
Enquanto isso impede que o arquivo apareça como alterado durante as confirmações como .gitignore, diferentemente dos arquivos ignorados, os arquivos ainda serão redefinidos para a versão repo se você executar git reset --hard.
Brady Emerson
19
Por stackoverflow.com/questions/23097368/… e stackoverflow.com/questions/13630849/… , skip-worktreeprovavelmente seria o preferido assume-unchanged.
DanShumway
436

Atualização : considere usar em git update-index --skip-worktree [<file>...]vez disso, obrigado @danShumway! Veja a explicação de Borealid sobre a diferença das duas opções .


Resposta antiga:

Se você precisar ignorar as alterações locais nos arquivos rastreados (temos isso com modificações locais nos arquivos de configuração), use git update-index --assume-unchanged [<file>...].

Florian Sesser
fonte
8
Apenas para observar, adicionei um arquivo ao $ GIT_DIR / info / exclude (por exemplo, meu-arquivo.php) e, em seguida, tive que correr git update-index --assume-unchanged my-file.phppara que ele começasse a ser ignorado. Obrigado pela dica!
Tollmanz 30/03
78
Para desfazer-lo: git update-index --no-assume-unchanged my-file.php
Ray
18
Apenas para esclarecimento: assume-inalterado é para arquivos rastreados (existe no repositório) ... O OP estava solicitando arquivos NÃO rastreados; nesse caso, .git/info/excludeé o que você deseja (para evitar poluir o .gitignore frequentemente compartilhado e rastreado)
dyodji
7
De acordo com stackoverflow.com/questions/23097368/…, isso é considerado inseguro e seus arquivos ainda podem ser confirmados se você não tomar cuidado. Pretende-se como uma ajuda ao desempenho, não como uma solução infalível para esse problema.
danShumway
3
Corri --assume-unchangedantes de ler sua atualização . Eu desfiz --no-assume-unchangede depois fiz o --skip-worktree... Estou livre?
Nicolas Miari 07/07
162

Adicione as seguintes linhas à seção [alias] do seu arquivo .gitconfig

ignore = update-index --assume-unchanged
unignore = update-index --no-assume-unchanged
ignored = !git ls-files -v | grep "^[[:lower:]]"

Agora você pode usar git ignore my_filepara ignorar alterações no arquivo local e git unignore my_fileparar de ignorá-las. git ignoredlista os arquivos ignorados.

Esta resposta foi adquirida em http://gitready.com/intermediate/2009/02/18/temporariamente-ignoring-files.html .

phatmann
fonte
1
^ [[: lower:]] "- Qualquer chance que você sabe como fazer isso no Windows cmd | "git ls-files -v grep!"?
Haohmaru
3
Instale um shell real (por exemplo, o Babun fornece bash ou zsh);) Conheço seus sentimentos, mas recentemente mudei do Windows para o Linux e nunca mais usaria o cmd.
Xerus
@Haohmaru, você sempre pode usar o WSL (Windows Subsystem for Linux).
A Sz
110

Você tem várias opções:

  • Deixe um .gitignorearquivo sujo (ou não confirmado) em seu diretório de trabalho (ou aplique-o automaticamente usando o topgit ou alguma outra ferramenta de correção).
  • Coloque as exclusões no seu $GIT_DIR/info/exclude arquivo, se isso for específico para uma árvore.
  • Execute git config --global core.excludesfile ~/.gitignoree adicione padrões ao seu ~/.gitignore. Esta opção se aplica se você deseja ignorar certos padrões em todas as árvores. Eu uso isso para .pyce .pyoarquivos, por exemplo.

Além disso, verifique se você está usando padrões e não enumerando explicitamente os arquivos, quando aplicável.

Emil Sit
fonte
10
Eu acho que você precisa git config --globaldefinir a opção globalmente.
Josh Lee
7
Na verdade, basta adicionar .gitignore a .gitignore;)!
Dominik George
68

Eu acho que você está procurando:

git update-index --skip-worktree FILENAME

que ignoram as alterações feitas localmente

Aqui está http://devblog.avdi.org/2011/05/20/keep-local-modifications-in-git-tracked-files/ mais explicações sobre essas soluções!

desfazer o uso:

git update-index --no-skip-worktree FILENAME
Piotr Korlaga
fonte
9
Há uma discussão relevante entre --skip-worktreee --assume-unchangedem esta pergunta SO
Merwer
1
Como eu desfazer isso ou ver a lista de arquivos / padrões que estão sendo ignorados atualmente --skipworktree, devo mudar de ideia mais tarde e querer começar a rastrear o arquivo novamente?
Anomaly
1
como desfazer isso?
user1735921
3
Para uso por favor desfazergit update-index --no-skip-worktree <file>
user1735921
49

Você pode instalar alguns aliases do git para tornar esse processo mais simples. Isso edita o [alias]nó do seu .gitconfigarquivo.

git config --global alias.ignore 'update-index --skip-worktree'
git config --global alias.unignore 'update-index --no-skip-worktree'
git config --global alias.ignored '!git ls-files -v | grep "^S"'

Os atalhos que você instala para você são os seguintes:

  • git ignore config.xml
    • O git fingirá que não vê nenhuma alteração config.xml- impedindo que você faça essas alterações acidentalmente.
  • git unignore config.xml
    • O git continuará reconhecendo suas alterações em config.xml- permitindo que você confirme essas alterações novamente.
  • git ignored
    • O git listará todos os arquivos que você está "ignorando" da maneira descrita acima.

Eu as construí referindo- me à resposta de phatmann - que apresenta uma --assume-unchangedversão da mesma.

A versão que apresento usa --skip-worktreepara ignorar alterações locais. Veja a resposta de Borealid para uma explicação completa da diferença, mas --skip-worktreeo objetivo de essencialmente é que os desenvolvedores alterem arquivos sem o risco de confirmar suas alterações .

O git ignoredcomando apresentado aqui usa git ls-files -ve filtra a lista para mostrar apenas as entradas que começam com a Stag. A Stag indica um arquivo cujo status é "pular árvore de trabalho". Para obter uma lista completa dos status dos arquivos mostrados por git ls-files: consulte a documentação da -topção em git ls-files.

Birchlabs
fonte
1
Isso não funciona para arquivos untracked: <(git 2.13.5 no OSX)
Terra Ashley
É o '!' deveria estar dentro '!git ls-files -v | grep "^S"'? O comando não funciona para mim com ele lá .. e parece funcionar bem com ele removido.
quer
o ponto de exclamação em um alias do git diz ao git para executar um comando externo , em vez de um subcomando git . Coloquei porque preciso de um pipeline de shell, então preciso invocar o git de fora. Eu apenas tentei remover o ponto de exclamação (conforme sua recomendação), mas isso não funciona para mim. Eu entendo Expansion of alias 'ignored' failed; 'git' is not a git command. Isso faz sentido; sem o ponto de exclamação: git alias o seu comando para git git ls-files ….
Birchlabs
Obrigada pelo esclarecimento. Eu não estou familiarizado com o alias do git e estava apenas rodando em um shell para testar antes de fazer o alias.
Tiris
Esta é uma solução brilhante. Como o git rastreia por diretório, quando você executa o alias acima git ignore <filename>, ele se aplica somente a esse diretório. E quando você finalmente quiser fazer as alterações nesse arquivo e confirmar e enviar para remoto, use o prático git unignore <filename>para começar a rastrear temporariamente novamente! Obrigado!
nickang 21/09/18
42

Você pode simplesmente adicionar um arquivo .gitignore ao seu diretório pessoal, $HOME/.gitignoreou seja, ou ~/.gitignore. Em seguida, diga ao git para usar esse arquivo com o comando:

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

Este é um arquivo .gitignore normal, que o git faz referência ao decidir o que ignorar. Como está no diretório inicial, ele se aplica apenas a você e não polui nenhum arquivo .gitignore do projeto.

Uso essa abordagem há anos com ótimos resultados.

JESii
fonte
Obrigado, @EricChen. Eu atualizei a resposta; experimente e use git check-ignore <file-name>para verificar. LMK se ele funciona para você
JESii
Só funcionou para mim sem o =:git config --global core.excludesfile ~/.gitignore
E. Sundin
Coloquei um .gitignorearquivo no diretório inicial e disse ao git para usá-lo; em seguida, excluí os arquivos que gostaria de rastrear localmente. No entanto, depois de enviar as alterações, o repositório remoto também excluiu esses arquivos. Fiz algo de errado?
Zyy 12/05/19
Uau, @xyz; .gitignoreé sobre ignorar arquivos que existem no diretório local. O que você deveria ter feito é git rm --cachedque os remove do repositório, mas os deixa no seu local. Você poderá voltar ao seu commit anterior com algo como git reset --soft HEAD^desfazer esse commit e recuperar seus arquivos. Essa é a beleza do git: tudo ainda está presente na sua história do git.
JESii 12/05/19
2

Para ignorar arquivos não rastreados, especialmente se eles estiverem localizados em (algumas) pastas que não são rastreadas, uma solução simples é adicionar um .gitignorearquivo a todas as pastas não rastreadas e inserir uma única linha contendo, *seguida por uma nova linha. É uma solução realmente simples e direta se os arquivos não rastreados estiverem em algumas pastas. Para mim, todos os arquivos eram provenientes de uma única pasta não rastreada vendore os itens acima apenas funcionavam.

aak318
fonte
1
Ótimo! FYI: Isso funciona apenas porque o git apenas rastreia (e permite confirmar) arquivos, não pastas.
jmiserez 28/02
-2

Se o seu repositório ainda não tiver um arquivo .gitignore, uma solução simples é criar um arquivo .gitignore e adicionar .gitignoreà lista de arquivos a serem ignorados.

Gavin S. Yancey
fonte
4
E se a equipe quiser adicionar um gitignore mais tarde? Isso funciona mesmo? Parece uma péssima idéia e algo que nem deveria funcionar.
Bjorn
A resposta desse cara me rachou. De jeito nenhum alguém está fazendo isso.
Martyn Chamberlin
Esta é uma solução rápida e simples, desde que haja um local para colocá-lo. Nosso repositório tem um .gitignorearquivo compartilhado na parte superior. Mas meus arquivos sujos estão em uma pasta profunda, então acabei de adicionar os meus .gitignoreao lado deles. 1
joeytwiddle