.gitignore alle .DS_Store-Dateien in jedem Ordner und Unterordner

560

Ich habe .DS_Store zur .gitignore-Datei hinzugefügt, aber es scheint, dass .DS_Store nur im Stammverzeichnis ignoriert wird, nicht in jedem Ordner und Unterordner.

Wie behebe ich das?

vickyqiu
quelle
Wie genau haben Sie es zu .gitignore hinzugefügt? Es sollte in allen Verzeichnissen funktionieren (funktioniert für mich).
Thilo
Es funktioniert auch für mich. Ich habe auch versucht, wenn es am Ende der Datei ist, wenn Sie eine (plattformspezifische) Newline haben müssen, aber das hat nichts daran geändert, dass .DS_Store-Verzeichnisse in einem Teil der Hierarchie immer noch ignoriert wurden.
Enorl76
Die Frage, wie ich sie verstehe, war: Wie man alle Vorkommen von .DS_Store in allen Unterverzeichnissen einfach ignoriert, ohne dies manuell in jedem Unterverzeichnis zu tun. Ich hatte das gleiche Problem. Die folgende Antwort zeigt, wie es gelöst werden kann (die letzten beiden Absätze).
Petrsyn

Antworten:

647

Ich denke, das Problem, das Sie haben, ist, dass Sie in einem früheren Commit versehentlich .DS_Store-Dateien zum Repository hinzugefügt haben. Sobald eine Datei in Ihrem Repository verfolgt wurde, wird sie natürlich auch dann weiter verfolgt, wenn sie mit einem Eintrag in einer entsprechenden Gitignore-Datei übereinstimmt.

Sie müssen die .DS_Store-Dateien, die Ihrem Repository hinzugefügt wurden, manuell entfernen. Sie können verwenden git rm --cached .DS_Store. Einmal entfernt, sollte Git es ignorieren. Sie sollten nur die folgende Zeile in Ihrer Root-Gitignore-Datei benötigen : .DS_Store. Vergiss die Zeit nicht!

git rm --cached .DS_Storewird nur .DS_Storeaus dem aktuellen Verzeichnis entfernt. Sie können find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatchdamit alle .DS_Storesaus dem Repository entfernen .

Filztipp: Da Sie wahrscheinlich nie .DS_Store-Dateien einschließen möchten, erstellen Sie eine globale Regel. Erstellen Sie zunächst irgendwo eine globale .gitignore-Datei, z echo .DS_Store >> ~/.gitignore_global. Sagen Sie git nun, dass es für alle Repositorys verwendet werden soll : git config --global core.excludesfile ~/.gitignore_global.

Diese Seite hat mir geholfen, Ihre Frage zu beantworten: https://help.github.com/articles/ignoring-files

Edward Newell
quelle
41
Die letzten beiden Absätze beantworten diese Frage. Vielen Dank.
Petrsyn
70
´´git rm --cached .DS_Store´´ entfernt nur einen .DS_Store aus dem aktuellen Verzeichnis. Benutze ´´find. -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch´´, um alle .DS_Stores aus dem Repo zu entfernen
auco
4
Eine Liste anderer häufig zu ignorierender Dateien könnte nützlich sein
Geotheory
14
Schlechte Idee, globale Regel IMO zu verwenden: Der Versuch, globale Konfigurationen über mehrere Benutzer / Maschinen hinweg zu verwalten, funktioniert nie - Sie möchten, dass die Regeln für Ihr Repo im Repo selbst gelten. Stimmen Sie dem zu
Yarin
15
Ich stimme dir nicht zu. (Auch wenn ich Ihren Kommentar positiv bewertet habe, da ich ihn für aufschlussreich halte.) Wenn wir global arbeiten, muss dies jeder Mac-Benutzer tun, aber nur einmal. Wenn wir das Repository breit machen, müssen wir das für jedes Repository tun. Ich weiß nichts über dich, aber ich mache die ganze Zeit neue Repos. Wenn man es global macht, löst man das Problem ein für alle Mal.
Edward Newell
356

Fügen Sie **/.DS_Storein .gitignorefür das Unterverzeichnis


Wenn .DS_Storebereits festgelegt:

find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch

So ignorieren Sie sie in allen Repositorys: (manchmal heißt es ._.DS_Store)

