Faça .gitignore ignorar tudo, exceto alguns arquivos

Eu entendo que um arquivo .gitignore esconde arquivos especificados do version control do Git. Eu tenho um projeto (LaTeX) que gera muitos arquivos extras (.auth, .dvi, .pdf, logs, etc) durante a execução, mas não quero que eles sejam rastreados.

Estou ciente de que poderia (talvez devesse) fazer com que todos esses arquivos fossem colocados em uma subpasta separada no projeto, já que eu poderia simplesmente ignorar a pasta.

No entanto, existe alguma maneira possível de manter os arquivos de saída na raiz da tree do projeto e usar o .gitignore para ignorar tudo, exceto os arquivos que estou rastreando com o Git? Algo como

# Ignore everything * # But not these files... script.pl template.latex # etc... 

Um prefixo opcional ! que nega o padrão; qualquer arquivo correspondente excluído por um padrão anterior será incluído novamente. Se um padrão negado corresponder, isso replaceá as origens de padrões de precedência mais baixos.

 # Ignore everything * # But not these files... !.gitignore !script.pl !template.latex # etc... # ...even if they are in subdirectories !*/ # if the files to be tracked are in subdirectories !*/a/b/file1.txt !*/a/b/c/* 

Se você quiser ignorar todo o conteúdo de um diretório, exceto um arquivo dentro dele, você pode escrever um par de regras para cada diretório no caminho do arquivo. Por exemplo, gitignore para ignorar a pasta do pippo, exceto do pippo / pluto / paperino.xml

.gitignore

 pippo/* !pippo/pluto pippo/pluto/* !pippo/pluto/paperino.xml 

Você deseja usar /* vez de * ou */ na maioria dos casos

Usar * é válido, mas funciona recursivamente. Não vai olhar para diretórios a partir de então. As pessoas recomendam o uso de !*/ Para os diretórios da lista de desbloqueio novamente, mas, na verdade, é melhor listar a pasta de nível mais alto com /*

 # Blacklist files/folders in same directory as the .gitignore file /* # Whitelist some files !.gitignore !README.md # Ignore all files named .DS_Store or ending with .log **/.DS_Store **.log # Whitelist folder/a/b1/ and folder/a/b2/ # trailing "/" is optional for folders, may match file though. # "/" is NOT optional when followed by a * !folder/ folder/* !folder/a/ folder/a/* !folder/a/b1/ !folder/a/b2/ 

O código acima ignoraria todos os arquivos, exceto .gitignore , README.md , folder/a/b1/ e folder/a/b2/ e todos os contidos nessas duas pastas. (E .DS_Store e *.log seriam ignorados nessas pastas.)

Obviamente eu poderia fazer eg !/folder ou !/.gitignore também.

Mais informações: http://git-scm.com/docs/gitignore

Um pouco mais específico:

Exemplo: Ignore tudo em webroot/cache – mas mantenha webroot/cache/.htaccess .

Observe a barra (/) após a pasta de cache :

FALHA

 webroot/cache* !webroot/cache/.htaccess 

TRABALHO

 webroot/cache/* !webroot/cache/.htaccess 
 # ignore these * # except foo !foo 

Para ignorar alguns arquivos em um diretório, você precisa fazer isso na ordem correta :

Por exemplo, ignore tudo na pasta “application” exceto index.php e a pasta “config” preste atenção ao pedido .

Você deve negar que você quer primeiro.

FALHA

application/*

!application/config/*

!application/index.php

TRABALHO

!application/config/*

!application/index.php

application/*

Você pode usar o git config status.showUntrackedFiles no e todos os arquivos git config status.showUntrackedFiles no rastreados ficarão ocultos de você. Veja man git-config para detalhes.

Para excluir pasta de .gitignore, o seguinte pode ser feito.

 !app/ app/* !app/bower_components/ app/bower_components/* !app/bower_components/highcharts/ 

Isso irá ignorar todos os arquivos / subpastas dentro de bower_components exceto para /highcharts .

Há um monte de perguntas semelhantes sobre isso, então vou postar o que escrevi antes:

A única maneira de fazer isso funcionar na minha máquina era fazer assim:

 # Ignore all directories, and all sub-directories, and it's contents: */* #Now ignore all files in the current directory #(This fails to ignore files without a ".", for example #'file.txt' works, but #'file' doesn't): *.* #Only Include these specific directories and subdirectories and files if you wish: !wordpress/somefile.jpg !wordpress/ !wordpress/*/ !wordpress/*/wp-content/ !wordpress/*/wp-content/themes/ !wordpress/*/wp-content/themes/* !wordpress/*/wp-content/themes/*/* !wordpress/*/wp-content/themes/*/*/* !wordpress/*/wp-content/themes/*/*/*/* !wordpress/*/wp-content/themes/*/*/*/*/* 

