441 Stimmen

Kann ich eine Datei "git commit" und ihre inhaltlichen Änderungen ignorieren?

Jeder Entwickler in meinem Team hat seine eigene lokale Konfiguration. Diese Konfigurationsinformationen werden in einer Datei namens devtargets.rb die in unseren Rake-Bauaufgaben verwendet wird. Ich möchte allerdings nicht, dass sich die Entwickler gegenseitig die devtargets-Datei kaputt machen.

Mein erster Gedanke war, die Datei in den Ordner .gitignore Liste, damit sie nicht an Git übergeben wird.

Dann habe ich mich gefragt: Ist es möglich, die Datei zu übertragen, aber Änderungen an der Datei zu ignorieren? Ich würde also eine Standardversion der Datei übertragen und wenn ein Entwickler sie auf seinem lokalen Rechner ändert, würde Git die Änderungen ignorieren und die Datei würde nicht in der Liste der geänderten Dateien auftauchen, wenn man einen Git-Status oder Git-Commit macht.

Ist das möglich? Es wäre sicherlich eine nette Funktion...

537voto

Rob Wilkerson Punkte 39218

Sicher, ich mache genau das von Zeit zu Zeit mit

git update-index --assume-unchanged [<file> ...]

Rückgängig machen und die Verfolgung erneut beginnen (wenn Sie vergessen haben, welche Dateien nicht verfolgt wurden), siehe diese Frage ):

git update-index --no-assume-unchanged [<file> ...]

Einschlägige Unterlagen :

--[no-]assume-unchanged
Wenn dieses Flag angegeben ist, werden die für die Pfade aufgezeichneten Objektnamen nicht aktualisiert. Stattdessen wird mit dieser Option das Bit "Unverändert übernehmen" für die Pfade gesetzt/entfernt. Wenn das "assume unchanged"-Bit aktiviert ist, verspricht der Benutzer, die Datei nicht zu ändern, und erlaubt Git, davon auszugehen, dass die Arbeitsbaumdatei mit dem übereinstimmt, was im Index aufgezeichnet ist. Wenn Sie die Arbeitsbaumdatei ändern wollen, müssen Sie das Bit deaktivieren, um Git zu informieren. Dies ist manchmal hilfreich, wenn man mit einem großen Projekt auf einem Dateisystem arbeitet, das sehr langsam ist. lstat(2) Systemaufruf (z.B. cifs).

Git scheitert (gnädigerweise), wenn es diese Datei im Index ändern muss, z.B. beim Einbinden eines Commits; wenn also die angenommene, nicht nachverfolgte Datei stromaufwärts geändert wird, müssen Sie die Situation manuell handhaben.

Fail gracefully bedeutet in diesem Fall, dass wenn es irgendwelche Änderungen an der Datei gibt (legitime Änderungen, etc.), wenn Sie einen Pull durchführen, wird es sagen:

$ git pull
…
From https://github.com/x/y
   72a914a..106a261  master     -> origin/master
Updating 72a914a..106a261
error: Your local changes to the following files would be overwritten by merge:
                filename.ext

und wird sich weigern, zu fusionieren.

Sie können dieses Problem lösen, indem Sie entweder Ihre lokalen Änderungen rückgängig machen, z.B. hier:

 $ git checkout filename.ext

dann wieder ziehen und die lokale Datei erneut ändern, oder Sie können die –no-assume-unchanged und Sie können an diesem Punkt normales Auslagern und Zusammenführen usw. durchführen.

119voto

1615903 Punkte 29158

Die bevorzugte Methode hierfür ist die Verwendung von git update-index --skip-worktree <file> wie erklärt in dieser Antwort :

