Como ignorar arquivos temporariamente no git

#dev, #git

tl;dr

Ignorar:

$ git update-index --assume-unchanged file

Voltar a trackear:

$ git update-index --no-assume-unchanged file

Uma certa vez eu tinha acabado de entrar para um time, infelizmente, para mim, eles versionavam o config/database.yml. Eu como o único usuário de docker e docker-compose, precisava mudá-lo. Como eu havia acabado de conhecer as pessoas não sabia as melhores formas de abordar boas práticas como essa. Então ao invés de tentar salvar o mundo 😂 eu simplesmente editei o arquivo e mantive ele ignorado no git (nada foi enviado para o repositório).

Mão na massa!

O jeito de ignorar o arquivo temporariametne no git é usando o update-index tal qual:

$ git update-index --assume-unchanged file

No meu caso:

$ git update-index --assume-unchanged config/database.hml

Voltar a trackear o arquivo

Para reverter o seu ignore 🤔, i. e., para voltar a trackear as mudanças usando git:

$ git update-index --no-assume-unchanged file

Mais uma vez, no meu caso:

$ git update-index --no-assume-unchanged config/database.hml

Notas

  • Fazer um checkout no arquivo (git checkout file) faz com que as mudanças sejam desfeitas. Mas não vai reverter o --assume-unchanged.
  • Se você mudar de branch com o git checkout branch o arquivo vai permanecer não versionado.
  • git stash save ou git stash pop não tem efeito no arquivo.

Exemplo

Veja um exemplo bastante simples:

$ mkdir /tmp/untouch
$ cd /tmp/untouch
$ pwd > README.md
$ git init
Initialized empty Git repository in /tmp/untouch/.git/
$ git add README.md
$ git commit -m "Add README.md"
[master (root-commit) 0168380] Add README.md
 1 file changed, 1 insertion(+)
 create mode 100644 README.md
$ git status
On branch master
nothing to commit, working tree clean
$ pwd >> README.md
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
$ git update-index --assume-unchanged README.md
$ git status
On branch master
nothing to commit, working tree clean
$ cat README.md
/tmp/untouch
/tmp/untouch
$ git checkout -b new-branch
Switched to a new branch 'new-branch'
$ git status
On branch new-branch
nothing to commit, working tree clean
$ cat README.md
/tmp/untouch
/tmp/untouch
$ git update-index --no-assume-unchanged README.md
$ git status
On branch new-branch
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   README.md

no changes added to commit (use "git add" and/or "git commit -a")
$ cat README.md
/tmp/untouch
/tmp/untouch

Referências