Forçar adição apesar do arquivo .gitignore

413

Existe uma maneira de forçar gita adição de um arquivo, apesar do .gitignorearquivo?

Marca
fonte
4
Uma pergunta melhor pode ser - por que você quer fazer isso? Se você deseja que um arquivo seja rastreado, não o ignore (prefixe seu padrão no .gitignorearquivo com !, por exemplo !dont/ignore/this/file).
Oade Schneider
6
@OhadSchneider Isso é útil se você forçar o envio de arquivos de construção para outro ramo. Alguns projetos fazem isso, como o StrongLoop, para implantações seguras
Deminetix
5
@OhadSchneider Para nós, é mais porque a maioria dos desenvolvedores instala o git com o Visual Studio 2015, que adiciona um gitignore global à pasta do usuário. Isso exclui arquivos como * .dll e * .exe. Isso é ótimo para nossos novos projetos, que usam apenas pacotes de nuget recuperados durante a compilação, mas para um pequeno número de projetos mais antigos, ainda usamos dlls que são referenciadas manualmente na solução. Para esses projetos, gostaríamos de incluí-los manualmente, em vez de dizer a todos os desenvolvedores para comentar os arquivos * .dll e * .exe no gitignore global.
Nullius
4
@ Nullius Você não pode simplesmente ignorá-los em um nível superior .gitignore(por exemplo, adicione um .gitignorena mesma pasta que a dll, ou acima, ou algo assim)?
Oade Schneider

Respostas:

569

Veja man git-add:

   -f, --force
       Allow adding otherwise ignored files.

Então corra isso

git add --force my/ignore/file.foo
Daniel Böhmer
fonte
11
Uhm que não funciona, sobre o estado git o arquivo ainda não é mostrado
Mark
5
Bem, eu testei para garantir que realmente funcione e funcione. Você pode descrever seu ambiente (SO, versão git ...)? Isto é o que eu basicamente fiz: echo "/foo" >> .gitignore; echo "bar" > foo; git add foo # should throw an error; git add -p foo # works(não é possível colar novas linhas no comentário, execute os comandos 1 por 1
Daniel Böhmer
4
O mesmo aconteceu comigo: eu já havia executado o git update-index - como sempre inalterado nos meus arquivos. Eu tive que desfazê-lo com --no-assumir-inalterada e funcionou
Jako
4
Isso só funciona para mim usando curingas, usando o git 1.9.5 no Windows, mesmo depois de tentar --no - assume-inalterado. "git add - f <nome do arquivo>" não faz nada, mas "git add -f *" funciona. Usar o TortoiseGit também funciona.
mhenry1384
@ mhenry1384 O motivo pelo qual ele funciona apenas com curinga no Windows pode ser devido à maneira como o separador de caminho é usado. Para mim, a barra "/" funciona, mas a barra invertida "\" não. O fato de o cmd / PowerShell converter "/" em "\" para nós facilita a execução.
OHW
19

Apesar da solução de trabalho de Daniel Böhmer, Ohad Schneider ofereceu uma solução melhor em um comentário:

Se o arquivo geralmente é ignorado e você o força a adicioná-lo - ele pode ser ignorado acidentalmente novamente no futuro (como quando o arquivo é excluído, uma confirmação é feita e o arquivo é recriado.

Você deve simplesmente ignorá-lo no arquivo .gitignore, assim: Designore subdiretórios de diretórios ignorados no Git

COMO
fonte
4
Isto está correto. Eu estava usando a opção --force para pequenos arquivos de dados e, em seguida, reorganizei um pouco a estrutura de pastas e derrubei todos os arquivos rastreados à força. NO ENTANTO: em .gitignoreuso !specific-file-name.txtsem a hierarquia de pastas, esse rastreamento seguirá o arquivo em torno do repositório.
Merlin
Depende do cenário, por exemplo, em algum momento você deseja excluir "1.txt" em todas as pastas e em algum momento "folder1 / * .txt"
AS
14
Essa não é uma solução "melhor". É uma solução para um problema diferente.
aij
2

Outra maneira de conseguir isso seria editar temporariamente o arquivo gitignore, adicionar o arquivo e depois reverter o gitignore. Um pouco hacky eu sinto

shardy
fonte
10
Eu concordo, não é isso que você quer fazer.
Merlin