Eu tenho a pasta application/
que adiciono ao .gitignore
. Dentro da application/
pasta está a pasta application/language/gr
. Como posso incluir esta pasta?
Eu tentei isso
application/
!application/language/gr/
sem sorte ...
Eu tenho a pasta application/
que adiciono ao .gitignore
. Dentro da application/
pasta está a pasta application/language/gr
. Como posso incluir esta pasta?
Eu tentei isso
application/
!application/language/gr/
sem sorte ...
Respostas:
Se você excluir application/
, tudo o que estiver abaixo será sempre excluído (mesmo que algum padrão de exclusão negativa posterior (“não-reconhecido”) possa corresponder a algo abaixo application/
).
Para fazer o que você deseja, é necessário "cancelar a assinatura" de todos os diretórios pai de tudo o que você deseja "cancelar a autenticação". Geralmente, você acaba escrevendo regras para essa situação em pares: ignora tudo em um diretório, mas não em um determinado subdiretório.
# you can skip this first one if it is not already excluded by prior patterns
!application/
application/*
!application/language/
application/language/*
!application/language/gr/
Nota
O final /*
é significativo:
dir/
exclui um diretório chamado dir
e (implicitamente) tudo sob ele. dir/
, o Git nunca examinará nada abaixo dir
e, portanto, nunca aplicará nenhum dos padrões de "exclusão" a nada abaixo dir
.dir/*
não diz nada sobre dir
si; apenas exclui tudo que está abaixo dir
. Com dir/*
, o Git processará o conteúdo direto dir
, dando a outros padrões a chance de "excluir" um pouco do conteúdo ( !dir/sub/
)./*
é significativa. Se um diretório for excluído, o Git nunca examinará o conteúdo desse diretório. O padrão dir/
exclui um diretório chamado dir
e (implicitamente) tudo sob ele. O padrão dir/*
não diz nada sobre dir
si; apenas exclui tudo que está abaixo dir
. Com dir/
, o Git nunca examinará nada abaixo dir
e, portanto, nunca aplicará nenhum dos padrões de "exclusão" a nada abaixo dir
. Com dir/*
, o Git processará o conteúdo direto dir
, dando a outros padrões a chance de "excluir" um pouco do conteúdo ( !dir/sub/
).
git add -f .
git status
, o que dirá apenas que o diretório de nível superior será adicionado. Em vez disso, faça um git add
diretório do nível superior e, em seguida git status
, (esperançosamente) listará o subconjunto de arquivos que foram correspondidos pelo padrão.
O compromisso 59856de de Karsten Blees (kblees) para o Git 1.9 / 2.0 (primeiro trimestre de 2014) esclarece esse caso:
gitignore.txt
: esclarecer a natureza recursiva dos diretórios excluídosUm prefixo opcional "
!
" que nega o padrão; qualquer arquivo correspondente excluído por um padrão anterior será incluído novamente.Não é possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído. (
*
)
(*
: a menos que determinadas condições sejam atendidas no git 2.8+, veja abaixo) O
Git não lista os diretórios excluídos por motivos de desempenho; portanto, quaisquer padrões nos arquivos contidos não têm efeito, independentemente de onde estejam definidos.Coloque uma barra invertida ("
\
") na frente do primeiro "!
" para padrões que começam com um literal "!
", por exemplo, "\!important!.txt
".Exemplo para excluir tudo, exceto um diretório específico
foo/bar
(observe/*
- sem a barra, o curinga também excluiria tudo dentrofoo/bar
):
--------------------------------------------------------------
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
--------------------------------------------------------------
No seu caso:
application/*
!application/**/
application/language/*
!application/language/**/
!application/language/gr/**
Você deve primeiro pastas da lista branca , antes de poder listar arquivos em uma determinada pasta.
Atualização fevereiro / março de 2016:
Observe que, com o git 2.9.x / 2.10 (meados de 2016?), Pode ser possível incluir novamente um arquivo se um diretório pai desse arquivo for excluído se não houver curinga no caminho incluído novamente .
Nguyễn Thái Ngọc Duy ( pclouds
) está tentando adicionar este recurso:
Portanto, com o git 2.9+, isso poderia realmente funcionar, mas acabou sendo revertido:
application/
!application/language/gr/
v2.8.1.windows.1
, mas ele não aparece para trabalhar :(
application/
+ !application/language/gr/
mencionado na resposta está funcionando conforme o esperado.
A resposta de @Chris Johnsen é ótima, mas com as versões mais recentes do Git (1.8.2 ou posterior), existe um padrão de asterisco duplo que você pode aproveitar para obter uma solução um pouco mais abreviada:
# assuming the root folder you want to ignore is 'application'
application/**/*
# the subfolder(s) you want to track:
!application/language/gr/
Dessa forma, você não precisa "cancelar a assinatura" do diretório pai da subpasta que deseja rastrear.
Com o Git 2.17.0 (Não sei ao certo quanto tempo antes desta versão. Possivelmente, retorne à 1.8.2), o uso do **
padrão combinado com exclusões para cada subdiretório que leva ao (s) arquivo (s) funciona. Por exemplo:
# assuming the root folder you want to ignore is 'application'
application/**
# Explicitly track certain content nested in the 'application' folder:
!application/language/
!application/language/gr/
!application/language/gr/** # Example adding all files & folder in the 'gr' folder
!application/language/gr/SomeFile.txt # Example adding specific file in the 'gr' folder
**
pode corresponder a subpastas zero e *
irá corresponder language
e excluí-lo, impedindo a inclusão de gr
. A cadeia completa de pais que Chris Johnson recomenda ainda parece necessária.
/www/**/* !/www/config.xml !/www/res
config.xml e o diretório res ainda são ignorados.
!/www/res/
. Você pode usar o folder/**/*
padrão, mas ainda precisará adicionar exclusões para cada subdiretório que deseja adicionar. Ainda é mais curto e mais legível do que a combinação de ignorar / excluir.
Há várias perguntas semelhantes sobre isso, então vou postar o que escrevi antes:
A única maneira de fazer isso funcionar na minha máquina era fazê-lo desta maneira:
# 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:
!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ê deve permitir explicitamente o conteúdo para cada nível que você deseja incluir. Portanto, se eu tiver subdiretórios 5 em temas, ainda preciso esclarecer isso.
Isto é do comentário de @ Yarin aqui: https://stackoverflow.com/a/5250314/1696153
Estes foram tópicos úteis:
Eu também tentei
*
*/*
**/**
e **/wp-content/themes/**
ou /wp-content/themes/**/*
Nada disso funcionou para mim também. Muitas tentativas e erros!
!
regras na parte inferior.
Eu descobri que apenas isso realmente funciona.
**/node_modules/*
!**/node_modules/keep-dir
A maneira mais simples e provavelmente a melhor é tentar adicionar os arquivos manualmente (geralmente isso tem precedência sobre as .gitignore
regras de estilo):
git add /path/to/module
Você pode até querer -N
adicionar o sinalizador, sugerindo que você os adicione, mas não imediatamente. Costumo fazer isso para novos arquivos que ainda não estou pronto para preparar.
Esta é uma cópia de uma resposta publicada sobre o que poderia ser facilmente um controle de qualidade duplicado. Estou reposicionando-o aqui para aumentar a visibilidade - acho mais fácil não ter uma confusão de regras de gitignore.
Então, já que muitos programadores usam o nó. o caso de uso que atende a essa pergunta é excluir, node_modules
exceto um módulo, module-a
por exemplo:
!node_modules/
node_modules/*
!node_modules/module-a/
2.10.2.windows.1
.
Adicione uma resposta adicional:
!/.vs/ <== include this folder to source control, folder only, nothing else
/.vs/* <== but ignore all files and sub-folder inside this folder
!/.vs/ProjectSettings.json <== but include this file to source control
!/.vs/config/ <== then include this folder to source control, folder only, nothing else
!/.vs/config/* <== then include all files inside the folder
aqui está o resultado:
Especialmente para as versões mais antigas do Git, a maioria das sugestões não funciona tão bem. Se for esse o caso, eu colocaria um .gitignore separado no diretório em que desejo que o conteúdo seja incluído, independentemente de outras configurações, e permita o necessário.
Por exemplo: /.gitignore
# ignore all .dll files
*.dll
/dependency_files/.gitignore
# include everything
!*
Portanto, tudo em / dependency_files (mesmo arquivos .dll) está incluído.
Eu encontrei um caso semelhante aqui, em que no laravel, por padrão, .gitignore
ignora todos usando asterix e substitui o diretório público.
*
!public
!.gitignore
Isso não é suficiente se você se deparar com o cenário OP.
Se você deseja confirmar uma subpasta específica de public
, digamos, por exemplo, em seu public/products
diretório, você deseja incluir arquivos com uma subpasta profunda, por exemplo, para incluir que public/products/a/b.jpg
eles não serão detectados corretamente, mesmo se você os adicionar especificamente assim !/public/products
,!public/products/*
, etc ..
A solução é garantir que você adicione uma entrada para cada nível de caminho como esse para substituir todos eles.
*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
Apenas outro exemplo de percorrer a estrutura de diretórios para obter exatamente o que você deseja. Nota: não excluí, Library/
masLibrary/**/*
# .gitignore file
Library/**/*
!Library/Application Support/
!Library/Application Support/Sublime Text 3/
!Library/Application Support/Sublime Text 3/Packages/
!Library/Application Support/Sublime Text 3/Packages/User/
!Library/Application Support/Sublime Text 3/Packages/User/*macro
!Library/Application Support/Sublime Text 3/Packages/User/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/*settings
!Library/Application Support/Sublime Text 3/Packages/User/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/*theme
!Library/Application Support/Sublime Text 3/Packages/User/**/
!Library/Application Support/Sublime Text 3/Packages/User/**/*macro
!Library/Application Support/Sublime Text 3/Packages/User/**/*snippet
!Library/Application Support/Sublime Text 3/Packages/User/**/*settings
!Library/Application Support/Sublime Text 3/Packages/User/**/*keymap
!Library/Application Support/Sublime Text 3/Packages/User/**/*theme
> git add Library
> git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: Library/Application Support/Sublime Text 3/Packages/User/Default (OSX).sublime-keymap
new file: Library/Application Support/Sublime Text 3/Packages/User/ElixirSublime.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/Package Control.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/Preferences.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/RESTer.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/SublimeLinter/Monokai (SL).tmTheme
new file: Library/Application Support/Sublime Text 3/Packages/User/TextPastryHistory.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/ZenTabs.sublime-settings
new file: Library/Application Support/Sublime Text 3/Packages/User/adrian-comment.sublime-macro
new file: Library/Application Support/Sublime Text 3/Packages/User/json-pretty-generate.sublime-snippet
new file: Library/Application Support/Sublime Text 3/Packages/User/raise-exception.sublime-snippet
new file: Library/Application Support/Sublime Text 3/Packages/User/trailing_spaces.sublime-settings
gitignore - especifica arquivos não rastreados intencionalmente a serem ignorados.
Exemplo para excluir tudo, exceto um diretório específico foo / bar (observe o / * - sem a barra, o curinga também excluiria tudo dentro de foo / bar ):
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
Outro exemplo para o WordPress :
!/wp-content
wp-content/*
!/wp-content/plugins
wp-content/plugins/*
!wp-content/plugins/my-awesome-plugin
Mais informações aqui: https://git-scm.com/docs/gitignore
Costumo usar essa solução alternativa na CLI, onde, em vez de configurar o meu .gitignore
, crio um .include
arquivo separado onde defino os (sub) diretórios que desejo que sejam incluídos, apesar dos diretórios serem ignorados direta ou recursivamente por.gitignore
.
Assim, eu uso adicionalmente
git add `cat .include`
durante a preparação, antes de confirmar.
Para o OP, sugiro usar um .include
que tenha estas linhas:
<parent_folder_path>/application/language/gr/*
NOTA: O uso cat
não permite o uso de aliases (dentro .include
) para especificar $ HOME (ou qualquer outro diretório específico). Isso ocorre porque a linha homedir/app1/*
quando passada para o git add
uso do comando acima aparece comogit add 'homedir/app1/*'
, e os caracteres entre aspas simples ('') preservam o valor literal de cada caractere entre aspas, impedindo o funcionamento de aliases (como homedir ) (consulte Bash Single Citações ).
Aqui está um exemplo de um .include
arquivo que eu uso no meu repositório aqui .
/home/abhirup/token.txt
/home/abhirup/.include
/home/abhirup/.vim/*
/home/abhirup/.viminfo
/home/abhirup/.bashrc
/home/abhirup/.vimrc
/home/abhirup/.condarc
Eu queria rastrear arquivos js de produção jquery e isso funcionou:
node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
minha configuração do JetBrains IntelliJ IDEA .gitignore, em que preciso excluir a .idea
pasta wholde, exceto .idea/runConfigurations
:
.idea
!.idea/
.idea/*
!.idea/runConfigurations/
consulte: https://github.com/daggerok/gitignore-idea-runConfigurations
.gitignore
documentação do "formato padrão" ficou mais clara (dezembro de 2013). Veja minha resposta abaixo