2016-01-20 18 views
13

Oto zawartość mojego bieżącego katalogu.Jakiego wzoru działa .gitignore?

$ ls 
foo.foo 
$ ls -a 
. .. .bar.foo .foo foo.foo .gitignore 

Następnie zamieniam ten katalog w repozytorium git.

$ git init 
Initialized empty Git repository in /home/lone/foo/.git/ 
$ ls -a 
. .. .bar.foo .foo foo.foo .git .gitignore 

Tutaj jest zawartość .gitignore.

$ cat .gitignore 
*.foo 

Widzę, że wzór w .gitignore zachowuje się inaczej niż ten sam wzór w powłoce. W powłoce *.foo dopasowuje tylko niewidoczne pliki, tj. Nazwy plików, które nie rozpoczynają się kropką.

$ echo *.foo 
foo.foo 

Ale *.foo w .gitignore wydaje się dało żadnych plików, ukryte lub nie-ukryte, że kończy się .foo.

$ git status 
On branch master 

Initial commit 

Untracked files: 
    (use "git add <file>..." to include in what will be committed) 

     .gitignore 

nothing added to commit but untracked files present (use "git add" to track) 

Gdzie mogę dowiedzieć się więcej o precyzyjnej definicji wzorców że .gitignore Wynika więc, że mogę zrozumieć, gdzie i dlaczego jego zachowanie różni się od wzorców powłoki glob?

+3

Oto zasób: https://git-scm.com/docs/gitignore. W pewnych warunkach traktowany jest dokładnie tak, jak skorupa globu. "W przeciwnym razie Git traktuje wzorzec jako glob skorupowy nadający się do spożycia przez fnmatch (3) z flagą FNM_PATHNAME" (Ale czytaj rzeczy powyżej, kiedy nie jest) – hiandbaii

+0

@hiandbaii Zrobiłem tę dokumentację zanim zadałem to pytanie . Jednak kilka rzeczy nie jest dla mnie jasne. Czy powłoka używa również 'fnmatch (3)' do przetwarzania wzorców globu? W takim przypadku dlaczego '*' nie pasuje do znaków zerowych przed '.' (tzn. Ukrytych plików), ale czy robi to gitignore? Nie mogę znaleźć dokładnej sekcji w dokumentacji "gitignore", która to wyjaśnia. –

Odpowiedz

9

gitignore zastosowanie '*' jest zgodna glob convention:

GIT traktuje do wzoru glob powłoki odpowiedniej do konsumpcji fnmatch(3) z FNM_PATHNAME flag: wieloznacznych w strukturze nie będzie pasować do nazwy ścieżki w postaci /.

Na przykład "Documentation/*.html" pasuje do "Documentation/git.html", ale nie "Documentation/ppc/ppc.html" lub "".

OP Lone Learner pyta in the comments:

Czy skorupa używać również fnmatch(3) przetwarzanie wzorców glob?
W takim przypadku dlaczego * nie pasuje do wcześniej znaków zerowych. (tzn. ukryte pliki), ale gitignore ma?

Bo to jest shell configuration choice.

Type (używając shopt, który jest specific to bash):

shopt -s dotglob 
echo *.foo 
.foo foo.foo 

który używa dotglob

Jeśli jest ustawiona, bash zawiera nazwy plików zaczynające się od '.' w wynikach filename expansion . (dla pattern matching)

3

.gitignore po prostu zawiera wpisy dla wzorca, który chcesz powiedzieć git nie śledzić (obsługa symboli wieloznacznych).

Ta konfiguracja jest przechowywana na poziomie folderu.
Tam możesz określić, który plik chcesz zignorować.
Plik ten zostanie zastosowany do wszystkich podfolderów wewnątrz w sposób rekursywny.

.gitignore jest zbieranie informacji w przemiennej sposób:

  • System level - (Global), na przykład, jeśli jesteś użytkownikiem UNIX i chcesz ignorować wszystkie *.so pliki dla wszystkich projektów będziesz umieść go w pliku globalnym

  • Lokalny - Zwykle będzie na poziomie projektu dla wszystkich treści danego projektu.

  • Per folderu - konkretne definicje dla danego folderu (na przykład - ignorować pliku haseł, log etc lub inny zasób, który chcesz zignorować)

Istnieje również właściwość konfiguracji core.excludesfile które pozwalają ustawić ignorowany plik do użycia.

git config --global core.excludesfile ~/.gitignore

Można również określić, które pliki nie ignorować dodając ! przed pliku więc nie będziebyć ignorowane (czytaj więcej poniżej o wieloznacznych whic może być używany).

Aby dowiedzieć się więcej o składni, można o tym przeczytać here.
Możesz użyć narzędzi trzeciej części do wygenerowania tego pliku dla ciebie gitignore.io.


nie mogłem znaleźć na stronie co wyjaśnia, że ​​* zero lub więcej znaków i pasuje ukryte pliki zbyt

Każda linia w pliku mogą zawierać dowolny wzór z następujących symboli wieloznacznych :

? = zero lub jedno wystąpienie określonych wzorów.
* = Dopasowuje zero lub więcej wystąpień podanych wzorców.
+ = Pasuje do jednego lub więcej wystąpień podanych wzorców.
@ = Pasuje do jednego z podanych wzorów.
! = Pasuje do wszystkiego z wyjątkiem jednego z podanych wzorów.


W swoim komentarzu poprosił o informacje na temat * wzorca.

Tutaj widać, że * ignoruje wszystkie pliki. Git nie dba o to, czy jest to ukryty plik, czy nie. po prostu szuka dopasowanego wzoru.

enter image description here

Jak wyjaśniono powyżej git spróbować dopasować wzór użytkownika w pliku .gitignore więc jeśli chcesz ignorować pliki w folderze wewnętrznej trzeba będzie określić folder wewnętrzną. Oto demonstracja zawartości folderu i zignorowanie plików wewnętrznych. Możesz zobaczyć, że wewnętrzny folder aa zawiera plik wewnątrz, ale ponieważ plik ignorujący zawiera wzorzec **/, zignoruje wszystkie wewnętrzne foldery i pliki.

enter image description here

+0

Zrobiłem tę dokumentację zanim zadałem to pytanie. Nie mogłem znaleźć tego, co na stronie wyjaśnia, że ​​'*' dopasowuje zero lub więcej znaków i dopasowuje również ukryte pliki. –

+0

Dodano więcej szczegółów na temat gwiazdki z symbolem wieloznacznym. Nie wahaj się zapytać, czy coś nie jest jeszcze jasne. – CodeWizard

+1

Jako zasada kciuka git wykrywa wszystkie pliki w danej strukturze folderów (Linux lub Windows) i domyślnie włącza je pod kontrolą źródła, chyba że są jawnie ignorowane w .gitignore. W takim przypadku reguła będzie obowiązywać zarówno w ukrytych, jak i widocznych folderach. Potem, ponieważ * dopasowuje zero lub więcej znaków ... Osobiście nie przeczytałem specyfikacji git ani całej dokumentacji, ale myślę, że pewne rzeczy można wywnioskować z zachowania podstawowych systemów plików, szczególnie w Linuksie. – Eniola