Tenho um projecto de Visual Studio existente no meu repositório. Adicionei recentemente um ficheiro .gitignore sob o meu projecto e presumo que isso diz a Git para ignorar os ficheiros listados no ficheiro.
O meu problema é que todos esses ficheiros já estão a ser rastreados e tanto quanto sei Git não ignorará um ficheiro que já foi rastreado antes de uma regra ter sido adicionada a este ficheiro para o ignorar.
Foi sugerida a sua utilização: "git rm --cached" e desmarcá-los manualmente, mas isso'vai levar-me uma eternidade a passar por eles um a um.
Pensei em apagar o repositório e recriá-lo novamente, mas desta vez com o ficheiro .gitignore presente, mas deve haver uma forma melhor de o fazer.
Esta resposta resolveu o meu problema:
Antes de mais, comprometer todas as alterações pendentes.
Depois execute este comando:
git rm -r --cached .
Isto retira tudo do índice, depois é só correr:
git add .
Comprometa-o:
git commit -m ".gitignore is now working"
Como especificado aqui É possível actualizar o índice:
git update-index --assume-unchanged /path/to/file
Ao fazer isto, os ficheiros não aparecerão em "estado de graça" ou "estado de diferença".
Para recomeçar a seguir os ficheiros, pode correr:
git update-index --no-assume-unchanged /path/to/file
Aqui está uma forma de "desmarcar" quaisquer ficheiros que de outra forma seriam ignorados sob o actual conjunto de padrões de exclusão:
(GIT_INDEX_FILE=some-non-existent-file \
git ls-files --exclude-standard --others --directory --ignored -z) |
xargs -0 git rm --cached -r --ignore-unmatch --
Isto deixa os ficheiros no seu directório de trabalho, mas retira-os do índice.
O truque aqui utilizado é fornecer um ficheiro de índice inexistente para os ficheiros de localização de modo a que se pense que não existem ficheiros rastreados. O código de shell acima pede todos os ficheiros que seriam ignorados se o índice estivesse vazio e depois retira-os do índice real com git rm.
Após os ficheiros terem sido "desmarcados", usar o estado do git para verificar que nada importante foi removido (se assim for, ajuste os seus padrões de exclusão e use o git reset -- caminho para restaurar a entrada do índice removido). Depois faça um novo compromisso que deixe de fora o "crud".
O "crud" ainda estará em qualquer compromisso antigo. Pode usar o git filter-branch para produzir versões limpas dos commits antigos se realmente precisar de um histórico limpo (n.b. usar o git filter-branch irá "reescrever o histórico", por isso não deve ser feito de ânimo leve se tiver algum colaborador que tenha puxado algum dos seus commits históricos após o "crud" ter sido introduzido pela primeira vez).