Hier ist der Inhalt meines aktuellen Verzeichnisses.Welches Muster folgt .gitignore?
$ ls
foo.foo
$ ls -a
. .. .bar.foo .foo foo.foo .gitignore
Dann mache ich dieses Verzeichnis in ein Git-Repository.
$ git init
Initialized empty Git repository in /home/lone/foo/.git/
$ ls -a
. .. .bar.foo .foo foo.foo .git .gitignore
Hier ist der Inhalt von .gitignore
.
$ cat .gitignore
*.foo
I sehen, dass das Muster in .gitignore
in der Schale unterschiedlich von dem gleichen Muster verhält. In der Shell *.foo
werden nur nicht versteckte Dateien abgeglichen, d. H. Dateinamen, die nicht mit einem Punkt beginnen.
$ echo *.foo
foo.foo
Aber *.foo
in .gitignore
scheint alle Dateien, versteckte oder nicht versteckt zu entsprechen, die mit .foo
endet.
$ 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)
Wo kann ich mehr über die genaue Definition der Muster, die .gitignore folgt, so dass ich kann verstehen, wo und warum ihr Verhalten von dem das Muster Schal glob unterscheidet?
Hier ist eine Ressource: https://git-scm.com/docs/gitignore. Unter bestimmten Bedingungen wird es genau wie ein Shell-Glob behandelt. "Ansonsten behandelt Git das Muster als einen Shell-Glob, der für den Konsum von fnmatch (3) mit dem FNM_PATHNAME-Flag geeignet ist" (Aber lies das Zeug darüber, wenn es das nicht tut) – hiandbaii
@hiandbaii Ich habe diese Dokumentation gelesen, bevor ich diese Frage gestellt habe . Einige Dinge sind mir jedoch nicht klar. Verwendet die Shell auch 'fnmatch (3)', um Glob-Patterns zu verarbeiten? Warum stimmt '*' dann nicht mit null Zeichen vor '.' überein (d. H. Versteckte Dateien), aber Gitignore? Ich kann den genauen Abschnitt in der Dokumentation "Gitignore" nicht finden, der dies erklärt. –