Ignorieren eines 'bin'-Verzeichnisses in einem Git-Projekt

1236

Ich habe eine Verzeichnisstruktur wie diese:

.git/
.gitignore
main/
  ...
tools/
  ...
...

Innerhalb von main und tools sowie in jedem anderen Verzeichnis auf jeder Ebene kann es ein 'bin'-Verzeichnis geben, das ich ignorieren möchte (und ich möchte auch alles darunter ignorieren). Ich habe jedes dieser Muster in .gitignore ausprobiert, aber keines davon funktioniert:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Kann mir jemand helfen? Das erste Muster (das, von dem ich denke, dass es funktionieren sollte) funktioniert einwandfrei, wenn ich das mache:

/main/**/bin/**/*

Ich möchte jedoch nicht für jedes Verzeichnis der obersten Ebene einen Eintrag haben, und ich möchte nicht jedes Mal, wenn ich einen neuen hinzufüge, .gitignore ändern müssen.

Dies ist unter Windows mit dem neuesten msysgit.

EDIT: eine weitere Sache, es gibt Dateien und Verzeichnisse, deren Namen den Teilstring 'bin' enthalten, ich möchte nicht, dass diese ignoriert werden :)

Ben Hymers
quelle
14
Wahrscheinlich wird es jemand als hilfreich empfinden: Wenn Sie nur wenige Repositorys haben und jedes dieselbe .gitignore-Datei hat, können Sie diese an einem "gemeinsamen" Speicherort ablegen und> git config --global core.excludesfile ~ / .gitignore_global starten. Der letzte Parameter ist path zum gemeinsamen Ort. PS Ich bin neu in Git und nicht sicher, ob dies eine "Best Practice" -Empfehlung ist. Bitte lassen Sie mich wissen, wenn Sie das nicht möchten. Vielen Dank.
Budda
Die **Syntax scheint jetzt (März 2013, Git 1.8.2) offiziell dokumentiert zu sein: siehe meine Antwort unten
VonC
2
Wenn jemand die aktuellste Version der aktuellen Handbuchseite lesen möchte, siehe gitignore (5) Handbuchseite .
Freundlichere Option, wenn Sie es satt haben, Aufsätze zu lesen, um Informationen für eine Zeile zu erhalten atlassian.com/git/tutorials/saving-changes/…
suazithustra

Antworten:

1834

Vor Version 1.8.2 **hatte keine besondere Bedeutung in der .gitignore. Ab 1.8.2 git Träger **auf mittlere null oder mehr Unterverzeichnisse (siehe Release Notes ).

Die Möglichkeit, alle Verzeichnisse mit dem Namen bin irgendwo unterhalb der aktuellen Ebene in einem Verzeichnisbaum zu ignorieren, besteht in einer .gitignoreDatei mit dem folgenden Muster:

bin/

Auf der manSeite finden Sie ein Beispiel für das Ignorieren eines Verzeichnisses, das foomit einem analogen Muster aufgerufen wurde .

Bearbeiten: Wenn Ihr Git-Index bereits Bin-Ordner enthält, die Sie nicht mehr verfolgen möchten, müssen Sie diese explizit entfernen. Git hört nicht auf, Pfade zu verfolgen, die bereits verfolgt werden, nur weil sie jetzt einem neuen .gitignoreMuster entsprechen. Führen Sie einen Ordner entfernen ( rm ) nur aus dem Index entfernen ( --cached ) rekursiv ( -r ). Befehlszeilenbeispiel für den Ordner "root bin":

git rm -r --cached bin
CB Bailey
quelle
72
Beginnend mit Git 1.8.2 akzeptiert Git **in .gitignoreDateien (Quelle: 1.8.2 Changelog )
Carlos Campderrós
15
ist bindas gleiche von bin/?
Nisba
29
@Nisba, sie sind unterschiedlich, binignoriert Dateien mit dem Namen bin, während bin/für Verzeichnisse mit dem Namen bin
Rani Kheir
8
da ich darüber
dba
1
In Windows 10 können Sie keine .gitignore-Datei erstellen. Sie müssen eine gitignore.txt erstellen und dann ren gitignore.txt .gitignore in der Eingabeaufforderung ausführen, um diese Datei zu erstellen
schäbig am
463

Das .gitignorevon deinem Traum scheint zu sein:

bin/

auf der obersten Ebene.

Michael Krelin - Hacker
quelle
Vielen Dank für Ihre Hilfe. Vergessen Sie nicht, das Beispiel für ignorierte Dateien auszuchecken: git checkout bin *
Chris Sim
1
setzen Sie es in gitignore_global
μολὼν.λαβέ
@GAlexander, warum sollte man bin / Verzeichnisse global ignorieren wollen? Sie haben oft versionierte Inhalte. Das globale Ignorieren wirkt sich nicht auf andere Benutzer des Repositorys aus.
Michael Krelin - Hacker
234

Ich denke, es ist erwähnenswert für Git-Anfänger:

Wenn Sie bereits eine Datei eingecheckt haben und diese ignorieren möchten, ignoriert Git die Datei nicht, wenn Sie später eine Regel hinzufügen . In diesen Fällen müssen Sie zuerst die Datei entfernen, indem Sie den folgenden Befehl in Ihrem Terminal ausführen:

git rm --cached

Wenn Sie also hinzufügen möchten, dass einige Verzeichnisse in Ihrem lokalen Repository (die bereits vorhanden sind) nach dem Bearbeiten von .gitignore ignoriert werden, möchten Sie dies in Ihrem Stammverzeichnis ausführen

git rm --cached -r .
git add .

