Wie kann ich .DS_Store-Dateien aus einem Git-Repository entfernen?

Antworten:

2428

Entfernen Sie vorhandene Dateien aus dem Repository:

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

Fügen Sie die Zeile hinzu

.DS_Store

in die Datei .gitignore, die sich auf der obersten Ebene Ihres Repositorys befindet (oder erstellt wird, wenn sie noch nicht vorhanden ist). Sie können dies einfach mit diesem Befehl im obersten Verzeichnis tun

echo .DS_Store >> .gitignore

Dann

git add .gitignore
git commit -m '.DS_Store banished!'
Benzado
quelle
13
Es ist wirklich trivial, aber using -execwird git-rmfür jede .DS_Store-Datei einmal gestartet, während xargsalle Pfade in einer Befehlszeile zusammengefasst werden. Meistens bevorzuge ich es, xargsweil ich mir keine Sorgen machen muss, vielen Sonderzeichen zu entkommen.
Benzado
8
Dies sollte .git / info / exclude verwenden, nicht .gitignore. Eine Erklärung des Unterschieds zwischen beiden finden Sie unter stackoverflow.com/questions/1753070/… .
Andrew Grimm
106
@ Andrew: Ich stimme nicht zu. Es wäre niemals nützlich, eine .DS_Store-Datei einzuchecken, daher ist dies als repository-weite Einstellung für alle Benutzer sinnvoller, als dass sich jeder Mac-Benutzer daran erinnern muss, sie auf seinem eigenen Computer festzulegen.
Benzado
51
Wirkt sich das Hinzufügen .DS_Storezu .gitignorerekursiv Arbeit? Das heißt, wird es auch ignorieren some/level/of/folders/.DS_Store?
Charlie Schliesser
70
@CharlieS Ja, wenn das Muster keinen Schrägstrich enthält, wird es in allen Verzeichnissen mit dem Dateinamen abgeglichen.
Benzado
239

Kombinieren Sie die Antworten von Benzado und Webmat, aktualisieren Sie sie mit git rmDateien, die nicht im Repo enthalten sind, und schlagen Sie sie nicht fehl , und machen Sie sie für jeden Benutzer generisch einfügbar :

# remove any existing files from the repo, skipping over ones not in repo
find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
# specify a global exclusion list
git config --global core.excludesfile ~/.gitignore
# adding .DS_Store to that list
echo .DS_Store >> ~/.gitignore
Turadg
quelle
2
Ich habe festgestellt, dass es bei der Verwendung eines Git-Repos in meinem Home-Verzeichnis (AKA ein "Dotfiles" -Repo) ~/.gitignoreschmerzhaft ist, eine globale Ausschlussdatei zu haben. Es gibt Dateien, die ich aus meinem Home-Verzeichnis ausschließen möchte und die ich global nicht ignorieren möchte. Ich benutze ~/.gitexcludesstattdessen über die gleiche Anweisung:core.excludesfile
AL das X
156

Die beste Lösung, um dieses Problem zu beheben, besteht darin, diese Dateien von allen Git-Repos auf Ihrem System global zu ignorieren. Dies kann durch Erstellen einer globalen Gitignore-Datei wie folgt erfolgen:

vi ~/.gitignore_global

Hinzufügen von Regeln zum Ignorieren von Dateien wie:

# Compiled source #
###################
*.com
*.class
*.dll
*.exe
*.o
*.so

# Packages #
############
# it's better to unpack these files and commit the raw source
# git has its own built in compression methods
*.7z
*.dmg
*.gz
*.iso
*.jar
*.rar
*.tar
*.zip

# Logs and databases #
######################
*.log
*.sql
*.sqlite

# OS generated files #
######################
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db

Fügen Sie diese Datei nun Ihrer globalen Git-Konfiguration hinzu:

git config --global core.excludesfile ~/.gitignore_global

Bearbeiten:

Symbole wurden entfernt, da sie möglicherweise als Anwendungsressourcen festgeschrieben werden müssen.

Nerv
quelle
Sie können die oben genannten Regeln auch im Gitignore Ihres Repositorys hinzufügen. Dies würde diese Dateien auf Repo-Ebene fernhalten, wenn mehrere Mitwirkende an Ihrem Projekt beteiligt sind. In solchen Fällen sollte sich .gitignore jedoch mit den spezifischen Dateien usw. jedes Betriebssystems befassen, wenn verschiedene Entwickler unterschiedliche Betriebssysteme verwenden. Wie Regeln für Linux, OSX usw.
Nerv
Ich würde empfehlen, dass jeder Entwickler seine os-spezifischen Dateien in seinem eigenen .global_ignore behandelt, so dass das Projekt .gitignore projektspezifisch ist.
McFedr
muss ausgeführt werden: git add .gitignore_global, damit ein anderer Programmierer diese Datei auch in seiner lokalen Umgebung hat?
Stackdave
58