assume-unchanged ist für Fälle gedacht, in denen es teuer ist, die ob eine Gruppe von Dateien geändert wurde; wenn Sie das Bit setzen, nimmt git (natürlich) davon aus, dass die Dateien, die zu diesem Teil des Index entsprechen, in der Arbeitskopie nicht verändert wurden. So vermeidet es ein Durcheinander von stat-Aufrufen. Dieses Bit geht immer dann verloren, wenn sich der Eintrag der Datei im Index ändert (also wenn die Datei stromaufwärts geändert wird).

skip-worktree ist mehr als das: Selbst wenn Git weiß, dass die Datei geändert wurde (oder durch ein reset --hard oder ähnliches geändert werden muss) o.ä.), tut es so, als ob sie nicht geändert worden wäre und verwendet stattdessen die Version aus dem Index. Dies bleibt so lange bestehen, bis der Index verworfen wird.

Um dies rückgängig zu machen, verwenden Sie git update-index --no-skip-worktree <file>

Seit Git Version 2.25.1 ist dies auch nicht mehr der empfohlene Weg, Zitat:

Benutzer versuchen oft, die Bits assume-unchanged und skip-worktree zu verwenden, um Git anzuweisen, Änderungen an Dateien zu ignorieren, die nachverfolgt werden. Dies funktioniert nicht wie erwartet, da Git bei bestimmten Operationen immer noch Arbeitsbaumdateien mit dem Index abgleicht. Im Allgemeinen bietet Git keine Möglichkeit, Änderungen an verfolgten Dateien zu ignorieren, daher werden alternative Lösungen empfohlen.

Wenn es sich bei der zu ändernden Datei beispielsweise um eine Konfigurationsdatei handelt, kann das Repository eine Beispielkonfigurationsdatei enthalten, die dann in den ignorierten Namen kopiert und geändert werden kann. Das Repository kann sogar ein Skript enthalten, das die Beispieldatei als Vorlage behandelt und sie automatisch modifiziert und kopiert.

53voto

erjiang Punkte 42668

Die gängige Praxis scheint darin zu bestehen, eine devtargets.default.rb und übertragen Sie sie, und weisen Sie dann jeden Benutzer an, diese Datei nach devtargets.rb (die in der .gitignore-Liste steht). CakePHP zum Beispiel macht das Gleiche für seine Datenbankkonfigurationsdatei, die sich natürlich von Rechner zu Rechner ändert.

6voto

bk2204 Punkte 49408

Es ist nicht möglich, Änderungen an einer verfolgten Datei mit Git zu ignorieren. Die Git FAQ erklärt dies :

Git bietet keine Möglichkeit, dies zu tun. Der Grund dafür ist, dass Git, wenn es diese Datei überschreiben muss, z. B. bei einem Checkout, nicht weiß, ob die Änderungen an der Datei wertvoll sind und beibehalten werden sollten, oder ob sie irrelevant sind und sicher vernichtet werden können. Daher muss es den sicheren Weg wählen und sie immer aufbewahren.

Es ist verlockend, bestimmte Funktionen von git update-index zu nutzen, nämlich die Funktionen assume-unchanged und skip-worktree, aber diese funktionieren für diesen Zweck nicht richtig und sollten nicht auf diese Weise verwendet werden.

Wenn Sie mit einer Konfigurationsdatei arbeiten wollen, fügen Sie am besten eine Beispiel- oder Vorlagendatei hinzu und lassen sie dann entweder vom Benutzer an die richtige Stelle kopieren oder ein Skript die entsprechende Datei erstellen. Sie sollten dann den Speicherort der eigentlichen Konfigurationsdatei ignorieren und nur das Beispiel oder die Vorlage einchecken.

2voto

Eugene Punkte 57741

Für IntelliJ IDEA-Benutzer: Wenn Sie Änderungen an einer Datei (oder mehreren Dateien) ignorieren möchten, können Sie sie in einen anderen Change Set .

  • Gehen Sie rüber zu Local Changes ( Cmd + 9 )
  • Wählen Sie die Datei(en), die Sie ignorieren möchten
  • F6 um sie an einen anderen Ort zu verschieben Change Set

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X