Grundsätzlich wird Ihr lokales Repo "aktualisiert" und ignorierte Dateien werden entfernt.

Sehen:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/

Plancys
quelle
git add -AKann ich dies stattdessen verwenden, wenn ich normalerweise ein Commit für meine Commits durchführe? und kann ich den Punkt auch in der ersten Zeile durch -A ersetzen?
Ajax333221
69

Das hat noch **nie richtig funktioniert, aber seit Git 1.8.2 (8. März 2013) scheint es ausdrücklich erwähnt und unterstützt zu werden:

Die Muster in .gitignoreund .gitattributesDateien können **/ein Muster haben , das 0 oder mehr Ebenen des Unterverzeichnisses entspricht .

ZB " foo/**/bar" entspricht " bar" in " foo" selbst oder in einem Unterverzeichnis von " foo".

In Ihrem Fall bedeutet dies, dass diese Zeile jetzt möglicherweise unterstützt wird:

/main/**/bin/
VonC
quelle
46
[Bb]in/

entspricht sowohl Groß- als auch Kleinbuchstaben

wisbucky
quelle
2
[B]in/der einzige Großbuchstabe sein
Gank
Wie kann man nur BinOrdner ignorieren lassen und binCommit für Git festlegen? [B]in/wird sowohl begehen Binals auch bin.
Gank
4
Dies sollte es tun, @Gank:Bin/ !bin/
Marco G
34

Ich habe es hier nicht erwähnt gesehen, aber dies scheint zwischen Groß- und Kleinschreibung zu unterscheiden. Nachdem ich zu / Bin gewechselt hatte, wurden die Dateien wie erwartet ignoriert.

Cory
quelle
3
Dies ist keine Antwort auf die ursprüngliche Frage, um die es ausdrücklich ging bin, nicht Bin.
CB Bailey
49
Obwohl dies keine Antwort ist, erhöht es die Vollständigkeit für andere, die nach demselben Thema suchen (ich selbst, gerade jetzt).
Jay
25

[Bb]in wird das Problem lösen, aber ... Hier eine ausführlichere Liste von Dingen, die Sie ignorieren sollten (Beispielliste von GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Jaider
quelle
3
Hinweis: Solche Dinge sollten sich in Ihrem GLOBAL gitignore befinden (normalerweise in Ihrem Home-Verzeichnis). Der Projekt-Gitignore sollte nur projektspezifische Dinge ignorieren (dh .o-Dateien für eine C-App.)
BraveNewCurrency
18

Wenn Sie nach einer großartigen globalen .gitignoreDatei für eine Visual Studio (.NET) -Lösung suchen, empfehlen wir Ihnen, diese zu verwenden: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK hat es am umfassendsten .gitignorefür .NET-Projekte.

Jochen van Wylick
quelle
5
Dies beantwortet die Frage nicht wirklich, aber es ist genau das, wonach ich gesucht habe.
Dave
18

Schritt 1: Fügen Sie der Datei .gitignore folgenden Inhalt hinzu.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Schritt 2: Stellen Sie sicher, dass Sie wirksam werden

Wenn das Problem weiterhin besteht, können Einstellungen in .gitignore nur Dateien ignorieren, die ursprünglich nicht verfolgt wurden . Wenn einige Dateien bereits im Versionskontrollsystem enthalten sind, ist das Ändern von .gitignore ungültig. Um dieses Problem vollständig zu lösen, müssen Sie Git Bash oder Package Manager Console öffnen (siehe Abbildung unten), um die folgenden Befehle im Repository-Stammordner auszuführen.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

PM-Konsole Dann ist das Problem vollständig gelöst.

Bravo Yeung
quelle
8

Buchstäblich keine der Antworten hat tatsächlich für mich funktioniert; Das einzige, was für mich funktioniert hat, war (unter Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
AnthonyC
quelle
Hat das auch alle binin den Unterverzeichnissen genannten Ordner ignoriert ?
Vineeshvs
5

Als Hinweis;

Wenn Sie darüber nachdenken, dass .gitignoredies nicht in irgendeiner Weise funktioniert (also foo/*Ordner hinzugefügt , aber git statusimmer noch die Ordnerinhalte als geändert oder ähnlich angezeigt werden), können Sie diesen Befehl verwenden.

git checkout -- foo/*

K-Gun
quelle
3

Ab 2.13.3 sollte das Schreiben von nur bin in Ihre .gitignore-Datei den bin und alle seine Unterverzeichnisse und Dateien ignorieren

Behälter

Nikhil Karanjkar
quelle
2

Das Hinzufügen von ** / bin / zur .gitignore-Datei hat den Trick für mich getan (Hinweis: bin-Ordner wurde nicht zum Index hinzugefügt).

Dhwaneel
quelle
1

Wenn das Muster im Inneren .gitignoremit einem Schrägstrich endet/ , wird nur eine Übereinstimmung mit einem Verzeichnis gefunden.

Mit anderen Worten, bin/stimmt mit einem Verzeichnis binund Pfaden darunter überein, stimmt jedoch nicht mit einer regulären Datei oder einem symbolischen Link überein bin.


Wenn das Muster keinen Schrägstrich enthält , wie in binGit, wird es als Shell-Glob-Muster (gierig) behandelt. Am besten wäre es also, einfach zu verwenden /bin.

bin wäre nicht die beste Lösung für dieses spezielle Problem.

Prosti
quelle
Meinten Sie "mit" beginnen /?
Vineeshvs
0

In meinem Fall war die Codierung der Gitignore-Datei problematisch. Überprüfen Sie, ob es sich um UTF-8 handelt

Jacek Plesnar
quelle