Ignorieren Sie .classpath und .project von Git

76

Ich sage mir und anderen immer wieder, dass sie keine .classpath- und .project-Dateien festschreiben und Maven verwenden sollen.

Irgendwie ignorieren Junior-Entwickler immer bestimmte Regeln und schreiben diese Dateien fest, und es ist viel besser, solche Dateien für Neulinge zu haben, die springen und den Code verwenden können.

Jetzt von meiner Seite möchte ich etwas versuchen / tun. Wenn ich das Repo klone, bekomme ich .classpath- und .project-Dateien und sicherlich werden sie in meinem System geändert.

Ich möchte jedoch, dass sie nicht festgeschrieben werden und bei der Synchronisierung mit Git immer ignoriert werden. Damit meine Änderungen im lokalen System nicht mit Git durcheinander kommen und Git-Änderungen dieser Dateien meine lokalen Dateien nicht durcheinander bringen.

Wie erreiche ich das? Wie auch immer, um diese Dateien so zu markieren, dass sie ignoriert werden?

Reddy
quelle
Ich bin ein kompletter Java n00b, aber nach Eclipse - Dokumentation, die Dateien sollten in der Versionskontrolle gespeichert werden. wiki.eclipse.org/…
Daniel Schilling

Antworten:

116

Wenn die .projectund .classpathbereits festgeschrieben sind, müssen sie aus dem Index entfernt werden (aber nicht von der Festplatte).

git rm --cached .project
git rm --cached .classpath

Dann .gitignorewürde das funktionieren (und diese Datei kann hinzugefügt und über Klone geteilt werden).
Diese gitignore.io/api/eclipseDatei funktioniert dann beispielsweise wie folgt:

# Eclipse Core      
.project

# JDT-specific (Eclipse Java Development Tools)     
.classpath

Beachten Sie, dass Sie beim Klonen ein " Vorlagenverzeichnis " verwenden können (stellen Sie sicher, dass Ihre Benutzer eine Umgebungsvariable $GIT_TEMPLATE_DIRauf einen freigegebenen Ordner festgelegt haben, auf den alle zugreifen können).
Dieser Vorlagenordner kann eine info/excludeDatei mit Ignorierregeln enthalten , die für alle Repos erzwungen werden sollen , einschließlich der neuen ( git init), die jeder Benutzer verwenden würde.


Wie von Abdollah kommentiert

Wenn Sie den Index ändern, müssen Sie die Änderung festschreiben und verschieben.
Dann wird die Datei aus dem Repository entfernt. Daher können die Neulinge die Dateien .classpathund .projectdas Repo nicht auschecken.

VonC
quelle
Wenn Sie den Index ändern, müssen Sie die Änderung festschreiben und verschieben. Dann wird die Datei aus dem Repository entfernt. Daher können die Neulinge die Dateien .classpath und .project nicht aus dem Repo auschecken.
Abdollah
1
@Abdollah Guter Punkt. Ich habe Ihren Kommentar zur besseren Sichtbarkeit in die Antwort aufgenommen.
VonC
@Abdollah Warum? Sobald der Löschvorgang festgeschrieben und verschoben wurde (sowie der .gitignore), können Sie diese Dateien nicht mehr einfach wieder hinzufügen.
VonC
Die Bestellung möchte, dass .classpath und .project weiterhin im Repo verbleiben. Vielleicht ist die Verwendung von SKIP-WORKTREE für ein solches Szenario eine bessere Option. Ich habe es hier erklärt . @VonC Leider habe ich meinen vorherigen Kommentar "Es gibt keine Lösung in Git für ein solches Szenario" einige Minuten nach dem Schreiben gelöscht und Ihre Antwort beim Löschen nicht gesehen.
Abdollah
11

Fügen Sie die folgenden Zeilen in .gitignore ein und platzieren Sie die Datei in Ihrem Projektordner

