.gitignore wyklucza folder, ale zawiera określony podfolder

Mam folder application / który dodaję do .gitignore. Wewnątrz aplikacji / folderu znajduje się folder application / language / gr. Jak mogę dołączyć ten folder? Próbowałem tego

application/
!application/language/gr/
Bez powodzenia...
 680
Author: Matt, 2011-04-04

11 answers

Jeśli wykluczysz application/, to wszystko pod nim będzie zawsze wykluczone (nawet jeśli jakiś późniejszy negatywny wzorzec wykluczenia ("unignore") może pasować do czegoś pod application/).

Aby zrobić to, co chcesz, musisz "odpiąć" każdy Katalog nadrzędny czegokolwiek, co chcesz "odpiąć". Zazwyczaj kończysz na pisaniu reguł dla tej sytuacji parami: ignoruj wszystko w katalogu, ale nie jakiś podkatalog.

# you can skip this first one if it is not already excluded by prior patterns
!application/

application/*
!application/language/

application/language/*
!application/language/gr/

Uwaga
The trailing /* is znaczące:

  • wzorzec dir/ wyklucza katalog o nazwie dir i (domyślnie) Wszystko pod nim.
    Z dir/, Git nigdy nie będzie patrzył na cokolwiek Pod dir, a tym samym nigdy nie zastosuje żadnego z wzorców "nieujemnych" do niczego pod dir.
  • wzorzec dir/* nie mówi nic o dir, po prostu wyklucza wszystko pod dir. Z dir/*, Git przetworzy bezpośrednią zawartość dir, dając innym wzorcom szansę na "wyłączenie" jakiegoś fragmentu content (!dir/sub/).
 1144
Author: Chris Johnsen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-24 21:24:49

Commit 59856de from Karsten Blees (kblees) dla Git 1.9/2.0 (Q1 2014) wyjaśnia ten przypadek:

gitignore.txt: Wyjaśnienie rekurencyjnego charakteru wykluczonych katalogów

Opcjonalny prefiks " !", który neguje wzorzec; każdy pasujący plik wykluczony przez poprzedni wzorzec zostanie ponownie dołączony.

Nie jest możliwe ponowne dołączenie pliku, jeśli Katalog nadrzędny tego pliku jest wykluczony. (*)
(*: jeśli nie są spełnione pewne warunki w git 2.8+, patrz poniżej)
Git nie wymienia wykluczonych katalogów ze względu na wydajność, więc wszelkie wzorce NA zawartych plikach nie mają żadnego wpływu, bez względu na to, gdzie są zdefiniowane.

Umieść ukośnik wsteczny ("\") przed pierwszym " ! "dla wzorców zaczynających się literalnie" !", na przykład"\!important!.txt".

Przykład, aby wykluczyć wszystko z wyjątkiem określonego katalogu foo/bar (zwróć uwagę na /* - BEZ ukośnika, symbol wieloznaczny wykluczyłoby również wszystko, co wewnątrz foo/bar):

 --------------------------------------------------------------
     $ cat .gitignore
     # exclude everything except directory foo/bar
     /*
     !/foo
     /foo/*
     !/foo/bar
 --------------------------------------------------------------

Aktualizacja Luty / Marzec 2016:

Zauważ, że z git 2.9.x / 2.10 (połowa 2016?), może być możliwe ponowne dołączenie pliku, jeśli Katalog nadrzędny tego pliku jest wykluczony , jeśli w ścieżce dołączonej ponownie nie ma symboli wieloznacznych.

Nguyễn Thái Ngọc Duy (pclouds) próbuje dodać tę funkcję:

Więc z git 2.9+, to mogło zadziałać, ale ostatecznie zostało przywrócone:

application/
!application/language/gr/
 107
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 19:40:12

@ Chris Johnsen odpowiedź jest świetna, ale w nowszych wersjach Git (1.8.2 lub nowszych), istnieje wzór podwójnej gwiazdki, który możesz wykorzystać dla nieco krótszego rozwiązania:

# assuming the root folder you want to ignore is 'application'
application/**/*

# the subfolder(s) you want to track:
!application/language/gr/

