Poprawnie ignoruj rekurencyjnie wszystkie pliki w określonym folderze z wyjątkiem określonego typu pliku

Widziałem podobne pytania (1, 2 oraz 3), ale nie dostaję od nich odpowiedniego rozwiązania.

Muszę zignorować wszystkie pliki w określonym folderze z wyjątkiem określonego typu pliku. Folder jest podkatalogiem ścieżki głównej. Pozwól, że nazwę folder Resources. Ponieważ nie chcę komplikować rzeczy, pozwól mi zignorować pliki w wszystkich folderach o nazwie Resources gdziekolwiek to jest.

Jest to najczęściej spotykane rozwiązanie (we wszystkich duplikatach pytania)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

Problem z tym rozwiązaniem polega na tym, że przestaje śledzić nowo dodane pliki (ponieważ * ignoruje wszystkie pliki). Nie chcę wyłączać każdego typu pliku. Chcę normalnego zachowania, gdzie jeśli jakiś nowy plik zostanie dodany, git status pokazuje go.

W końcu znalazłem rozwiązanie tutaj . Rozwiązaniem jest dodanie kolejnego pliku .gitignore do folderu Resources. To działa poprawnie.

Czy mogę osiągnąć to samo z jednym ignorowanym plikiem? Uważam, że posiadanie wielu ignoruj pliki w różnych katalogach.

To jest to, co staram się osiągnąć:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Ale to daje odwrotne wyjście. Ignoruje typy *.foo i śledzi inne pliki.

Author: Community, 2013-07-23

4 answers

@SimonBuchan ma rację.

Od wersji git 1.8.2, Resources/** !Resources/**/*.foo działa.

 80
Author: Jim G.,
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 12:10:33

Najlepszą odpowiedzią jest dodanie źródła/.plik gitignore w zasobach zawierających:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo
Jeśli nie chcesz lub nie możesz tego dodać .plik gitignore, istnieje nieeleganckie rozwiązanie:
# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Będziesz musiał edytować ten wzorzec, jeśli dodasz katalogi głębiej niż podano.

 23
Author: Ben Martin,
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
2015-11-19 20:50:29

Robię to źle lub zaakceptowana odpowiedź nie działa już z bieżącym Gitem.

Znalazłem właściwe rozwiązanie i zamieściłem je pod prawie tym samym pytaniem tutaj . Po więcej szczegółów udaj się tam.

Rozwiązanie:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
 2
Author: Aleksander Stelmaczonek,
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-26 17:07:34

Może to wyglądać głupio, ale sprawdź, czy nie dodałeś wcześniej do indeksu folderu/plików, które próbujesz zignorować. Jeśli tak, to nie ma znaczenia, co włożysz do swojego .plik gitignore, foldery/pliki będą nadal wyświetlane.

 1
Author: Tiago,
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-17 08:14:54