Wie kann Git eine Datei als binär behandeln?

104

Ein Problem mit einem mittelgroßen Projekt, bei dem Visual Studio-Projektdateien immer wieder Probleme haben, weil Git sie als Text behandelt und zusammenführt. Ich möchte die Datei einfach als binär festlegen, damit git diese Dateien niemals automatisch zusammenführt.

Gibt es eine Möglichkeit, dies zu tun?

Charles Randall
quelle
2
Aber Visual Studio-Projektdateien sind Textdateien und müssen zusammengeführt werden?
CB Bailey
1
@CharlesBailey Sie werden in regelmäßigen Abständen auf die schlechteste Art und Weise zusammengeführt und alle Ihre Builds vermasselt. Ich möchte nicht mit dem XML herumspielen, ich möchte, dass ich aufgefordert werde, neue Dateien manuell hinzuzufügen oder möglicherweise sogar ein XML-differenzierendes Tool auszuführen, das weiß, wie man das richtig handhabt.
michael.bartnett
1
@ michael.bartnett: Nur wenn du die Zusammenführung durcheinander bringst, sicher?
CB Bailey
1
@ CharlesBailey Natürlich ist es kein Problem, wenn ich manuell zusammenführe. Aber das sollte ich nicht manuell zusammenführen müssen. Es ist normalerweise ein Build-Element zum Hinzufügen / Entfernen / Bearbeiten ... das vollständig automatisch zusammengeführt werden kann, jedoch nicht mit der üblichen Diff-per-Line-Methode. In dieser Präsentation erfahren Sie mehr über diesen Begriff.
michael.bartnett
@ michael.bartnett: Dann richte einen besseren Merge-Treiber ein. Der Punkt, den ich (vor 10 Monaten) gemacht habe, war, dass Projektdateien zusammengeführt werden können und sollten. Persönlich ziehe ich es vor, einen vernünftigen Maschinenversuch zu reparieren, als ihn vollständig von Hand zu machen, was als unnötige Arbeit erscheint.
CB Bailey

Antworten:

135

Ja, mit Attributen . Fügen Sie so etwas in Ihre .gitattributesDatei ein (erstellen Sie es, wenn es nicht vorhanden ist):

*.sln binary
*.suo binary
*.vcxproj binary

Hier binaryist tatsächlich ein vordefiniertes Makro , das äquivalent zu ist -diff -merge -text.

Wenn Sie den Unterschied weiterhin sehen möchten, können Sie Folgendes verwenden:

*.sln -merge -text

Auf diese Weise werden die *.slnDateien nicht zusammengeführt, nicht normalisiert, sondern mittlerweile diffus.

Michael Wild
quelle
1
Wo ist diese Datei?
Neves
@neves Überall kann eine Gitignore-Datei gefunden werden, wie in der Dokumentation angegeben, die über den Link in der angegebenen Antwort bereitgestellt wird.
Michael Wild
4
@neves: Sie müssen eine erstellen, entweder lokal in Ihrem Repo oder global als z. B. ~/.gitattributesund dann ausführen , git config --global core.attributesfile ~/.gitattributessiehe stackoverflow.com/questions/28026767/…
jan-glx
Was passiert mit diesen Dateien, wenn sie nicht automatisch zusammengeführt werden? Ist eine Version ausgewählt oder müssen Sie manuell zusammenführen?
ClydeTheGhost
1
@ClydeTheGhost müssen Sie eine auswählen.
Michael Wild
6

Sie sollten Binärdateiattribute in Ihrer .gitattributesDatei definieren (erstellen Sie sie, wenn sie nicht vorhanden ist), indem Sie diese Zeilen einfügen, um zu verhindern, dass sie als Textdiff-Datei behandelt werden:

# Define binary file attributes.
# - Do not treat them as text.
# - Include binary diff in patches instead of "binary files differ."
*.sln     -text diff
*.suo     -text diff
*.vcxproj -text diff
*.gif     -text diff
*.gz      -text diff
*.ico     -text diff
*.jpeg    -text diff   
Omar Alahmed
quelle