echo ".DS_Store" >> ~/.gitignore_global
echo "._.DS_Store" >> ~/.gitignore_global
echo "**/.DS_Store" >> ~/.gitignore_global
echo "**/._.DS_Store" >> ~/.gitignore_global
git config --global core.excludesfile ~/.gitignore_global
ronald8192
quelle
noch in mein repo hochgeladen?
Freddy Sidauruk
@FreddySidauruk git rm --cached your_filezuerst verwenden
ronald8192
@FreddySidauruk Sollte sein find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch, von: stackoverflow.com/questions/18393498/…
ronald8192
1
Es scheint, dass das Hinzufügen -ferforderlich ist, wenn Sie offene Dateien in den relavent Ordnern haben:find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch
Mehmet Kaplan
158

Wenn .DS_Store Ihrem Git-Repository nie hinzugefügt wurde, fügen Sie es einfach Ihrer .gitignore-Datei hinzu.

Wenn Sie keine haben, erstellen Sie eine Datei mit dem Namen

.gitignore

Im Stammverzeichnis Ihrer App und einfach schreiben

**/.DS_Store

Drin. Dadurch kann sich die .DS_Store-Datei niemals in Ihr Git einschleichen.

Aber wenn es schon da ist, schreiben Sie in Ihr Terminal:

find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

Übernehmen Sie dann die Änderungen und übertragen Sie sie, um den .DS_Store von Ihrem Remote-Repo zu entfernen:

git commit -m "Remove .DS_Store from everywhere"

git push origin master

Fügen Sie nun .DS_Store zu Ihrer .gitignore-Datei hinzu und schreiben Sie die beiden letzten Codeteile erneut fest und pushen Sie sie (git commit ..., git push ...).

drjorgepolanco
quelle
3
Warum doppeltes Sternchen? Was bedeutet das?
MilanG
1
@MilanG Es ist ein Schlüsselwort, das im Grunde "Suche in diesem Verzeichnis und allen Unterverzeichnissen" bedeutet.
lachie_h
1
Ich bin mir nicht sicher, ob dies eine perfekte Erklärung dafür ist, wofür das doppelte Sternchen steht. Es ist eine Wildcard. Könnte *oder **hängt davon ab, was Sie erreichen möchten. Auf diese Weise können Sie der Shell mitteilen, wie sie in Verzeichnissen navigieren soll. Diese Stackoverflow-Antwort erklärt es vollständig stackoverflow.com/a/28199633/4092170
El'Magnifico
** wird nie mit versteckten (./) Verzeichnissen übereinstimmen: facelessuser.github.io/wcmatch/glob
Jonathan
das funktioniert tatsächlich ... sollte als beantwortet markiert werden
ichimaru
85

Ihre .gitignore- Datei sollte folgendermaßen aussehen:

# Ignore Mac DS_Store files
.DS_Store

Solange Sie keinen Schrägstrich einfügen, wird dieser in allen Verzeichnissen mit dem Dateinamen abgeglichen. (von hier )

Yarin
quelle
Es ist immer noch in Repo hochgeladen
Freddy Sidauruk
@FreddySidauruk dann musst du laufengit rm --cached path/to/file/here
Sgnl
23

Schritt 1, löschen Sie alle *.DS_storeDateien. Man kann rennen

git rm -f *.DS_Store

Aber sei rm -fdir bewusst, dass das ein bisschen gefährlich sein kann, wenn du einen Tippfehler hast! Schritt zwei: hinzufügen

*.DS_Store
.DS_Store

zu .gitignore. Das hat bei mir funktioniert!

Reiseknochen
quelle
13

Fügen Sie *.DS_StoreIhrer .gitignore-Datei hinzu. Das funktioniert bei mir perfekt

Jacob
quelle
11

Sie können das --cachedFlag auch zur Antwort von auco hinzufügen , um lokale .DS_store-Dateien zu verwalten, wie Edward Newell in seiner ursprünglichen Antwort erwähnt hat. Der geänderte Befehl sieht folgendermaßen aus: find . -name .DS_Store -print0 | xargs -0 git rm --cached --ignore-unmatch..cheers und danke!

Andrew Wilhelm
quelle
5

Schritt: 1) Entfernen Sie die vorhandenen Dateien mit diesem Befehl

finden . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

Schritt: 2) Fügen Sie .DS_Store in Ihre .gitignore-Datei ein

Schritt: 3) Übernehmen Sie Ihre Änderungen in .gitignore git. Fügen Sie .gitignore git commit -m "entfernt .DS_Store" hinzu.

vishnu
quelle
3
  1. $ git rm ./*.DS_Store - Entfernen Sie alle .DS_Store aus Git
  2. $ echo \.DS_Store >> .gitignore - Ignoriere .DS_Store in Zukunft

Commit & Push

mate.gwozdz
quelle