Digamos que eu ignorei um diretório, mas desejo cancelar a ignorar subdiretórios específicos nele. Então, eu tenho a configuração:
/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/
E eu quero ignorar tudo, exceto o KEEP_ME
diretório. Eu espero que o ignorar seja algo como:
/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/
Mas isso não está funcionando, e nem várias permutações no mesmo tema.
Aquele que funciona é
/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/
Mas isso parece um pouco restritivo e prolixo?
Respostas:
De acordo com a seção de formato de padrão da documentação do gitignore :
Portanto, o
/uploads/rubbish/stuff/keep/
padrão do diretório pai excluído anteriormente deve ser negado exclusivamente antes de negar seu conteúdo:Para incluir subdiretórios dentro,
/uploads/rubbish/stuff/keep/
adicione a terceira linha:fonte
.gitignore
e funciona muito bem !:!*.zip
Mesmo se você adicionar algo
.gitignore
, você pode forçar o git a adicioná-lo ao índiceNo entanto, "KEEP_ME" parece ser um diretório e o git geralmente não gosta de pastas vazias, então você deve adicionar um arquivo de "espaço reservado", se a pasta estiver vazia
fonte
git add --force
para cada novo item ou pasta emKEEP_ME
. mas depois disso, as atualizações são adicionadas (ao fazer um,git add -u
por exemplo) como se os arquivos estivessem 'não ignorados'. O.keep_me
não faz nada, é apenas um arquivo para que o git opere na pasta.git add --force
é a solução errada para isso. Se você mover um diretório ou mover o arquivo para outro diretório, o rastreamento do git excluirá o arquivo, mas não o adicionará ao novo local e você terá que fazergit add --force
novamente. ao cancelar a ignição em um padrão genérico, o git rastreará o movimento de um arquivo dentro do repo.Estava tentando descobrir como incluir uma pasta específica ao excluir todas as pastas com a exclusão genérica
se você adicionar o
/*
ao final de sua exclusão genérica, você continuará a excluir todos os arquivos de construção**/build/*
Então você adiciona outra linha para corrigir a aparência do caminho que deseja incluir
deixando-nos um gitignore que lê
fonte
As respostas de Buo-Ren Lin e John são bastante úteis, mas eu precisava combinar as duas.
Ao querer excluir outras subpastas, bem como arquivos dentro de uploads, achei necessário especificar explicitamente diretórios arbitrários antes da pasta fornecida , excluindo a pasta e incluindo a subpasta
Também achei necessário reincluir explicitamente a subpasta e seu conteúdo para mostrar os itens dentro da pasta e das subpastas.
fonte
A solução apresentada como a resposta mais votada é incorreta e facilmente demonstrável como tal.
Comece ignorando tudo nos uploads / *:
Agora cancele a ignorar o diretório pai das coisas ignoradas como acima:
Não mostra arquivos não rastreados.
Para fazê-lo funcionar, você precisa ignorar todos os arquivos sob a
uploads/
árvore (uploads/**/*
não apenas o nível superioruploads/*
) e, em seguida, adicionar todos os diretórios pais da árvore que deseja manterQue dá:
Se tivéssemos usado
uploads/*
na.gitignore
acima, em seguida, todos os arquivos intermediários teria sido incluído, bem como, assim, por exemplouploads/rubbish/a
iria aparecer no comando status acima.fonte