Ressincronize o repositório git com o novo arquivo .gitignore

191

É possível "atualizar" um repositório git depois de atualizar o arquivo gitignore?

Acabei de adicionar mais ignorâncias (?) Ao meu gitignore e gostaria de remover coisas que já estão no repositório correspondentes ao novo arquivo.

Christian Wattengård
fonte
Poderia ser, essa solução excluiria os arquivos já confirmados correspondentes ao novo gitignore?
Christian Wattengård
99
+1 para inventar a palavra "ignorância".
Aasmund Eldhuset
3
en.wiktionary.org/wiki/ignoration @AasmundEldhuset é oficial
Daniel Springer
1
@ user770: Hoje eu aprendi!
Aasmund Eldhuset

Respostas:

369

A solução mencionada em " O arquivo .gitignore não está ignorando " é um pouco extrema, mas deve funcionar:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( certifique-se de confirmar primeiro as alterações que deseja manter , para evitar qualquer incidente, como os comentários do jball037 abaixo .
A --cachedopção mantém os arquivos intocados no disco.

Você também tem outra solução mais refinada na postagem do blog " Fazendo o Git ignorar arquivos já rastreados ":

git rm --cached `git ls-files -i --exclude-standard`

Bassim sugere em sua edição :

Arquivos com espaço em seus caminhos

Caso você receba uma mensagem de erro como fatal: path spec '...' did not match any files, pode haver arquivos com espaços no caminho.

Você pode remover todos os outros arquivos com a opção --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

mas os arquivos não correspondentes permanecerão no seu repositório e precisarão ser removidos explicitamente, colocando o caminho entre aspas duplas:

git rm --cached "<path.to.remaining.file>"
VonC
fonte
Eu descobri que a etapa git add é desnecessária; quando executo o status git após o git rm --cached, os arquivos removidos já estão na área de teste e você pode simplesmente prosseguir e enviá-los.
chap
3
Acabei de executar isso, perdi todas as minhas alterações não confirmadas e quase anunciei minha demissão do meu trabalho. A resposta aceita sobre este tópico salvou minha vida: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037
2
@VonC desculpe, isso não foi para ser um discurso retórico ou um palito :) Mas sim, eu usei --cached e todas as minhas alterações não confirmadas foram perdidas quando eu verifiquei meus arquivos. Em pânico por um momento, mas "git reset CABEÇA" restaurado meus arquivos (mas desta vez sem os arquivos que eu especificadas no .gitignore, assim que sua solução ainda funcionou!)
jball037
3
@ jball037 Good. Eu adicionei o aviso e editei a resposta de acordo.
VonC 07/07/2015
1
Se eu ler uma linha ainda mais antes de fazer isso "(certifique-se de cometer primeiro as alterações que pretende manter, para evitar qualquer incidente como jball037" #fml
Aiden Strydom
9

Posso entender mal, mas você está tentando excluir arquivos ignorados recentemente ou deseja ignorar novas modificações nesses arquivos? Nesse caso, a coisa está funcionando.

Se você deseja excluir arquivos ignorados confirmados anteriormente, use

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'
gracchus
fonte
O que há com aspas simples aqui?
IgorGanapolsky
Esta é uma grande resposta
Holene
Este é um exemplo muito simples de como remover arquivos após a atualização do meu .gitignore No entanto, ele precisa de algumas atualizações menores: `` git rm –cached git ls-files -i –exclude-standard git commit -m 'clean up' '
Aaron
1

Sei que essa é uma pergunta antiga, mas a solução da gracchus não funciona se os nomes de arquivos contiverem espaços. A solução da VonC para arquivar nomes com espaços é não removê-los utilizando--ignore-unmatch e removê-los manualmente, mas isso não funcionará bem se houver muito.

Aqui está uma solução que utiliza matrizes bash para capturar todos os arquivos.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
Jason
fonte