/target/
/.classpath
/*.project
/.settings
/*.springBeans
Viyaan Jhiingade
quelle
Bitte erklären Sie, was Sie getan haben, um Ihre Antwort zu bearbeiten. Vermeiden Sie nur Code Aswer
GGO
1
Ich habe noch niemanden gesehen, der diese Frage beantwortet hat. Sie haben nur einen Link angegeben, auf den sie verweisen können.
Viyaan Jhiingade
2
Ich finde diese Antwort super hilfreich. Ich kannte alle Konzepte, wollte aber nur den genauen Code in die .gitignore-Datei einfügen. Vielen Dank an @ViyaanJhiingade Und willkommen bei StackOverflow.
Saurabh Patil
3

Die Git-Lösung für solche Szenarien ist das Setzen von SKIP-WORKTREE BIT . Führen Sie nur den folgenden Befehl aus:

git update-index --skip-worktree .classpath .gitignore

Es wird verwendet, wenn git Änderungen von Dateien ignorieren soll, die bereits von git verwaltet werden und im Index vorhanden sind . Dies ist ein häufiger Anwendungsfall für Konfigurationsdateien .

Das Ausführen git rm --cachedfunktioniert für das in der Frage erwähnte Szenario nicht. Wenn ich die Frage vereinfache, heißt es:

Wie .classpathund .projectauf dem Repo, während jeder es lokal ändern kann und Git diese Änderung ignoriert?

Wie ich unter der akzeptierten Antwort kommentiert habe, besteht der Nachteil git rm --cacheddarin, dass der Index geändert wird. Sie müssen die Änderung also festschreiben und dann in das Remote-Repository übertragen. Als Ergebnis .classpathund .projectnicht auf dem Repo zur Verfügung , während der PO will sie da sein , so dass jeder , dass Klonen den Repo zum ersten Mal, sie es verwenden können.

Was ist SKIP-WORKTREE BIT?

Basierend auf Git-Dokumentation:

Das Skip-Worktree-Bit kann in einem (langen) Satz definiert werden: Wenn ein Eintrag beim Lesen als Skip-Worktree markiert ist, gibt Git vor, dass seine Arbeitsverzeichnisversion aktuell ist, und liest stattdessen die Indexversion. Obwohl dieses Bit dem angenommenen unveränderten Bit ähnlich sieht , unterscheidet sich sein Ziel von dem angenommenen unveränderten Bit. Der Sprungbaum hat auch Vorrang vor dem unveränderten Bit, wenn beide gesetzt sind.

Weitere Details finden Sie hier .

Abdollah
quelle
1
Eigentlich habe ich hier darüber geschrieben: stackoverflow.com/a/23806990/6309
VonC
Toller Vergleich.
Abdollah
2
Dies sollte die neu akzeptierte Antwort sein, da dies die einzige Möglichkeit ist, die für git festgeschriebenen Dateien beizubehalten und für neue Festschreibungen zu ignorieren.
IVleafclover
1

Verwenden Sie eine Gitignore-Datei. Auf diese Weise können Sie bestimmte Dateien ignorieren. http://git-scm.com/docs/gitignore

Hier ist ein Beispiel für Eclipse, das Ihren Klassenpfad und Ihre Projektdateien verarbeitet: https://github.com/github/gitignore/blob/master/Global/Eclipse.gitignore

olan
quelle
Ich benutze bereits .gitignore. Dies gilt, wenn ich ein neues Repo von meinem lokalen Standort aus festlege oder erstelle. Wenn Sie das Repo klonen, wird .gitignore vermutlich nicht funktionieren, es wird .project-Datei abrufen und alle Änderungen werden nicht synchron sein
Reddy
2
Sie müssen Ihre .gitignorebeim Repo einreichen , damit jeder sie verwendet. Auf diese Weise sollte niemand diese Dateien einreichen. .classpath und .project sollten niemals im Repo sein.
Olan
1
Was ist mit den vorhandenen Dateien / Repos, die diese Dateien enthalten?
Reddy
1
Kannst du schnell meinen Zweifel an .ignore bestätigen? ^ Über Kommentar
Reddy
1
Ich sehe weder einen Klassenpfad noch ein Projekt, das in dieser Datei ignoriert wird. Vermisse ich etwas (Meine .project-Dateien werden nicht verschwinden, obwohl ich eine Zeile dafür in meinem Gitignore habe)
Matthew Wise