.whitelist gitignore na katalogu i jego zawartości

Próbuję dodać do białej listy katalog (i jego zawartość) nazwę dostawcy w moim katalogu dostawcy Zend Framework 2.

Oryginał .plik gitignore w / vendor wygląda tak:

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*

Teraz chciałbym dodać do białej listy nazwę dostawcy katalogu, co nie powinno być zbyt trudne, myślałem. Mam przeczytałem dokumenty na gitignore i wypróbowałem następujące konfiguracje:

Pierwsza próba, dodaj !SupplierName zaraz po komentarzu, który mówi, że muszę dodać ścieżka na białej liście.

# Add here the vendor path to be whitelisted
!SupplierName
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*

Zaraz po tym wykonałem git status, który nie pokazał katalogu dostawcy / dostawcy. git add vendor/SupplierName pokazała następującą wiadomość:

Następujące ścieżki są ignorowane przez jednego z Twoich .pliki gitignore: vendor / SupplierName

Druga próba

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!SupplierName
!.gitignore
*

Zaraz po tym wykonałem git status, który nie pokazał katalogu dostawcy / dostawcy. git add vendor/SupplierName pokazała następującą wiadomość:

The kolejne ścieżki są ignorowane przez jednego z Twoich .pliki gitignore: vendor / SupplierName

Trzecia próba

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
!.gitignore
*
!SupplierName

Zaraz po tym wykonałem git status, który nie pokazał katalogu dostawcy / dostawcy. git add vendor/SupplierName wydaje się działać . Ale teraz, kiedy chcę dodać moduł.plik php (i kilka innych plików, podkatalogów, itp.) następuje git add vendor/SupplierName/Module.php -->

Następujące ścieżki są ignorowane przez jednego z Twoich .pliki gitignore: nazwa dostawcy/dostawcy / modułu.php

# Add here the vendor path to be whitelisted
# Ex: for composer directory write here "!composer" (without quotes)
*
!.gitignore
!SupplierName
!SupplierName/
!SupplierName/*

Pozwala mi dodawać pliki bezpośrednio w nazwie dostawcy / dostawcy, ale git add vendor/SupplierName/config/module.config.php nadal powoduje

Następujące ścieżki są ignorowane przez jednego z Twoich .pliki gitignore: vendor/SupplierName/Config / module.config.php

Szukałem problemów dotyczących rekurencyjnej białej listy, ponieważ wydaje się, że jest to problem, ale nic nie wyszło.

Author: random, 2013-03-08

5 answers

Możesz użyć 2 Plików .gitignore, aby osiągnąć pożądany efekt:

# vendor/.gitignore
*
!.gitignore
!SupplierName/
!SupplierName/*

# vendor/SupplierName/.gitignore
!*

Przetestowałem to za pomocą repo testowego i wydaje mi się, że działa dla mnie w dodawaniu plików tyle poziomów głęboko pod katalogiem vendor/SupplierName.

$ git add .

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   vendor/.gitignore
#   new file:   vendor/SupplierName/.gitignore
#   new file:   vendor/SupplierName/a
#   new file:   vendor/SupplierName/b
#   new file:   vendor/SupplierName/c
#   new file:   vendor/SupplierName/d
#   new file:   vendor/SupplierName/dir1/d
#   new file:   vendor/SupplierName/dir1/dir4/dir5/dir6/dir7/dir8/dir9/dir10/somefile
#   new file:   vendor/SupplierName/dir1/dir4/f1
#   new file:   vendor/SupplierName/dir1/dir4/f2
#   new file:   vendor/SupplierName/dir1/dir4/f3
#   new file:   vendor/SupplierName/dir1/dir4/f4
#   new file:   vendor/SupplierName/dir1/e
#   new file:   vendor/SupplierName/dir1/f
#   new file:   vendor/SupplierName/dir3/dir6/f5
#   new file:   vendor/SupplierName/dir3/dir6/f6
#   new file:   vendor/SupplierName/dir3/dir6/f7
#   new file:   vendor/SupplierName/dir3/dir7/f8
#   new file:   vendor/SupplierName/e
#
 27
Author: Tuxdude,
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
2013-03-10 09:32:47

Można to również osiągnąć za pomocą tylko jednego pliku .gitignore (w katalogu głównym projektu):

/*
!/.gitignore
!/vendor
/vendor/*
!/vendor/SupplierName
 12
Author: Chronial,
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
2013-03-10 23:37:04

Znalazłem ciekawy artykuł: https://jasonstitt.com/gitignore-whitelisting-patterns

Wszystkie napisy dla Jasona Stitta. Teksty są kopiowane z powyższej strony:

Zignoruj wszystko, a następnie dodaj konkretne podtytuły

# Ignore everything
*
# But descend into directories
!*/
# Recursively allow files under subtree
!/subtree/**
# You can be specific with these rules
!/some/other/deep/path/**
!.gitignore 

Reguła !*/ ignoruje wszystkie katalogi. Ale Git nie śledzi katalogów, tylko pliki, więc !*/ sam w sobie będzie tylko Zezwalaj na zejście do pełnego drzewa katalogów; w rzeczywistości nie pozwoli wszystko do repo. Z ta zasada obowiązuje, potrzebujesz tylko jednej rule using the ** recursive wildcard in to include a subtree.

