Aplicando .gitignore aos arquivos confirmados

436

Confirmei muitos arquivos que agora quero ignorar. Como posso dizer ao git para agora ignorar esses arquivos de confirmações futuras?

EDIT: Eu também quero removê-los do repositório. São arquivos criados após a compilação ou para suporte a ferramentas específicas do usuário.

user880954
fonte
1
possível duplicata de arquivo .gitignore não ignorando
Wooble
8
@Wooble A resposta pode ser semelhante, mas esta pergunta descreve exatamente o problema que eu enfrentei e precisava resolver.
Rjmunro
1
Esta é a resposta que aborda directamente à pergunta do título, com alterações mínimas para o seu repositório git: stackoverflow.com/a/26245961/3543437
kayleeFrye_onDeck

Respostas:

471
  1. Edite .gitignorepara corresponder ao arquivo que você deseja ignorar
  2. git rm --cached /path/to/file

Veja também:

Matt Ball
fonte
12
Porém, existem muitos arquivos. Eu não quero ter fazer isso para cada um único
user880954
1
Os arquivos estão em algum diretório comum? Caso contrário, o problema será reduzido a uma questão de uso do shell, não a um git.
Matt Ball
12
É necessário que exista um modo 'eu esqueci de adicionar meu .gitignore até depois do meu commit inicial'.
Luke Puplett
9
A resposta está abaixo desta.
1/15
3
Ele me pediu para adicionar o sinalizador -r para poder fazê-lo.
Vishal Gulati
599

Depois de editar .gitignorepara corresponder aos arquivos ignorados, você pode fazer git ls-files -ci --exclude-standardpara ver os arquivos incluídos nas listas de exclusão; você pode então fazer

//On Linux:
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached
//On Windows:
for /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
//On mac
alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached"

para removê-los do repositório (sem excluí-los do disco).

Editar : Você também pode adicionar isso como um alias no seu arquivo .gitconfig para poder executá-lo quando quiser. Basta adicionar a seguinte linha na seção [alias] (modifique conforme necessário para Windows ou Mac):

apply-gitignore = !git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached

(A -rflag in xargsimpede a git rmexecução de um resultado vazio e a impressão de sua mensagem de uso, mas pode ser suportada apenas pelo GNU findutils. Outras versões xargspodem ou não ter uma opção semelhante.)

Agora você pode digitar git apply-gitignoreseu repositório e ele fará o trabalho para você!

Jonathan Callen
fonte
10
Eu acho que o xargs para mac não tem -r ... ou o meu é buggy / antigo, não sei ... e por que o !git anterior? bem ... o meu funcionou como alias apply-gitignore="git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached". tks!
Felipe Sabino
18
No Windowsfor /F "tokens=*" %a in ('git ls-files -ci --exclude-standard') do @git rm --cached "%a"
Luke Puplett
Isso acabou de remover meus arquivos .gitignore, não os arquivos que eu queria ignorar que estavam listados nos arquivos .gitignore - era esse o ponto?
precisa saber é o seguinte
@ Hippyjim se os arquivos já estiverem confirmados (mesmo que tenham sido listados em .gitignore) e .gitignore ainda não esteja confirmado, esse seria o resultado esperado; caso contrário, não tenho certeza do que está acontecendo no seu caso.
Jonathan Callen
1
Para usuários de mac, -ré padrão e não é aceito pelas versões do BSD. Então remova -r.
Weishi Zeng
136

para deixar o arquivo no repositório, mas ignore futuras alterações nele:

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

e desfazer isso:

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

para descobrir quais arquivos foram configurados dessa maneira:

git ls-files -v|grep '^h'

crédito pela resposta original a http://blog.pagebakers.nl/2009/01/29/git-ignoring-changes-in-tracked-files/

ben.tiberius.avery
fonte
1
Chronial tem uma grande resposta para fazer isso de forma recursiva para um diretório: stackoverflow.com/a/16346756/1101076
jordan314
Eu queria confirmar uma configuração IDE, mas não acompanhar alterações desnecessárias. Isso funciona, embora não tenha certeza se funcionará para outras pessoas que fazem check-out no repositório. Pode ser combinado com git ls-files -ci --exclude-standard -z | xargs -0 git update-index --assume-unchangedse isso ajudar.
Dlamblin
7
Esta é a única resposta que faz exatamente o que a pergunta do título pede. PERFEITO! A maioria dessas outras respostas estava mexendo com arquivos desnecessariamente.
kayleeFrye_onDeck
1
Esta é a resposta exata para a pergunta. Usar comandos como git rm --cachedirá remover o arquivo no repositório, o que não atende à necessidade do quizzer. Obrigado. Eu realmente gostei disso. Sua resposta me ajuda muito.
ramwin 14/04
88

Certifique-se de que seu repo real seja a versão mais recente

  1. Edite .gitignorecomo desejar
  2. git rm -r --cached .
  3. git add .

depois cometa como de costume

Théo Attali
fonte
14
Essa deve ser a resposta aceita, pois a pergunta dizia especificamente que havia muitos arquivos a serem removidos.
N181 de
3
Observe que a etapa 2 pode demorar um pouco se você tiver um grande repositório.
brainbag
Isso apenas levou à remoção de todos os arquivos do índice! Isso me salvou: git reset HEAD(Lembre-se de guardar as alterações)
aksh1618
2
A etapa 2 remove tudo, sim, mas a etapa 3 deve ler todos eles, exceto os que falharem devido ao .gitignore.
ojchase
11

Pergunta antiga, mas alguns de nós estão dentro git-posh(PowerShell). Esta é a solução para isso:

git ls-files -ci --exclude-standard | foreach { git rm --cached $_ }
Chris Pfohl
fonte
0

Siga esses passos:

  1. Adicionar caminho ao gitignorearquivo

  2. Execute este comando

    git rm -r --cached foldername
    
  3. confirmar as alterações normalmente.

Kalyan Chakravarthi V
fonte