W ten sposób nie musisz "usuwać" katalogu nadrzędnego podfolderu, który chcesz śledzić.


Z Git 2.17.0 (Nie wiem jak wcześnie przed tą wersją. Prawdopodobnie z powrotem do 1.8.2), używając wzorca ** połączonego z wykluczeniami dla każdego podkatalogu prowadzącego do Twojego pliku(plików) działa. Na przykład:

# 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
 42
Author: rpyzh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-12 16:28:49

Jest kilka podobnych pytań na ten temat, więc napiszę to, co napisałem wcześniej:

Jedynym sposobem, aby to działało na mojej maszynie było zrobić to w ten sposób:

# 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/*/*/*/*/*

Zauważ, jak musisz wyraźnie zezwolić na zawartość dla każdego poziomu, który chcesz dołączyć. Więc jeśli mam podkatalogi 5 głęboko pod motywami, nadal muszę to przeliterować.

To jest z komentarza @Yarin: https://stackoverflow.com/a/5250314/1696153

Były to przydatne tematy:

I also tried

*
*/*
**/**

I **/wp-content/themes/**

Lub /wp-content/themes/**/*

Dla mnie też nic z tego nie wyszło. Dużo śladów i błędów!
 14
Author: Katie S,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:55:11

Znalazłem tylko to faktycznie działa.

**/node_modules/*
!**/node_modules/keep-dir
 5
Author: Steve Kling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-16 21:53:07

Tak więc, ponieważ wielu programistów używa node . przypadek użycia, który spełnia to pytanie, to wykluczenie node_modules z wyjątkiem jednego modułu module-a , na przykład:

!node_modules/

node_modules/*
!node_modules/module-a/
 4
Author: Abdennour TOUMI,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-01 21:19:56

Kolejny przykład przechodzenia po strukturze katalogów, aby uzyskać dokładnie to, czego chcesz. Uwaga: nie wykluczyłem Library/ ale Library/**/*

# .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
 3
Author: Adrian Dunston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-09-14 14:53:28

Szczególnie dla starszych wersji Gita, większość sugestii nie będzie działać tak dobrze. Jeśli tak, to wstawiłbym osobną .gitignore w katalogu, w którym chcę, aby zawartość była dołączana niezależnie od innych ustawień i zezwalać tam na to, co jest potrzebne.

Na przykład: /.gitignore

# ignore all .dll files
*.dll

/dependency_files/.gitignore

# include everything
!*

Więc wszystko w / dependency_files (parzyste .pliki dll) są zawarte w porządku.

 3
Author: Breit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 08:59:40

Znalazłem podobny przypadek tutaj, gdzie w laravel domyślnie, .gitignore ignoruje wszystkie za pomocą asterix, a następnie nadpisuje katalog publiczny.

*
!public
!.gitignore

To nie wystarczy, jeśli napotkasz scenariusz OP.

Jeśli Chcesz zatwierdzić określone podfoldery public, np. w katalogu public/products chcesz załączyć pliki, które są jednym podfolderem, np. załączyć public/products/a/b.jpg nie zostaną poprawnie wykryte, nawet jeśli dodasz je w ten sposób !/public/products, !public/products/*, itd..

Rozwiązaniem jest dodanie wpisu dla każdego poziomu ścieżki, aby zastąpić je wszystkie.

*
!.gitignore
!public/
!public/*/
!public/products/
!public/products/*
!public/products/*/
!public/products/*/
!public/products/*/*
 3
Author: blamb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-21 01:49:33

W WordPressie to mi pomogło:

wp-admin/
wp-includes/
/wp-content/*
!wp-content/plugins/
/wp-content/plugins/*
!/wp-content/plugins/plugin-name/
!/wp-content/plugins/plugin-name/*.*
!/wp-content/plugins/plugin-name/**
 1
Author: T.Todua,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-21 15:44:57

Chciałem śledzić pliki jQuery production js i to zadziałało:

node_modules/*
!node_modules/jquery
node_modules/jquery/*
!node_modules/jquery/dist/*
 -1
Author: Indrek Ruubel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-30 06:58:28