Jeśli nie użyłeś !*/, potrzebujesz dodatkowych reguł, aby nie ignorować / subtree / i jego katalogi potomne.

Nie każdy lubi !*/ ponieważ oznacza to, że jeśli jakaś inna zasada pozwala na użycie wzorca nazwy pliku znajdującego się w katalogu, którego nie chcesz w repo sam katalog nie zostanie zablokowany. Musisz użyć szczegółowe zasady dotyczące plików do dołącz do tego.

Ignoruj katalog główny, a następnie dodaj całe podtytuły

# Ignore everything in the root
/*
# Un-ignore all of subtree
!/subtree/
!.gitignore 

Ten wzór jest nieco grubszy niż poprzedni. Reguła /* będzie ignorować tylko elementy w katalogu głównym repo struktury katalogów, więc jak tylko dodasz katalog do białej listy, Wszystkie zawartość katalogu będzie również dozwolona, nawet bez użycia * lub **}.

Ignoruj wszystko w katalogu, ale zachowaj puste katalog

*
!.gitignore

Git nie chce dodawać pustego katalogu do repo, ponieważ śledzi pliki. Umieść ukryty plik (np.gitignore) do katalog, i zostanie zapisany. Ale aby Katalog był pusty, nawet jeśli masz tam pliki do celów testowych/rozwojowych, jest to dobry pomysł, aby zignorować wszystko z wyjątkiem .sam plik gitignore.

 3
Author: Simon Lang,
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-11-21 13:31:35

Miałem podobny problem przy przejściu z CVS do Git.

W przeciwieństwie do CVS, Git nie patrzy na katalogi, skupia się na plikach.

Na przykład nie możesz-ignorować katalogu "a", ale nie możesz-ignorować wszystkich plików w katalogu "a" w ten sposób: !a / *

To samo dotyczy podkatalogów.

Jeśli katalog "A" ma podkatalog " b " i ignorujesz "!a / * " wtedy nadal otrzymasz wszystkie pliki w "a / b".

Więc to też musisz zignorować"!a / b/ * " i tak dalej dla wszystkich podkatalogi, które chcesz białej listy. Potrzebujesz tylko jednego .plik gitignore.

Więc kończysz z czymś takim:

# ignore everything
*
# except for .gitignore files in the current directory
!.gitignore
# and all files in directory a
!a/*
#and all files in subdirectory b
!a/b/*

Z tym nadal można uzyskać pliki z a / C i a / b / c. nie jestem pewien, czy istnieje obejście dla rekurencji w podkatalogach.

 2
Author: Goran,
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
2013-03-10 19:49:43

Powinieneś najpierw umieścić wszystko na czarnej liście, a następnie dodać każdy katalog i podkatalog do białej listy. Na przykład, Chcę tylko umieścić DIR /opt/source/, DIR /opt/nginx/ i FILE /home/test/.opt/hello.txt w białej liście, mógłbym napisać .gitignore plik w ten sposób, aby działał:

/*
!/.gitignore
!/opt
/opt/*
!/opt/source/
!/opt/nginx/
!/home
/home/*
!/home/test
/home/test/*
!/home/test/.opt
/home/test/.opt/*
!/home/test/.opt/hello.txt
 2
Author: realhu,
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-10-25 03:15:30