Como você faz o Git ignorar arquivos sem usar o .gitignore?

132

Devido a restrições estranhas externas, não posso modificar o .gitignorerepositório. Existe uma maneira de ignorar arquivos e diretórios além de modificar um .gitignore? Mesmo que seja uma solução global como uma configuração global que será aplicada a todos os meus repositórios.

pupeno
fonte

Respostas:

178

Não esqueça, de acordo com o gitignore , que existe uma ordem de precedência nas diferentes "fontes de padrões de ignorar" que o Git considera:

  • Os padrões são lidos na linha de comando para os comandos que os suportam.
  • Os padrões são lidos a partir de um arquivo .gitignore no mesmo diretório que o caminho ou em qualquer diretório pai, com os padrões nos arquivos de nível superior (até a raiz) sendo substituídos pelos que estão nos arquivos de nível inferior até o diretório que contém o arquivo.
  • Padrões de leitura $GIT_DIR/info/exclude.
  • Os padrões são lidos no arquivo especificado pela variável de configuração core.excludesfile.

Os dois últimos podem ser uma solução para o seu problema, mas:

  • eles não são replicados para um repositório distante
  • eles podem ter seus padrões substituídos por outras fontes

(Veja também esta questão SO )


As outras duas soluções envolvem a atualização do índice ( git update-index):

No entanto, quando você faz check-out em outra ramificação ou quando você git pull, esse status "ignorar" pode ser redefinido. Daí a outra opção:

A diferença entre os dois é explicada em " Git - Diferença entre ' assume-unchanged' e ' skip-worktree' ".

VonC
fonte
Você pode usar update-index --assume-unchanged@see stackoverflow.com/a/25253144/292408
Elijah Lynn
1
@ElijahLynn sure. Você também tem update-index --skip-work-tree. Editei a resposta para adicionar alguns links às respostas antigas que ilustram esses dois update-indexcomandos.
VonC 12/08/14
140

Se você pode modificar, .git/info/excludepode colocar as mesmas regras lá. Mas esse arquivo está apenas no seu repositório local.

Ólafur Waage
fonte
Parece que esta é provavelmente a sua melhor aposta; vamos excluir arquivos do seu repositório local.
Abizern 17/03/09
1
Como isso funciona com submódulos? Não há .gitdiretório em uma submodule ...
zakdances
10
@yourfriendzak a .gitpasta de um sub-módulo está realmente em parent_repo/.git/modules/submodule_name. Então você editariaparent_repo/.git/modules/submodule_name/info/exclude
Kara Brightwell
25

Existem três maneiras de informar ao GIT quais arquivos ignorar:

  • .gitignore arquivos
  • $GIT_DIR/.git/info/exclude
  • Arquivos apontados através da core.excludesfileconfiguração

Os dois últimos pontos podem resolver seu problema.

Para mais informações, consulte gitignore (5) .

Ferdinand Beyer
fonte
5

Se você deseja apenas ter alguns arquivos locais no repositório e o local do subdiretório for flexível, você pode colocar seus arquivos tracked_dir1/tracked_dir2/untracked_dir/e adicionar um tracked_dir1/tracked_dir2/untracked_dir/.gitignoreconteúdo com, como:

*

Ou seja,

$ cat > tracked_dir1/tracked_dir2/untracked_dir/.gitignore
*
<Ctrl+D>
David Winiecki
fonte
4

Eu já estive em situações semelhantes, então estou adicionando minha solução preferida que não vejo mencionada. O problema git update-index --assume-unchangednesse caso é que você não pode fazer isso para um arquivo não rastreado. Você disse

Não consigo modificar o .gitignore do meu repositório.

Eu vou assumir o que você quer dizer é que você não pode enviar nenhuma alteração para .gitignorea origem. Se for esse o caso, o que você pode fazer é adicionar o arquivo não rastreado ao seu local .gitignore, git update-index --assume-unchanged .gitignorepara que sua alteração para .gitignorenunca seja enviada por push. Agora você está ignorando o arquivo (possivelmente) não rastreado e não está afetando o .gitignorearquivo remoto .

Tony
fonte
3

Ignore as alterações locais nos arquivos rastreados: git update-index --assume-unchanged my-file.php

Desconecte as alterações locais nos arquivos rastreados: git update-index --no-assume-unchanged my-file.php

fonte: git help update-index

--[no-]assume-unchanged
           ...
           This option can be also used as a coarse file-level mechanism to ignore uncommitted changes in tracked
           files (akin to what .gitignore does for untracked files). Git will fail (gracefully) in case it needs to
           modify this file in the index e.g. when merging in a commit; thus, in case the assumed-untracked file is
           changed upstream, you will need to handle the situation manually.
Elijah Lynn
fonte
1

Outra maneira:

  • editar local .gitignore
  • então git update-index --assume-unchanged .gitignore
Langpavel
fonte