Ignorar arquivos que já foram confirmados em um repository Git

Eu tenho um repository Git já inicializado que eu adicionei um arquivo .gitignore para. Como posso atualizar o índice do arquivo para que os arquivos que eu quero ignorar sejam ignorados?

Para não rastrear um único arquivo que já tenha sido adicionado / inicializado ao seu repository, ou seja , pare de rastrear o arquivo, mas não o exclua do sistema: git rm --cached filename

Para desabilitar todos os arquivos que estão no seu .gitignore :

Primeiro, confirme as alterações de código pendentes e, em seguida, execute este comando:

 git rm -r --cached . 

Isso remove todos os arquivos alterados do índice (área de preparação) e, em seguida, apenas executa:

 git add . 

Confirme:

 git commit -m ".gitignore is now working" 

Para desfazer git rm --cached filename , use git add filename .

Certifique-se de confirmar todas as suas alterações importantes antes de executar o git add . Caso contrário, você perderá as alterações em outros arquivos.

Se você está tentando ignorar as alterações em um arquivo que já foi rastreado no repository (por exemplo, um arquivo dev.properties que você precisaria alterar para seu ambiente local, mas nunca desejaria verificar essas alterações) do que deseja fazer é:

 git update-index --assume-unchanged  

Se você quer começar a rastrear as alterações novamente

 git update-index --no-assume-unchanged  

Veja git-update-index (1) Manual .

Também dê uma olhada nas opções skip-worktree e no-skip-worktree para update-index, se você precisar disso para persistir após um git-reset ( via )


Atualização: Como as pessoas têm perguntado, aqui está um alias conveniente (e atualizado desde que comentado abaixo) para ver quais arquivos são atualmente “ignorados” (–assum -mautomático) em sua área de trabalho local

 $ git config --global alias.ignored = !git ls-files -v | grep "^[[:lower:]]" 

Para cancelar o rastreamento de um arquivo que já tenha sido adicionado / inicializado ao seu repository, ou seja, pare de rastrear o arquivo, mas não o exclua do sistema: git rm --cached filename

Sim – o sistema .gitignore apenas ignora os arquivos que não estão atualmente sob o version control do git.

Ou seja, se você já adicionou um arquivo chamado test.txt usando o git-add , então adicionar test.txt ao .gitignore ainda fará com que as alterações no test.txt sejam rastreadas.

Você teria que git rm test.txt primeiro e confirmar essa mudança. Só então as alterações no test.txt serão ignoradas.

Remova o espaço em branco à direita em .gitignore

Além disso, certifique-se de não ter espaços em branco no seu .gitignore. Eu cheguei a esta pergunta porque eu estava procurando por uma resposta, então eu tive uma sensação engraçada de que eu deveria abrir o editor em vez de apenas cat’ing .gitignore. Removido um único espaço extra do final e poof funciona agora 🙂

Eu segui estes passos

 git rm -r --cached . git add . git reset HEAD 

depois disso, git delete todos os arquivos (* .swp no meu caso) que deveriam estar ignorando.

Se você quiser parar o arquivo de rastreamento sem excluir o arquivo do seu sistema local, o que eu prefiro ignorar o config/database.yml . Simplesmente tente:

 git rm --cached config/database.yml # this will delete your file from git history but not from your local system. 

Agora, adicione este arquivo ao arquivo .gitignore e confirme as alterações. E a partir de agora, qualquer mudança feita no config / database.yml não será rastreada pelo git.

 $ echo config/database.yml >> .gitignore 

obrigado

Para remover apenas alguns arquivos específicos de serem rastreados:

 git update-index --assume-unchanged path/to/file 

Se alguma vez você quiser começar a rastreá-lo novamente:

 git update-index --no-assume-unchanged path/to/file 

Como diz o dav_i, para manter o arquivo no repository e removê-lo das mudanças sem criar um commit extra, você pode usar:

 git update-index --assume-unchanged filename 