Observe como você precisa permitir explicitamente conteúdo para cada nível que deseja include. Então, se eu tiver subdiretórios com 5 temas profundos, ainda preciso soletrar isso.

Este é o comentário do @ Yarin aqui: https://stackoverflow.com/a/5250314/1696153

Estes foram tópicos úteis:

  • Como os padrões negados funcionam no .gitignore?
  • Como as regras de exclusão de gitignore realmente funcionam?

Eu também tentei

 * */* **/** 

e **/wp-content/themes/**

ou /wp-content/themes/**/*

Nada disso funcionou para mim também. Muita trilha e erro!

Isso é o que funcionou para mim, eu queria enviar apenas um plugin do Cordova para o repository:

 ... plugins/* !plugins/cordova-plugin-app-customization 

Eu tenho Jquery e Angular de bower. Bower instalou-os em

 /public_html/bower_components/jquery/dist/bunch-of-jquery-files /public_html/bower_components/jquery/src/bunch-of-jquery-source-files /public_html/bower_components/angular/angular-files 

O jquery minimizado está dentro do diretório dist e o angular está dentro angular diretório angular . Eu só precisava de arquivos minimizados para serem enviados para o github. Alguns adulterando .gitignore e isso é o que eu consegui conjurar …

 /public_html/bower_components/jquery/* !public_html/bower_components/jquery/dist /public_html/bower_components/jquery/dist/* !public_html/bower_components/jquery/dist/jquery.min.js /public_html/bower_components/angular/* !public_html/bower_components/angular/angular.min.js 

Espero que alguém possa achar isso útil.

Eu tive um problema com subpasta.

Não funciona:

 /custom/* !/custom/config/foo.yml.dist 

Trabalho:

 /custom/config/* !/custom/config/foo.yml.dist 

Nada funcionou para mim até agora porque eu estava tentando adicionar um jar do lib.

Isso não funcionou:

 build/* !build/libs/* !build/libs/ !build/libs/myjarfile.jar 

Isso funcionou:

 build/* !build/libs 

Solução simples se você precisar ignorar tudo, exceto alguns arquivos e algumas pastas raiz :

 /* !.gitignore !showMe.txt !my_visible_dir 

A mágica está em /* (como descrito acima) ignora tudo na pasta mas não recursivamente.

Eu também tive alguns problemas com a negação de arquivos únicos. Eu era capaz de cometê-los, mas meu IDE (IntelliJ) sempre reclamou de arquivos ignorados, que são rastreados.

 git ls-files -i --exclude-from .gitignore 

Exibiu os dois arquivos, que eu excluí dessa maneira:

 public/ !public/typo3conf/LocalConfiguration.php !public/typo3conf/PackageStates.php 

No final, isso funcionou para mim:

 public/* !public/typo3conf/ public/typo3conf/* !public/typo3conf/LocalConfiguration.php !public/typo3conf/PackageStates.php 

A chave foi a negação da pasta typo3conf/ first.

Além disso, parece que a ordem das declarações não importa . Em vez disso, você precisa explicitamente negar todas as subpastas, antes de poder negar arquivos únicos nela.

A pasta !public/typo3conf/ e o conteúdo da pasta public/typo3conf/* são duas coisas diferentes para .gitignore.

Ótimo tópico! Essa questão me incomodou por um tempo;)