2013-03-08 9 views
22

Próbuję umieścić na białej liście katalog (i jego zawartość) SupplierName w moim katalogu dostawcy Zend Framework 2..gitignore Biała lista w katalogu i jej zawartości

Oryginalny plik .gitignore w/sprzedawca wygląda następująco:

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

Teraz chciałbym do białej listy z SupplierName katalogów, które nie powinno być zbyt trudne myślałem. Mam read the docs on gitignore i próbował następujących konfiguracjach:

najpierw spróbować, dodać SupplierName zaraz po komentarzu, który mówi, że muszę dodać ścieżkę białej listy tutaj.

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

Zaraz po tym, że wykonywane git status które nie wykazywały katalogu vendor/SupplierName. git add vendor/SupplierName wykazała następujący komunikat:

następujące ścieżki są ignorowane przez jednego z plików .gitignore: Dostawcy/SupplierName

drugiej próbie

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

zaraz potem wykonałem git status, która nie wyświetlała katalogu vendor/SupplierName. git add vendor/SupplierName wykazała następujący komunikat:

następujące ścieżki są ignorowane przez jednego z plików .gitignore: Dostawcy/SupplierName

trzeciej próbie

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

zaraz potem wykonałem git status, która nie wyświetlała katalogu vendor/SupplierName. git add vendor/SupplierNamewydaje się działać. Ale teraz, kiedy chcę dodać plik Module.php (i kilka innych plików, podkatalogów, itp.), Dzieje się to. git add vendor/SupplierName/Module.php ->

następujące ścieżki są ignorowane przez jednego z plików .gitignore: Dostawcy/SupplierName/Module.php

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

pozwala mi dodać pliki bezpośrednio w vendor/SupplierName, ale git add vendor/SupplierName/config/module.config.php nadal skutkuje

następujące ścieżki są ignorowane przez jednego z plików .gitignore: sprzedawca/SupplierName/config/module.config.php

Szukałem problemów związanych z rekurencyjną białą listą, ponieważ to wydaje się być problemem, ale nic nie wyszło.

+0

Dlaczego po prostu 'git add -f vendor/SupplierName' nie zaatakował twojej zasady ignorowania git – AD7six

+0

Ponieważ nie jest to sposób, w jaki" powinien "być zrobiony w mojej opinii. Poza tym może to powodować problemy, gdy ktoś nowy zacznie pracować nad projektem. –

+0

Jakie problemy? Myślę, że naprawiasz tutaj niewłaściwy problem. – AD7six

Odpowiedz

25

Można użyć 2 .gitignore pliki do osiągnięcia pożądanego rezultatu:

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

# vendor/SupplierName/.gitignore 
!* 

testowałem to z repo testowym i wydaje się działać dla mnie dodawanie plików jak wielu poziomach 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 
# 
+0

Dzięki! To działa. Nagradza nagrodę, gdy pozwala na to stackoverflow ... –

2

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żna ignorować nie-katalog „a”, ale nie można ignorować wszystkie pliki w katalogu „a” jak tak: a/*

To samo odnosi się do podkatalogów.

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

Musisz więc zignorować to również "! A/b/*" itd. Dla wszystkich podkatalogów, które chcesz wyświetlić na białej liście.

Potrzebujesz tylko jednego pliku .gitignore.

więc skończyć 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 tego byś wciąż plików z/c, a/b/c. Nie jestem pewien, czy istnieje obejście rekurencji w dół podkatalogów.

12

można również osiągnąć z tylko jednym .gitignore pliku (w katalogu głównym projektu):

/* 
!/.gitignore 
!/vendor 
/vendor/* 
!/vendor/SupplierName 
2

Należy to wszystko na czarnej liście, następnie dołożyć wszelkich katalog i subdirctory w białej listy. Na przykład, chcę tylko, aby umieścić DIR /opt/source/, reż /opt/nginx/ i plik /home/test/.opt/hello.txt w białej listy, można napisać .gitignore plik tak, aby to działało:

/* 
!/.gitignore 
!/opt 
/opt/* 
!/opt/source/ 
!/opt/nginx/ 
!/home 
/home/* 
!/home/test 
/home/test/* 
!/home/test/.opt 
/home/test/.opt/* 
!/home/test/.opt/hello.txt 
1

Znalazłeś interesujący artykuł: https://jasonstitt.com/gitignore-whitelisting-patterns

wszystkie kredyty Jasonowi Stittowi. Teksty są kopiowane ze strony powyżej:

Ignoruj ​​wszystko, a następnie dodać konkretne poddrzewa

# 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 un-ignoruje wszystkie katalogi. Ale Git nie śledzi katalogów, tylko pliki, więc tylko pozwala zejść do pełnego drzewa katalogów; w repozytorium nic nie będzie zezwalać na żadne zmiany. Po wprowadzeniu tej reguły potrzebujesz tylko jednej reguły , używając rekurencyjnego symbolu wieloznacznego **, aby dołączyć poddrzewo.

Jeśli nie użyłeś !*/, będziesz potrzebować dodatkowych reguł, aby zignorować /subtree/i jego katalogi podrzędne.

Nie każdy lubi !*/ ponieważ oznacza to, że jeśli jakakolwiek inna reguła umożliwia wzorzec plików znaleziono wewnątrz jakiegoś katalogu nie chcesz w repo, sam katalog nie zostanie zablokowany. Musisz użyć określonych reguł dla plików, które chcesz dołączyć do tego.

ignorowanie katalog główny, a następnie dodać całe poddrzewa

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

Ten wzór jest nieco grubszy niż poprzedni. Reguła /* zignoruje tylko elementy w korzenia struktury katalogu repo, więc jak najszybciej whitelist katalogu, wszystkie zawartość katalogu zostaną dopuszczone jako dobrze, nawet bez użycia z * lub ** symbole wieloznaczne.

Ignoruj ​​wszystko w katalogu, ale zachować pusty katalog

* 
!.gitignore 

Git nie chce zawierać pusty katalog w repo, ponieważ tory plików. Umieść ukryty plik (taki jak .gitignore) w katalogu i zostanie zapisany. Ale aby zachować katalog pusty, nawet jeśli masz tam pliki do testowania/programowania, dobrym pomysłem jest zignorowanie wszystkiego z wyjątkiem samego pliku .gitignore.

Powiązane problemy