Claro, eu faço exatamente isso de tempos em tempos usando
git update-index --assume-unchanged [<file> ...]
Para desfazer e começar a rastrear novamente (se você esqueceu quais arquivos não foram rastreados, consulte esta pergunta ):
git update-index --no-assume-unchanged [<file> ...]
Documentação relevante :
- [no-] assume-inalterado
Quando esse sinalizador é especificado, os nomes de objetos registrados para os caminhos não são atualizados. Em vez disso, esta opção define / desativa o bit "assumir inalterado" para os caminhos. Quando o bit "assumir inalterado" está ativado, o usuário promete não alterar o arquivo e permite ao Git assumir que o arquivo da árvore de trabalho corresponde ao que está registrado no índice. Se você deseja alterar o arquivo da árvore de trabalho, desative o bit para informar ao Git. Às vezes, isso é útil ao trabalhar com um grande projeto em um sistema de arquivos que possui uma lstat(2)
chamada de sistema muito lenta (por exemplo, cifs).
O Git falhará (normalmente) caso precise modificar esse arquivo no índice, por exemplo, ao mesclar em um commit; portanto, caso o arquivo assumido não rastreado seja alterado a montante, você precisará lidar com a situação manualmente.
Falhar normalmente neste caso significa que, se houver alguma alteração a montante desse arquivo (alterações legítimas etc.) quando você fizer um pull, ele dirá:
$ git pull
…
From https://github.com/x/y
72a914a..106a261 master -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
filename.ext
e se recusará a mesclar.
Nesse ponto, você pode superar isso revertendo suas alterações locais, eis uma maneira:
$ git checkout filename.ext
em seguida, puxe novamente e modifique novamente o arquivo local ou pode definir –no-assume-unchanged
e você pode fazer stash e mesclagem normais, etc.