Was ist der Unterschied zwischen dem Hinzufügen bin
, bin/
, bin/*
und bin/**
in meiner .gitignore - Datei? Ich habe andere .gitignore-Dateien verwendet bin/
, aber in der Eclipse-Datei werden Doppel- und Einzelstern sogar so zusammen verwendet: Was ist damit los?) Ich sehe, dass die ersten beiden Muster ebenfalls weit verbreitet sind. Kann jemand bitte die Unterschiede zwischen den drei erklären? tmp/**/*
88
**
: stackoverflow.com/questions/1470572/…Antworten:
bin
stimmt mit allen Dateien oder Verzeichnissen mit dem Namen 'bin' überein .bin/
stimmt mit allen Verzeichnissen mit dem Namen 'bin' überein , was praktisch den gesamten Inhalt bedeutet, da Git Verzeichnisse nicht alleine verfolgt.bin/*
stimmt mit allen Dateien und Verzeichnissen direkt in einem übereinbin/
. Dies verhindert, dass Git automatisch Dateien in seinen Unterverzeichnissen findet. Wenn jedoch beispielsweise einbin/foo
Unterverzeichnis erstellt wird, stimmt diese Regel nicht mitfoo
dem Inhalt überein .bin/**
Entspricht allen Dateien und Verzeichnissen in einem beliebigenbin/
Verzeichnis und allen Unterverzeichnissen.Das Wort "any" ist hier kritisch, da Regeln nicht relativ zum Repository-Stamm sind und an einer beliebigen Stelle im Dateisystembaum gelten. Sie müssen Regeln mit einem
/
(oder nicht!/
zu ignorierenden) Zeichen beginnen, dh dem Stammverzeichnis des Repositorys, nicht dem Stammverzeichnis des Systems, um nur dem zu entsprechen, was beabsichtigt war.WARNUNG: Sie sollten niemals Regeln verwenden , wie
dir/*
,/dir/**
etc. allein , wenn Sie auch etwas un-ignorieren , die in diesem Verzeichnis existiert . Auslassen das Sternchen oder Sie könnten dauerhaft eine Menge Daten verlieren aus bestimmten Anrufungengit gc
,git stash
und vieles mehr.Ich weiß nicht wirklich, was ich
tmp/**/*
tun soll. Ich dachte anfangs, es könnte verwendet werden, um Dateien in den Unterverzeichnissen von,tmp/
aber nicht Dateien, die direkt in sichtmp/
selbst vorhanden sind, abzugleichen. Ein einfacher Test scheint jedoch darauf hinzudeuten, dass alle darin enthaltenen Dateien ignoriert werdentmp/
.quelle
bin/
undbin/**
?bin/
, dass das bin-Verzeichnis ignoriert wird, währendbin/**
das bin-Verzeichnis, aber keiner seiner Inhalte enthalten wirdbin/
wird das Verzeichnis selbst (einschließlich aller Unterverzeichnisse und Dateien)bin/**
ignoriert , während alle Dateien im bin-Verzeichnis und seinen Unterverzeichnissen ignoriert werden, nicht jedoch das bin-Verzeichnis selbst. Ob das stimmt oder nicht, weiß ich nicht.bin/** \n !bin/*
(da ich nicht sehen kann, wie ein Zeilenumbruch in Mini-Markdownbin
stimmt sowohl eine Datei mit dem Namenbin
als auch der Inhalt desbin
Ordners überein . Drittensbin/*
stimmt mit allen Dateien in seinen Unterverzeichnissen überein . Habt ihr das überhaupt getestet?bin
undbin/
unterscheiden sich nur darin, dass letztere nur mit einem Verzeichnis übereinstimmen.bin/**/*
ist das gleiche wiebin/**
(anscheinend seit 1.8.2, gemäß der Antwort von @ VonC).Das Knifflige, dass ich gerade eine Stunde damit verbracht habe, mir die Haare auszureißen, ist das
bin/
undbin/**
ist nicht ganz dasselbe! Da der frühere das Verzeichnis als Ganzes ignoriert und der letztere jede der darin enthaltenen Dateien ignoriert und git in fast allen Fällen keine Verzeichnisse interessiert, gibt es normalerweise keinen Unterschied. Wenn Sie jedoch versuchen!
, einen Unterpfad zu ignorieren, werden Sie feststellen, dass git (ahem) ihn ignoriert , wenn Sie das übergeordnete Verzeichnis ignoriert haben! (wieder eher als der Verzeichnisinhalt)Dies wird am Beispiel am deutlichsten. Für ein neu initiiertes Repository, das wie folgt eingerichtet ist:
Die folgenden nicht verfolgten Dateien existieren:
Sie können jedoch sehen, dass die folgenden Dateien nicht ignoriert werden:
Und wenn Sie versuchen hinzuzufügen, erhalten Sie:
Ich halte dieses Verhalten für einen Fehler. (Das ist alles an
git version 1.8.4.msysgit.0
)quelle
dir/
unddir/**
re. Das!
Nicht -Ignorieren mit geschieht, weil "Es ist nicht möglich, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist" [Quelle ]. Verwirrend, aber aus Leistungsgründen gemacht. Siehe eine verwandte SO-Frage .Beachten Sie, dass git streng genommen keine Verzeichnisse verfolgt, sondern nur Dateien. Es ist daher nicht möglich, ein Verzeichnis hinzuzufügen, sondern nur dessen Inhalt .
Im Zusammenhang mit
.gitignore
gibt git jedoch vor, Verzeichnisse nur aus dem Grund zu verstehen, dassWas bedeutet das für die Ausschlussmuster? Lassen Sie uns sie im Detail durchgehen:
bin
Dies wird ignoriert
bin
.bin
Sie können ignorierte
bin
Dateien und Ordner auf die Whitelist setzen, indem Sie nachfolgende!
Einträge hinzufügen. Sie können jedoch den Inhalt der genannten Ordner nicht auf die Whitelist setzenbin
bin/
Wie oben, außer dass die genannten Dateien nicht übereinstimmen
bin
. Durch Hinzufügen eines Trailing/
wird git angewiesen, nur mit Verzeichnissen übereinzustimmen.bin/*
Dies wird ignoriert
bin
bin
bin/**
Dies wird ignoriert
bin
bin
quelle
Ich habe gerade ein neues Repo gemacht und einige Dinge ausprobiert. Hier sind meine Ergebnisse:
NEUE ERGEBNISSE
Git Version 2.10.1.windows.1
bin
Verzeichnis mehrere Ebenen tiefbin.txt
Test.txt
bin/a/b/bin.txt
bin/a/b/Test.txt
bin/a/bin/bin.txt
bin/a/bin/Test.txt
bin/a/bin.txt
bin/a/Test.txt
bin/bin.txt
bin/Test.txt
bin
zu gitignore: Ergebnissebin
Verzeichnis (und tiefer) wird jetzt ignoriertbin
zubin/
in der gitignore: Ergebnissebin/
zubin/*
bin/*
zubin/**
bin/**
zubin/**/
bin/bin.txt
undbin/Test.txt
werden nicht länger ignoriertbin/**/
zubin/**/*
bin/bin.txt
undbin/Test.txt
werden wieder ignoriertALTE ERGEBNISSE
Git-Version: 2.7.0.windows.1
bin
Verzeichnis mehrere Ebenen tiefbin/a/b/Test.txt
bin/a/bin/Test.txt
bin/a/Test.txt
bin/Test.txt
bin
zu gitignore: Ergebnissebin
Verzeichnis (und tiefer) wird jetzt ignoriertbin
zubin/
in der gitignore: Ergebnissebin
Verzeichnis (und tiefer) wird immer noch ignoriert (keine Änderung)bin/
zubin/*
bin
Verzeichnis (und tiefer) wird immer noch ignoriert (keine Änderung)bin/*
zubin/**
bin
Verzeichnis (und tiefer) wird immer noch ignoriert (keine Änderung)bin/**
zubin/**/
bin/Test.txt
wird nicht mehr ignoriertbin/**/
zubin/**/*
bin
Verzeichnis (und tiefer) wird wieder ignoriertquelle
Beachten Sie, dass sich das '
**
' in Kombination mit einem Unterverzeichnis (**/bar
) von seinem Standardverhalten geändert haben muss, da in der Versionshinweis für git1.8.2 jetzt Folgendes erwähnt wird:Die Regel, an die Sie sich erinnern sollten (und die hilft, den Unterschied der Absichten hinter dieser Syntax zu verstehen), lautet:
Es ist nicht möglich, eine Datei erneut einzuschließen, wenn ein übergeordnetes Verzeichnis dieser Datei ausgeschlossen ist.
Wenn Sie Dateien aus einem Unterordner eines Ignorierordners f ausschließen möchten, gehen Sie normalerweise wie folgt vor:
Das ist:
f/
der Ordnerf/
ignoriert und die folgenden Regeln spielenf
keine Rolle.f/**
Erzielen Sie dasselbe wief/
, ignorieren Sie jedoch alle Unterelemente (Dateien und Unterordner).Dies gibt Ihnen die Möglichkeit, die Unterordner auf die Whitelist zu setzen (vom Gitignore auszuschließen) :
!f/**/
.f
Unterordner werden nicht ignoriert, können Sie eine Regel hinzufügen , eine Datei ausschließen (!f/a/sub/folder/someFile.txt
)quelle
Es gibt noch einen weiteren Unterschied zwischen
bin/*
undbin/
.bin/
stimmt übereinfoo/bin/test.txt
(wie erwartet), aberbin/*
nicht, was seltsam erscheint, aber es ist dokumentiert: https://git-scm.com/docs/gitignoreDer Grund dafür scheinen folgende Regeln zu sein:
Wenn das Muster mit einem Schrägstrich endet, wird der Schrägstrich entfernt und als Shell-Glob-Muster behandelt. In diesem Fall
bin
stimmt er übereinfoo/bin/test.txt
. Wenn es mit endet/*
, wird der Schrägstrich nicht entfernt und an fnmatch übergeben, das in Unterverzeichnissen nicht übereinstimmt.Dies gilt jedoch nicht für
foo/bin/
undfoo/bin/*
, da der nachfolgende Schrägstrich auch nach dem Entfernenfoo/bin/
noch einen Schrägstrich enthält, sodass er als fnmatch-Muster und nicht als Glob behandelt wird. Dh es wird nicht passenbar/foo/bin/test.txt
quelle