Não sabendo bem o que o comando de ‘resposta’ fez, eu corri para o meu desânimo. Ele recursivamente remove todos os arquivos do seu repository git.

Stackoverflow para o resgate … Como reverter um “git rm -r.”

 git reset HEAD 

Fiz o truque, já que eu não tinha comprometido arquivos locais que eu não queria sobrescrever.

Respostas complexas em todos os lugares!

Apenas use o seguinte

 git rm -r --cached . 

Ele removerá os arquivos que você está tentando ignorar da origem e não do mestre em seu computador!

Depois disso, basta cometer e empurrar!

Há outra sugestão talvez para os caras lentos como eu =) Coloque o arquivo .gitignore em sua raiz do repository não na pasta .git . Felicidades!

Nenhuma das respostas funcionou para mim.

Em vez de:

  1. Mova o arquivo para fora do diretório controlado pelo git
  2. Verifique a remoção no git
  3. Mova o arquivo de volta para o diretório controlado pelo git

Depois de mover o arquivo de volta, o git irá ignorá-lo.

Trabalha com diretórios também!

Outro problema que tive foi colocar um comentário inline.

 tmp/* # ignore my tmp folder (this doesn't work) 

isso funciona

 # ignore my tmp folder tmp/ 

Se os arquivos já estiverem no version control, você precisará removê-los manualmente.

Graças à sua resposta, pude escrever este pequeno liner para melhorá-lo. Eu corri no meu .gitignore e repo, e não tive problemas, mas se alguém vê algum problema gritante, por favor, comente. Isso deve git rm -r --cached de .gitignore :

cat $ (git rev-parse – mostrar-toplevel) / .gitIgnore | sed “s // $ //” | grep -v “^ #” | xargs -L 1 -I {} encontrar $ (git rev-parse – mostrar-toplevel) -nome “{}” | xargs -L 1 git rm -r –cached

Observe que você obterá muitas fatal: pathspec '' did not match any files . Isso é apenas para os arquivos que não foram modificados.

Eu encontrei um problema estranho com .gitignore. Tudo estava no lugar e parecia correto. A única razão pela qual o meu .gitignore era “ignorado” era que o fim da linha estava no Mac-Format (\ r). Então, depois de salvar o arquivo com a terminação de linha correta (no vi usando: set ff = unix) tudo funcionou como um encanto!

Um outro problema não mencionado aqui é que, se você criou o seu .gitignore no bloco de notas do Windows, pode parecer algo sem sentido em outras plataformas, como descobri. A chave é ter certeza de que a codificação está definida como ANSI no bloco de notas (ou faça o arquivo no linux como eu fiz).

Da minha resposta aqui: https://stackoverflow.com/a/11451916/406592

No meu servidor linux server (não é verdade no meu dev local mac), os diretórios são ignorados, desde que eu não adicione um asterisco:

www / archives / *

Eu não sei porque, mas isso me fez perder algumas horas, então eu queria compartilhar …

Uma coisa é também ter em mente se o .gitignore não parece estar ignorando arquivos não .gitignore é que você não deve ter comentários na mesma linha que os ignorados. Então está tudo bem

 # ignore all foo.txt, foo.markdown, foo.dat, etc. foo* 

Mas isso não vai funcionar:

 foo* # ignore all foo.txt, foo.markdown, foo.dat, etc. 

.gitignore interpreta o último caso como “ignorar arquivos chamados "foo* # ignore all foo.txt, foo.markdown, foo.dat, etc." , o que, obviamente, você não possui.

Se você precisar parar de rastrear muitos arquivos ignorados, poderá combinar alguns comandos:

git ls-files -i --exclude-standard | xargs -L1 git rm --cached

Isso pararia de rastrear os arquivos ignorados. Se você quiser realmente remover arquivos do sistema de arquivos, não use a opção --cached . Você também pode especificar uma pasta para limitar a pesquisa, como:

git ls-files -i --exclude-standard -- ${FOLDER} | xargs -L1 git rm