In einigen Situationen möchten Sie möglicherweise auch einige Dateien global ignorieren. Für mich ist .DS_Store einer von ihnen. Hier ist wie:

git config --global core.excludesfile /Users/mat/.gitignore

(Oder eine Datei Ihrer Wahl)

Bearbeiten Sie dann die Datei wie den .gitignore eines Repos. Beachten Sie, dass Sie meiner Meinung nach einen absoluten Pfad verwenden müssen.

Webmat
quelle
26

Wenn Sie die Dateien aufgrund entfernter Änderungen nicht entfernen können, verwenden Sie:

git rm --cached -f *.DS_Store
Reggie Pinkham
quelle
19

Öffnen Sie das Terminal und geben Sie "cd <ProjectPath>" ein.

  1. Vorhandene Dateien entfernen: find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

  2. nano .gitignore

  3. Füge das hinzu .DS_Store

  4. Geben Sie "Strg + x" ein.

  5. Geben Sie "y" ein.

  6. Geben Sie ein, um die Datei zu speichern

  7. git add .gitignore

  8. git commit -m '.DS_Store removed.'

Karthick Vadivel
quelle
nano .gitignoreerstellt die Datei, wenn nicht vorhanden, sollte dieser Befehl aus dem Projektstammordner ausgeführt werden
Saif
17

Die Antwort mit der höchsten Bewertung ist fantastisch, aber um Neulingen wie mir zu helfen, erfahren Sie hier, wie Sie die .gitignore-Datei erstellen, bearbeiten, speichern, die Dateien entfernen, die Sie möglicherweise bereits zu git hinzugefügt haben, und die Datei dann an Github weiterleiten.

Erstellen Sie die Gitignore-Datei

Um eine Gitignore-Datei zu erstellen, können Sie nur touchdie Datei verwenden, die eine leere Datei mit dem angegebenen Namen erstellt. Wir möchten die Datei mit dem Namen .gitignore erstellen, damit wir den folgenden Befehl verwenden können:

touch .gitignore

Ignorieren Sie die Dateien

Jetzt müssen Sie die Zeile hinzufügen, die git anweist, die DS Store-Dateien zu Ihrem .gitignore zu ignorieren. Sie können dazu den Nano-Editor verwenden.

nano .gitignore

Nano ist nett, weil es Anweisungen enthält, wie man rauskommt. ( Ctrl- Ozum Speichern, Ctrl- Xzum Beenden)

Kopieren Sie einige der Ideen aus dieser Github-Liste, in der einige häufig zu ignorierende Dateien aufgeführt sind, und fügen Sie sie ein . Die wichtigsten, um diese Frage zu beantworten, wären:

# OS generated files #
######################
.DS_Store
.DS_Store?

Die # sind Kommentare und helfen Ihnen, Ihre Datei zu organisieren, wenn sie wächst.

Dieser Github-Artikel enthält auch einige allgemeine Ideen und Richtlinien.

Entfernen Sie die Dateien, die bereits zu git hinzugefügt wurden

Schließlich müssen Sie diese DS Store-Dateien tatsächlich aus Ihrem Verzeichnis entfernen.

Verwenden Sie diesen großartigen Befehl aus der Antwort mit der höchsten Bewertung. Dadurch werden alle Ordner in Ihrem Verzeichnis durchsucht und diese Dateien aus git entfernt.

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

Schieben Sie .gitignore zu Github

Im letzten Schritt müssen Sie Ihre .gitignore-Datei tatsächlich festschreiben.

git status

git add .gitignore

git commit -m '.DS_Store banished!'

Joshua Dance
quelle
3
Der Touch-Befehl in Ihren Schritten ist nicht erforderlich. Nano erstellt die Datei für Sie.
Corey Goldberg
1
Ich fand 2 Jahre später meine eigene Antwort und benutzte sie. Gute Arbeit an mir vorbei. :)
Joshua Dance
Hat perfekt funktioniert !! Danke
iUser
15

Ich musste oben git-rm in git rm ändern, damit es funktioniert:

find . -depth -name '.DS_Store' -exec git rm --cached '{}' \; -print
David Kahn
quelle
10

