Git ignorieren Unterordner

437

Ich habe viele Projekte in meiner .Net-Lösung. Ich möchte alle Ordner "bin / Debug" und "bin / Release" (und deren Inhalt) ausschließen, aber trotzdem den Ordner "bin" selbst und alle darin enthaltenen DLLs einschließen.

.gitignore mit "bin /" ignoriert die Ordner "Debug" und "Release", aber auch alle im Ordner "bin" enthaltenen DLLs.

"bin / Debug" oder "bin / Release" in der .gitignore-Datei schließt die Verzeichnisse nicht aus, es sei denn, ich qualifiziere das Ignoriermuster vollständig als "Solution / Project / bin / Debug" - was ich nicht so tun möchte wie ich Dieses vollständige Muster muss für jedes Projekt in meine Lösung aufgenommen und für alle neu hinzugefügten Projekte hinzugefügt werden.

Irgendwelche Vorschläge?

Marcel
quelle
Warum die DLLs hinzufügen? Wenn Sie auf DLLs von Drittanbietern verweisen, kann es sinnvoll sein, einen gemeinsamen Ordner hinzuzufügen, auf den alle Ihre Projekte verweisen.
Paddy
6
Paddy hat recht - wenn es sich um DLLs von Drittanbietern handelt, sollten diese wahrscheinlich außerhalb Ihres Codes organisiert sein. Für mich klingt es jedoch so, als würden Sie Ihre eigenen Build-Produkte einchecken, was im Allgemeinen nicht der Weg ist, den Sie gehen möchten. Sie verwenden git, um die Informationen zu verfolgen , die vollständig in der Code- und Build-Konfiguration enthalten sind. Die Produkte sind Produkte. Das Verfolgen dieser Probleme ist problematisch. Was passiert beispielsweise, wenn Sie den Code ändern, aber vergessen, neue Produkte zu erstellen und einzuchecken?
Cascabel
Ich hatte ein Problem beim Ausschließen von Unterordnern. Versuchte alles, einschließlich der genauen hier geschriebenen Beispiele, aber ohne Erfolg. Schließlich habe ich eine zusätzliche Leerzeile zwischen Ordnermustern hinzugefügt, und es funktioniert. Möglicherweise ein Codierungsproblem. Ich habe Windows und habe dies in UTF8 codiert.
RoadBump

Antworten:

550

Haben Sie Wildcards ausprobiert?

Solution/*/bin/Debug
Solution/*/bin/Release

Mit Version 1.8.2 von git können Sie den **Platzhalter auch verwenden , um eine beliebige Ebene von Unterverzeichnissen abzugleichen :

**/bin/Debug/
**/bin/Release/
Josh Lee
quelle
8
Es funktioniert, außer wenn es einen Unterordner mit einem anderen Projekt in z. B. Lösung / Modul / Projekt gibt. Daher habe ich vorerst / * / * / bin / Debug und / * / * / * / bin / Debug (für Unterordner) hinzugefügt Ordner). Anscheinend müssen Sie für jede Ebene in Ihrer Verzeichnisstruktur einen Platzhalter-Unterordner hinzufügen.
Marcel
1
@Marcel: Nun, Git wird sicherlich keine Dateien ignorieren, denen Sie es nicht sagen - es ignoriert alles, was mit den Platzhaltern übereinstimmt, nicht mehr und nicht weniger.
Cascabel
Ich denke, dass Doppelstern Verzeichnisgrenzen überschreiten wird, dh: / ** / bin / Debug
Trent
11
@ Taras: Leider nicht.
Tuukka Mustonen
2
Es gab einen Fehler in Visual Studio im Zusammenhang mit **. Sollte jetzt behoben sein. Link
Bogac
106

Sie können .gitignore in der obersten Ebene verwenden, um alle Verzeichnisse im Projekt mit demselben Namen zu ignorieren. Zum Beispiel:

Debug/
Release/

Dies sollte sofort aktualisiert werden, damit es sichtbar ist, wenn Sie den Git-Status ausführen. Stellen Sie sicher, dass diese Verzeichnisse nicht bereits zu git hinzugefügt wurden, da dies die Ignorierungen überschreibt.

Andreas
quelle
Das gleiche könnte durch Hinzufügen der Muster zur OP- $GIT_DIR/.git/info/excludeDatei erreicht werden.
Tim Henigan
1
Der Unterschied besteht darin, dass die .gitignore-Datei dem Code folgt und somit überall gilt. Während die Ausschlussdatei nur für Ihr Repository lokal ist, gilt sie nur für dieses bestimmte Repository. Sofern andere Committer keinen Grund haben, diese Verzeichnisse festzuschreiben, würde ich die Verwendung von .gitignore empfehlen.
Andreas
1
Ein weiteres Problem besteht darin, dass Ihre Lösung ein Projekt namens Debug enthält, das dann ebenfalls ignoriert wird. Ich denke, die Lösung ist eine Kombination aller Antworten und Kommentare - strukturieren Sie die Lösung neu, um gemeinsame oder referenzierte DLLs in einem anderen Ordner zu speichern, ignorieren Sie dann "bin /" und / oder verwenden Sie Platzhalter.
Marcel
16
+1 Für einen Kommentar zum Sicherstellen, dass Verzeichnisse nicht bereits zu git hinzugefügt wurden. Wenn bereits zu Git hinzugefügt, tun Sie:git rm -rf DirectoryName/
Levibostian
57

