Wie mache ich
git-Status
zeilenende-Unterschiede ignorieren?
Hintergrundinformation:
Ich benutze zufällig Windows und Linux, um an dem Projekt zu arbeiten. Das Projekt befindet sich in Dropbox.
Ich habe viel darüber gefunden, wie man git diff Zeilenenden ignoriert. Da ich meld git diff verwende, öffnet sich meld für jede Datei. Und meld sagt "identische Datei".
Wie vermeide ich das? Git sollte meld nur für geänderte Dateien öffnen ... und git status sollte Dateien nicht als geändert melden, wenn sich nur die Dateiendung unterscheidet.
BEARBEITEN: Ursache:
Dies geschah aufgrund dieser Einstellung unter Windows
core.autocrlf wahr
Also habe ich die Arbeitskopie unter Linux ausgecheckt und core.autocrlf unter Windows auf false gesetzt.
Es wäre immer noch schön zu wissen, wie man git status dazu bringt, verschiedene neue Zeilen zu ignorieren.
Legen Sie den Wert für core.autocrlf wie folgt fest:
git config --global core.autocrlf true
Verwenden Sie stattdessen .gitattributes mit der folgenden Einstellung:
# Ignore all differences in line endings
* -crlf
.gitattributes befinden sich in demselben Verzeichnis wie Ihre globale .gitconfig. Wenn .gitattributes nicht vorhanden ist, fügen Sie es diesem Verzeichnis hinzu. Nach dem Hinzufügen/Ändern von .gitattributes müssen Sie das Repository zurücksetzen, um die Änderungen erfolgreich auf vorhandene Dateien anzuwenden.
Problem bezogen auf git-Befehle unter Windows-Betriebssystemen:
$ git add --all
warnung: LF wird durch CRLF in ... ersetzt.
Die Datei hat die ursprünglichen Zeilenenden in Ihrem Arbeitsverzeichnis.
Auflösung :
$ git config --global core.autocrlf false
$ git add --all
Es werden keine Warnmeldungen angezeigt.
Ich benutze Windows und Linux, aber die Lösung core.autocrlf true
hat mir nicht geholfen. Ich habe sogar nach git checkout <filename>
nichts verändert.
Also benutze ich Workaround, um git status
zu ersetzen - gitstatus.sh
#!/bin/bash
git status | grep modified | cut -d' ' -f 4 | while read x; do
x1="$(git show HEAD:$x | md5sum | cut -d' ' -f 1 )"
x2="$(cat $x | md5sum | cut -d' ' -f 1 )"
if [ "$x1" != "$x2" ]; then
echo "$x NOT IDENTICAL"
fi
done
Ich vergleiche einfach md5sum
einer Datei und ihres Bruders im Repository.
Beispielausgabe:
$ ./gitstatus.sh
application/script.php NOT IDENTICAL
application/storage/logs/laravel.log NOT IDENTICAL
Ich habe ein Skript erstellt, um Unterschiede in den Zeilenenden zu ignorieren:
Es werden die Dateien angezeigt, die nicht zur Festschreibungsliste hinzugefügt wurden und geändert wurden (nachdem Unterschiede in den Zeilenenden ignoriert wurden). Sie können das Argument "hinzufügen" hinzufügen, um diese Dateien zu Ihrem Commit hinzuzufügen.
#!/usr/bin/Perl
# Usage: ./gitdiff.pl [add]
# add : add modified files to git
use warnings;
use strict;
my ($auto_add) = @ARGV;
if(!defined $auto_add) {
$auto_add = "";
}
my @mods = `git status --porcelain 2>/dev/null | grep '^ M ' | cut -c4-`;
chomp(@mods);
for my $mod (@mods) {
my $diff = `git diff -b $mod 2>/dev/null`;
if($diff) {
print $mod."\n";
if($auto_add eq "add") {
`git add $mod 2>/dev/null`;
}
}
}
Quellcode: https://github.com/lepe/scripts/blob/master/gitdiff.pl
Aktualisierung:
Diese Antwort erscheint relevant, da das OP auf die Notwendigkeit einer Lösung mit mehreren Betriebssystemen verweist. In diesem Github Hilfeartikel werden die verfügbaren Ansätze für die Behandlung von Zeilenenden OS-übergreifend beschrieben. Es gibt globale Ansätze und Pro-Repo-Ansätze zum Verwalten von Cross-OS-Zeilenenden.
Globaler Ansatz
Konfigurieren Sie die Handhabung der Git-Zeilenenden unter Linux oder OS X:
git config --global core.autocrlf input
Konfigurieren Sie die Verarbeitung der Git-Zeilenenden unter Windows:
git config --global core.autocrlf true
Pro-Repo-Ansatz:
Erstellen Sie im Stammverzeichnis Ihres Repos eine .gitattributes
-Datei und definieren Sie die Zeilenendeeinstellungen für Ihre Projektdateien Zeile für Zeile im folgenden Format: path_regex line-ending-settings
Dabei ist line-ending-settings
eine der folgenden:
Der text
-Wert kann weiter konfiguriert werden, um Git mitzuteilen, wie Zeilenenden für übereinstimmende Dateien behandelt werden:
text
- Ändert Zeilenenden in native OS-Zeilenenden.text eol=crlf
- Konvertiert Zeilenenden in CRLF
an der Kasse.text eol=lf
- Konvertiert Zeilenenden in LF
an der Kasse.text=auto
- Vernünftige Standardeinstellung, bei der das Line Handle im Ermessen von Git bleibt.Hier ist der Inhalt einer Beispieldatei .gitattributes:
# Set the default behavior for all files.
* text=auto
# Normalized and converts to
# native line endings on checkout.
*.c text
*.h text
# Convert to CRLF line endings on checkout.
*.sln text eol=crlf
# Convert to LF line endings on checkout.
*.sh text eol=lf
# Binary files.
*.png binary
*.jpg binary
Weitere Informationen zum Aktualisieren Ihres Repos nach dem Ändern der Zeilenendeinstellungen hier . Tldr:
sichern Sie Ihre Dateien mit Git, löschen Sie jede Datei in Ihrem Repository (mit Ausnahme des Verzeichnisses .git) und stellen Sie dann alle Dateien auf einmal wieder her. Speichern Sie Ihre aktuellen Dateien in Git, damit Ihre Arbeit nicht verloren geht.
git add . -u
git commit -m "Saving files before refreshing line endings"
Entfernen Sie den Index und zwingen Sie Git, das Arbeitsverzeichnis erneut zu durchsuchen.
rm .git/index
Schreiben Sie den Git-Index neu, um alle neuen Zeilenenden zu erfassen.
git reset
Zeigt die umgeschriebenen, normalisierten Dateien an.
In einigen Fällen ist dies alles, was getan werden muss. Andere müssen möglicherweise die folgenden zusätzlichen Schritte ausführen:
git status
Fügen Sie alle Ihre geänderten Dateien wieder hinzu und bereiten Sie sie für ein Commit vor. Dies ist Ihre Chance zu überprüfen, welche Dateien, falls vorhanden, unverändert waren.
git add -u
Es ist absolut sicher, dass hier viele Meldungen angezeigt werden, die lesen [s] "Warnung: CRLF wird durch LF in der Datei ersetzt."
Schreiben Sie die .gitattributes-Datei neu.
git add .gitattributes
Übernehmen Sie die Änderungen in Ihrem Repository.
git commit -m "Normalize all the line endings"