2622 Stimmen

.gitignore ignoriert alles außer ein paar Dateien

Ich weiß, dass eine .gitignore-Datei bestimmte Dateien vor der Git-Version verbirgt Kontrolle. Ich habe ein Projekt (LaTeX), das viele zusätzliche Dateien erzeugt (.auth, .dvi, .pdf, Protokolle usw.) erzeugt, aber ich möchte nicht, dass diese nachverfolgt werden.

Ich bin mir bewusst, dass ich dafür sorgen könnte (oder sollte), dass all diese Dateien in einer separaten Unterordner im Projekt ablegen könnte, da ich den Ordner dann einfach ignorieren könnte.

Gibt es jedoch eine praktikable Möglichkeit, die Ausgabedateien in der Wurzel des Projektbaums zu halten und .gitignore zu verwenden, um alles zu ignorieren, außer den Dateien mit Git verfolge? Etwas wie

# Ignore everything
*

# But not these files...
script.pl
template.latex
# etc...

20 Stimmen

Duplikat von stackoverflow.com/q/9162919/321973 (Ich weiß, dass das neuer ist, aber die Antwort dort ist richtiger). Eigentlich diese Antwort ist wahrscheinlich die beste

3519voto

Joakim Elofsson Punkte 32858

Eine optionale Vorsilbe ! was das Muster negiert; jede passende Datei, die durch ein ein vorheriges Muster ausgeschlossen wurde, wird wieder eingeschlossen. Wenn ein negiertes Muster passt, hat dies Vorrang vor Mustern mit niedrigerer Priorität.

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

# if the files to be tracked are in subdirectories
!*/a/b/file1.txt
!*/a/b/c/*

27 Stimmen

Es sieht so aus, als ob dies auch Unterordner "ignoriert", so dass alle Dateien mit dem Namen "script.pl" in einem anderen Verzeichnis als dem Root-Verzeichnis sowieso nicht gefunden werden. Ich verwende dies jetzt (mit *.pl) und alle *.pl-Dateien werden ignoriert, obwohl es viele in den Unterverzeichnissen unterhalb der .gitignore-Datei gibt

53 Stimmen

@PandaWood Dieses Problem wurde angesprochen ici (stackoverflow.com). Das liegt daran, dass der erste Ausdruck auf alles passt, auch auf Verzeichnisse, die Sie nie negieren. Um das Problem zu beheben, fügen Sie (!*/) hinzu, das auf alle Unterverzeichnisse (rekursiv) im aktuellen Verzeichnis passt. Dies hilft nicht bei der übergeordneten Antwort, die darin besteht, bestimmte Dateien auf die Whitelist zu setzen (wenn sie sich in Unterverzeichnissen befinden, sollten Sie wahrscheinlich manuell den vollständigen Pfad angeben oder verzeichnisspezifische .gitignore-Dateien verwenden).

3 Stimmen

@huyz nicht wirklich, wenn .gitignore innerhalb der Repo ist, werden Änderungen daran nicht ignoriert (wie bei allen Dateien). .gitignore ignoriert sich selbst, bevor es hinzugefügt wird. Das kann man umgehen, indem man "git add -f .gitignore" macht (wie beim Versuch erwähnt).

1089voto

Giuseppe Galano Punkte 8724

Wenn Sie den gesamten Inhalt eines Verzeichnisses mit Ausnahme einer Datei darin ignorieren wollen, können Sie für jedes Verzeichnis im Dateipfad ein Regelpaar schreiben. z.B. .gitignore zu ignorieren. pippo Ordner außer von pippo/pluto/paperino.xml

pippo/*
!pippo/pluto
pippo/pluto/*
!pippo/pluto/paperino.xml

Beachten Sie, dass, wenn Sie einfach oben geschrieben hätten:

pippo/*
!pippo/pluto/paperino.xml

Es würde nicht funktionieren, weil der Vermittler pluto Ordner für Git nicht existieren würde, also paperino.xml keinen Ort finden konnte, an dem sie existieren konnte.

110 Stimmen

Hervorragende Antwort, aber für alle, die später darauf stoßen, sei angemerkt, dass foo y foo/* sont no dasselbe. Damit dies funktioniert, müssen Sie brauchen zu verwenden foo/* für den Basisordner

47 Stimmen

@Mayank Pippo ist Goofy auf italienisch, Paperino ist Donald Duck und Pluto ist dasselbe wie auf englisch. Das war früher eine sehr gebräuchliche Dreiergruppe von Variablennamen für Programmierbeispiele. Es war schön, sie wieder zu lesen :)

0 Stimmen

Was @thislooksfun sagt, ist wichtig, wenn Sie "einen Ordner außer Datei x ausschließen" wollen.

386voto

Ryan Taylor Punkte 10733

*Sie möchten Folgendes verwenden `/anstelle vono/` in den meisten Fällen**

Verwendung von * ist gültig, aber es funktioniert rekursiv. Von da an werden keine Verzeichnisse mehr durchsucht. Man empfiehlt die Verwendung von !*/ um Verzeichnisse wieder einzuschließen, aber es ist eigentlich besser, den Ordner auf höchster Ebene mit /*

# Blocklist files/folders in same directory as the .gitignore file
/*

# Includelist some files
!.gitignore
!README.md

# Ignore all files named .DS_Store or ending with .log
**/.DS_Store
**.log