Bei der Frage geht es nicht darum, alle Unterverzeichnisse zu ignorieren, aber ich konnte die Antwort nirgendwo finden, also werde ich sie posten : */*.

mgold
quelle
1
Gibt es eine Chance, die Sie klären könnten? Ich habe alle möglichen Variationen davon ausprobiert und kann git addein Verzeichnis und alle Dateien in allen Unterverzeichnissen dieses Verzeichnisses nicht ignorieren. Ich habe versucht dirname/, dirname/*, dirname/**, dirname/*/*, auch in Verzweiflung dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris
3
*/*ignoriert alle Unterverzeichnisse, jedoch keine Dateien im aktuellen Verzeichnis. Das Ignorieren eines bestimmten Unterverzeichnisses ist eine normale Verwendung von Gitignoren. dirname, dirname/Und dirname/*alle Arbeit für mich. Wurde bereits etwas in diesem Verzeichnis festgeschrieben?
mgold
Es ist ein brandneues Repo - ich lösche das gesamte .gitVerzeichnis zwischen den Versuchen und git initdann git add --all .(habe es auch ohne versucht --all) mit 1.9.4.msysgit.1. Jedes nicht leere Unterverzeichnis unter meinem benannten Verzeichnis wird dem Index hinzugefügt (aktiviert in TortoiseGit und git status). Es gibt keine relevanten Zeilen beim .gitignoreStarten, !aber es muss ein Konflikt vorliegen. Vorerst durch Entfernen der Ordner während gelöst add. Vermutlich ist dies etwas, das etwas mehr Graben erfordert, um die notwendigen Informationen für die Diagnose bereitzustellen. Vielen Dank, dass Sie mir versichert haben, dass ich die Syntax nicht falsch verstehe.
Chris
Was ist, wenn ich einen Ordner in einem Ordner ignorieren muss, aber nicht den ersten? Wie im Forum / ignorethisfolder / ... aber er soll den Ordner namens forum
Jean Carlos Racoski
Dies funktioniert bei mir nicht, wenn ich ein Verzeichnis ignoriere, dessen Name mit einem Punkt beginnt. " /. " und ". * / *" funktionieren auch nicht.
Tony
44

Alle oben genannten Antworten sind gültig, aber etwas, von dem ich glaube, dass es nicht erwähnt wird, ist, dass Sie, sobald Sie eine Datei aus diesem Verzeichnis zum Repo hinzugefügt haben, das Verzeichnis / Unterverzeichnis, das diese Datei enthält, nicht ignorieren können (git ignoriert diese Anweisung ).

Um bereits hinzugefügte Dateien zu ignorieren, laufen Sie

$ git rm --cached

Andernfalls müssen Sie zuerst alle Dateien aus dem Zielverzeichnis des Repos entfernen - und dann können Sie diesen Ordner ignorieren.

ajacian81
quelle
12
git rm --cached, wenn Sie möchten, dass sie nicht verfolgt werden / für den Verlauf irrelevant sind, die Dateien jedoch lokal intakt bleiben sollen.
Erik Reppen
29

Neben dem Einfügen der richtigen Einträge in Ihre Gitignore-Datei müssen Sie dies tun git rm -r /path/to/dirund festschreiben, bevor Sie das Verzeichnis zu Ihrer Gitignore-Datei hinzufügen , wenn Sie versuchen, etwas zu ignorieren, das bereits zum Repo hinzugefügt wurde . Andernfalls wird git nur Ihre Ignorieranweisung ignorieren.

MidnightJava
quelle
19

Die einzige Möglichkeit, dies auf meiner Maschine zum Laufen zu bringen, bestand darin, es folgendermaßen zu tun:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Beachten Sie, wie Sie Inhalte für jede Ebene, die Sie einschließen möchten, explizit zulassen müssen. Wenn ich also Unterverzeichnisse 5 tief unter Themen habe, muss ich das noch formulieren.

Dies stammt aus @ Yarins Kommentar hier: https://stackoverflow.com/a/5250314/1696153

Dies waren nützliche Themen:

Ich habe es auch versucht

*
*/*
**/**

und **/wp-content/themes/**

oder /wp-content/themes/**/*

Nichts davon hat auch für mich funktioniert. Viel Spur und Irrtum!

Katie
quelle
13

So schließen Sie Inhalte und Unterverzeichnisse aus:

**/bin/*

Fügen Sie "/" hinzu, um alle Unterverzeichnisse auszuschließen, aber den Inhalt zu übernehmen:

**/bin/*/
A. Morel
quelle
9

Um alle Unterverzeichnisse zu ignorieren, können Sie einfach Folgendes verwenden:

**/

Dies funktioniert ab Version 1.8.2 von git.

frederickjh
quelle
8

Die generische Möglichkeit, alle Unterordner zu ignorieren und gleichzeitig die Dateien im /binVerzeichnis zu verfolgen, besteht darin, der Gitignore-Datei Ihres Projekts die folgende Zeile hinzuzufügen:

bin/*/*

Wenn Sie nur bestimmte benannte Unterordner ignorieren möchten, haben Sie folgende Möglichkeiten:

bin/Debug/*
bin/Release/*

nb. Wenn sich das binVerzeichnis nicht im Stammverzeichnis Ihres Projekts befindet (neben der .gitignore-Datei), dann anstelle von z. bin/*/*du brauchst vielleichtpath/to/bin/*/*

Nick F.
quelle