Löschen Sie sie mit git-rmund fügen Sie dann .DS_Store hinzu, um zu verhindern .gitignore, dass sie erneut hinzugefügt werden. Sie können auch Blueharvest verwenden , um zu verhindern, dass sie alle zusammen erstellt werden

Nathan
quelle
9

Falls Sie DS_Store-Dateien in jeden Ordner und Unterordner entfernen möchten:


Bei bereits festgeschriebenem DS_Store:

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

Ignoriere sie durch:

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

quelle
8

Folgendes hat für mich am besten funktioniert. Behandelte nicht übereinstimmende Dateien und Dateien mit lokalen Änderungen. Als Referenz war dies auf einem Mac 10.7-System mit git 1.7.4.4.

Suchen und entfernen:

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

Ich ignoriere .DS_Store auch global in allen Repositorys, indem ich eine globale Datei core.excludesfile setze.

Erstellen Sie zunächst die Datei (falls noch keine vorhanden ist):

touch ~/.gitignore

Fügen Sie dann die folgende Zeile hinzu und speichern Sie:

.DS_Store

Konfigurieren Sie nun git so, dass die Datei global berücksichtigt wird:

git config --global core.excludesfile ~/.gitignore
jordantbro
quelle
8

Verwenden Sie diesen Befehl, um die vorhandenen Dateien zu entfernen:

find . -name '*.DS_Store' -type f -delete

Dann hinzufügen .DS_Storezu.gitignore

Sonnig
quelle
6

Ich fand, dass die folgende Zeile von snipplr am besten zum Löschen aller geeignet ist .DS_Store, einschließlich einer Zeile mit lokalen Änderungen.

find . -depth -name '.DS_Store' -exec git-rm --cached '{}' \; -print

--cachedOption, behält Ihre lokale, .DS_Storeda es sowieso reproduziert wird.

Und wie oben erwähnt, fügen Sie .DS_Storeder .gitignore-Datei im Stammverzeichnis Ihres Projekts hinzu. Dann ist es nicht mehr in Ihren Augen (von Repos).

Manat
quelle
5

Ich bin etwas spät zur Party, aber ich habe eine gute Antwort. Verwenden Sie die folgenden Befehle in einem Terminalfenster, um die .DS_Store-Dateien zu entfernen. Löschen Sie jedoch die Dateien mit 'find'. Die Verwendung eines bestimmten Namens mit der Option -name ist eine der sichereren Möglichkeiten, ihn zu verwenden:

cd directory/above/affected/workareas
find . -name .DS_Store -delete

Sie können das "-delete" weglassen, wenn Sie sie einfach vorher und nachher auflisten möchten. Das wird Ihnen versichern, dass sie weg sind.

In Bezug auf den ~ / .gitignore_global-Rat: Seien Sie hier vorsichtig. Sie möchten diese nette Datei in .gitignore in der obersten Ebene jedes Arbeitsbereichs ablegen und festschreiben, damit jeder, der Ihr Repo klont, den Vorteil seiner Verwendung erhält.

Zeozod
quelle
4

Das wird funktionieren:

find . -name "*.DS_Store" -type f -exec git-rm {} \;

Es löscht alle Dateien, deren Namen mit enden .DS_Store, einschließlich ._.DS_Store.

John Topley
quelle
3
Das Sternchen sollte nicht drin sein.
Aristoteles Pagaltzis
3
Sternchen sollte da sein, weil ich .DS_Store- und ._. DS_Store-Dateien auf meinem Mac-System gefunden habe.
MutantMahesh
3
@ MutantMahesh. In diesem Fall benötigen Sie "*.DS_Store", damit das Sternchen an finddie Shell übergeben und nicht von ihr erweitert wird.
TRiG
4

Aus irgendeinem Grund funktionierte keines der oben genannten auf meinem Mac.

Meine Lösung ist vom Terminallauf:

rm .DS_Store

Führen Sie dann den folgenden Befehl aus:

git pull origin master
Unbesiegbar
quelle
3
$ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
$ git push origin master --force
JZ.
quelle
3

Überspringen Sie beim Initialisieren Ihres Repositorys den darin enthaltenen Befehl git

-u

und es sollte kein Problem sein.

dav1dhunt
quelle
1
Was ist, wenn jemand anderes das Repo erstellt hat und OP nur mit ihm synchronisiert?
JWW
3

Das hat bei mir funktioniert, Kombination aus zwei Antworten von oben:

  • $ git rm --cached -f * .DS_Store
  • $ git commit -m "filter-branch --index-filter 'git rm --cached --ignore-unmatch .DS_Store"
  • $ git push origin master --force
