Eu não acho que um commit do Git possa registrar uma intenção como "pare de rastrear este arquivo, mas não o exclua".
A realização dessa intenção exigirá intervenção fora do Git em quaisquer repositórios que mesclem (ou se refiram a) uma confirmação que exclui o arquivo.
Salvar uma cópia, aplicar exclusão, restaurar
Provavelmente, a coisa mais fácil a fazer é dizer aos usuários downstream para salvar uma cópia do arquivo, retirar sua exclusão e restaurar o arquivo. Se eles estão recebendo via rebase e estão 'carregando' modificações no arquivo, eles terão conflitos. Para resolver esses conflitos, use git rm foo.conf && git rebase --continue
(se a confirmação conflitante tiver alterações além daquelas no arquivo removido) ou git rebase --skip
(se a confirmação conflitante tiver sido alterada apenas no arquivo removido).
Restaurar arquivo como não rastreado após obter uma confirmação que o exclui
Se eles já obtiveram seu commit de exclusão, ainda poderão recuperar a versão anterior do arquivo com o git show :
git show @{1}:foo.conf >foo.conf
Ou com o git checkout (por comentário de William Pursell; lembre-se de removê-lo novamente do índice!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Se eles executaram outras ações desde que você efetuou a exclusão (ou estão recuperando com rebase para um HEAD desanexado), podem precisar de algo diferente @{1}
. Eles poderiam usar git log -g
para encontrar o commit antes de remover sua exclusão.
Em um comentário, você menciona que o arquivo que você deseja “rastrear, mas manter” é algum tipo de arquivo de configuração necessário para executar o software (diretamente de um repositório).
Mantenha o arquivo como 'padrão' e ative-o manualmente / automaticamente
Se não for totalmente inaceitável continuar mantendo o conteúdo do arquivo de configuração no repositório, você poderá renomear o arquivo rastreado de (por exemplo) foo.conf
para foo.conf.default
e instruir seus usuários cp foo.conf.default foo.conf
após aplicar a confirmação de renomeação. Ou, se os usuários já usam alguma parte existente do repositório (por exemplo, um script ou outro programa configurado pelo conteúdo no repositório (por exemplo, Makefile
ou similar)) para iniciar / implantar seu software, você pode incorporar um mecanismo padrão no lançamento / processo de implantação:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Com tal mecanismo inadimplente no lugar, os usuários devem ser capazes de puxar um commit que renomeia foo.conf
a foo.conf.default
sem ter que fazer qualquer trabalho extra. Além disso, você evita copiar manualmente um arquivo de configuração se criar instalações / repositórios adicionais no futuro.
Reescrever o histórico requer intervenção manual de qualquer maneira…
Se é inaceitável manter o conteúdo no repositório, você provavelmente desejará erradicá-lo completamente da história com algo parecido git filter-branch --index-filter …
. Isso equivale a reescrever o histórico, o que exigirá intervenção manual para cada filial / repositório (consulte a seção “Recuperando da recuperação upstream” na página de manual do git rebase ). O tratamento especial necessário para seu arquivo de configuração seria apenas mais uma etapa que você deve executar enquanto se recupera da reescrita:
- Salve uma cópia do arquivo de configuração.
- Recupere da reescrita.
- Restaure o arquivo de configuração.
Ignore-o para impedir a recorrência
Qualquer que seja o método usado, você provavelmente incluirá o nome do arquivo de configuração em um .gitignore
arquivo no repositório para que ninguém possa inadvertidamente git add foo.conf
repetir (é possível, mas requer -f
/ --force
). Se você tiver mais de um arquivo de configuração, considere 'movê-los' todos para um único diretório e ignorar tudo. o mecanismo de inicialização / implantação) para copiar / mover os arquivos para seu novo local; você obviamente não gostaria de colocar um arquivo mv em um diretório que você estará ignorando).