# Includelist folder/a/b1/ and folder/a/b2/
# trailing "/" is optional for folders, may match file though.
# "/" is NOT optional when followed by a *
!folder/
folder/*
!folder/a/
folder/a/*
!folder/a/b1/
!folder/a/b2/
!folder/a/file.txt

# Adding to the above, this also works...
!/folder/a/deeply
/folder/a/deeply/*
!/folder/a/deeply/nested
/folder/a/deeply/nested/*
!/folder/a/deeply/nested/subfolder

Der obige Code würde alle Dateien ignorieren, außer der Datei .gitignore , README.md , folder/a/file.txt , folder/a/b1/ y folder/a/b2/ und alles, was in den beiden letztgenannten Ordnern enthalten ist. (Und .DS_Store y *.log Dateien würden in diesen Ordnern ignoriert werden).

Offensichtlich könnte ich z.B. !/folder o !/.gitignore auch.

Mehr Informationen: http://git-scm.com/docs/gitignore

5 Stimmen

Sehr clever, danke. IMO ist dies der beste Weg für WordPress-Sites mit einer minimalen Anzahl von Einschlussregeln. Außerdem werden keine neuen Plugins, Themes oder WP-Updates ohne Ihre ausdrückliche Genehmigung entfernt oder hinzugefügt. Bei der Verwendung von GitHub Desktop finde ich .DS_Store Dateien werden nicht ignoriert, aber über die Befehlszeile ist dies kein Problem. Um dies zu umgehen, musste ich die **/.DS_Store unter allen anderen Regeln.

10 Stimmen

Mein innerer Syntax-Highlighter hat eine seltsame Reaktion auf den Titel Ihres Beitrags.

3 Stimmen

Gracias! Sie können auch eine Datei in einem Ordner auf die Whitelist setzen: !/some/folder/file.txt

104voto

Nik Punkte 2761

Ein bisschen genauer:

Beispiel: Ignoriere alles in webroot/cache - aber behalten webroot/cache/.htaccess .

Beachten Sie den Schrägstrich (/) nach dem cache Ordner:

FAILS

webroot/cache*
!webroot/cache/.htaccess

WERKE

webroot/cache/*
!webroot/cache/.htaccess

0 Stimmen

Wenn Sie VS Code verwenden, achten Sie darauf, die Dateifarbe nicht falsch zu lesen, nachdem Sie dies auf einen Ordner mit .gitkeep angewendet haben, denn der Ordnername wird grün, aber die .gitkeep-Datei wird grau, genau wie alle anderen ignorierten Dateien; .gitkeep sieht so aus, als ob es ignoriert wird, aber Sie sollten sehen, dass auf der rechten Seite ein 'U' steht, das anzeigt, dass es erkannt wurde

95voto

theapache64 Punkte 9298

Let's toolify!

Wie @Joakim sagte, können Sie eine Datei ignorieren, indem Sie etwas wie das Folgende verwenden.

# Ignore everything
*

# But not these files...
!.gitignore
!someFile.txt

aber wenn sich die Datei in verschachtelten Verzeichnissen befindet, ist es ein wenig schwierig, diese Regeln zu schreiben.

Wenn wir zum Beispiel alle Dateien auslassen wollen, aber nicht a.txt mit Sitz in aDir/anotherDir/someOtherDir/aDir/bDir/cDir . Dann wird unser .gitignore wird in etwa so aussehen

# Skip all files
*

# But not `aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt`
!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Das ist ziemlich schwer mit der Hand zu schreiben.

Um diese Hürde zu überwinden, habe ich eine Webanwendung namens git-do-not-ignore die die Regeln für Sie erstellt.

Werkzeug

Demo

Beispielhafte Eingabe

aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

Beispielhafte Ausgabe

!aDir/
aDir/*
!aDir/anotherDir/
aDir/anotherDir/*
!aDir/anotherDir/someOtherDir/
aDir/anotherDir/someOtherDir/*
!aDir/anotherDir/someOtherDir/aDir/
aDir/anotherDir/someOtherDir/aDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/
aDir/anotherDir/someOtherDir/aDir/bDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/
aDir/anotherDir/someOtherDir/aDir/bDir/cDir/*
!aDir/anotherDir/someOtherDir/aDir/bDir/cDir/a.txt

3 Stimmen

Gute Arbeit, tolles Tool! Es hat mir viel Arbeit erspart.

0 Stimmen

Aus irgendeinem Grund ist es mir nicht erlaubt, die Ergebnisse von dieser Seite zu kopieren...

0 Stimmen

@not2qubit Seltsam. Können Sie es mit einem anderen Browser versuchen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X