JLunceford
quelle
3

Ignorierte Dateien entfernen:

(.DS_Store)

$ find . -name .DS_Store -print0 | xargs -0 git rm --ignore-unmatch
Cubiczx
quelle
2

Es gibt einige Lösungen, um dieses Problem zu beheben. Verwenden Sie den OS X Finder nicht zum Anzeigen von Ordnern, um das Erstellen von .DS_Store-Dateien zu vermeiden. Eine alternative Möglichkeit zum Anzeigen von Ordnern ist die Verwendung der UNIX-Befehlszeile. Zum Entfernen der .DS_Store-Dateien kann ein Drittanbieterprodukt namens DS_Store Terminator verwendet werden. Zum Löschen der .DS_Store-Dateien aus dem gesamten System kann ein UNIX-Shell-Befehl verwendet werden. Starten Sie das Terminal über Anwendungen: Dienstprogramme Geben Sie an der UNIX-Shell-Eingabeaufforderung den folgenden UNIX-Befehl ein: sudo find / -name ".DS_Store" -depth -exec rm {} \; Wenn Sie zur Eingabe eines Kennworts aufgefordert werden, geben Sie das Mac OS X-Administratorkennwort ein.

Dieser Befehl dient zum Suchen und Entfernen aller Vorkommen von .DS_Store ab dem Stammverzeichnis (/) des Dateisystems auf dem gesamten Computer. Gehen Sie folgendermaßen vor, um diesen Befehl für die Ausführung als geplante Aufgabe zu konfigurieren: Starten Sie das Terminal über Anwendungen: Dienstprogramme Geben Sie an der UNIX-Shell-Eingabeaufforderung den folgenden UNIX-Befehl ein:

sudo crontab -e Wenn Sie zur Eingabe eines Kennworts aufgefordert werden, geben Sie das Mac OS X-Administratorkennwort ein. Drücken Sie im vi-Editor einmal den Buchstaben I auf Ihrer Tastatur und geben Sie Folgendes ein:

15 1 * * * root find / -name ".DS_Store" -depth -exec rm {} \;

Dies wird als Crontab-Eintrag bezeichnet, der das folgende Format hat:

Minute Stunde DayOfMonth Month DayOfWeek-Benutzerbefehl.

Der Crontab-Eintrag bedeutet, dass der Befehl vom System täglich um 01:15 Uhr automatisch von dem Konto namens root ausgeführt wird.

Der Befehl beginnt bei der Suche bis. Wenn das System nicht ausgeführt wird, wird dieser Befehl nicht ausgeführt.

Um den Eintrag zu speichern, drücken Sie einmal die Esc-Taste und gleichzeitig Umschalt + z + z.

Hinweis: Die Informationen in Schritt 4 gelten nur für den vi-Editor.

vinny
quelle
2

Fügen Sie dies Ihrer Datei .gitignore hinzu

#Ignore folder mac
.DS_Store

Speichern Sie dies und machen Sie ein Commit

git add -A
git commit -m "ignore .DS_Store"

und jetzt ignorieren Sie dies für alle Ihre Commits

Ezequiel García
quelle
2

Erstellen Sie eine .gitignoreDatei mit dem Befehltouch .gitignore

und fügen Sie die folgenden Zeilen hinzu

.DS_Store

Speichern Sie die .gitignoreDatei und schieben Sie sie dann in Ihr Git-Repo.

2rahulsk
quelle
2

Der beste Weg, um diese Datei für immer loszuwerden und sich nie wieder darum kümmern zu müssen, ist

Erstellen Sie eine globale Gitignore-Datei:

echo .DS_Store >> ~ / .gitignore_global

Und lassen Sie git wissen, dass Sie diese Datei für alle Ihre Repositorys verwenden möchten:

git config --global core.excludesfile ~ / .gitignore_global Und das war's! .DS_Store ist nicht im Weg.

Kasem007
quelle
1

Keine Notwendigkeit zu entfernen .DS_STORElokal

Fügen Sie es einfach der .gitignoreDatei hinzu

Die .gitignore-Datei ist nur eine Textdatei, die Git mitteilt, welche Dateien oder Ordner in einem Projekt ignoriert werden sollen.

Befehle

  • nano .gitignore
  • Schreiben .DS_StoreDann klickenCTRL+X > y > Hit Return
  • git status Um einen letzten Blick auf Ihre Änderungen zu werfen
  • git add .gitignore
  • git commit -m 'YOUR COMMIT MESSAGE'
  • git push origin master
Wael Assaf
quelle