2009-10-17 11 views
29

Was ist es für ein VCS, mit dem ich mich Sorgen mache, was ich in meine Dateien hineinlege? Ich verstehe nicht, was der Punkt hier ist. Ist Git Versionskontrolle oder Syntax Checker?Warum kümmert sich git um nachgestellte Leerzeichen in meinen Dateien?

+0

Siehe auch http://stackoverflow.com/a/30803980/6309, zwischen „alten“ Leerzeichen Fehler von früheren eingeführt zu unterscheiden Commits und neue, die durch den aktuellen Staging-Code für das nächste Commit eingeführt werden. – VonC

Antwort

28

Es ist, weil eine der sehr verbreiteten Anwendungen für Git das Senden von Patch-Serien per E-Mail ist. Nachgestellte Leerzeichen verursachen Probleme in der E-Mail und werden daher normalerweise entfernt. Das bedeutet, dass alle nachfolgenden Leerzeichen verloren gehen, wenn der Patch per E-Mail gesendet und angewendet wird. Dies bedeutet wiederum, dass bei der Verwendung von abschließenden Leerzeichen in den Zeilen im Repo, nicht jedoch beim Patch, bei der Anwendung eines Patches falsche Konflikte oder zusätzliche Änderungen auftreten, die nicht beabsichtigt waren.

Dieser Pre-Commit-Hook war standardmäßig aktiviert, ist aber nicht mehr. Es scheint, ich habe mich falsch erinnert; it was never deliberately enabled by default. Wie andere bereits festgestellt haben, war dies immer ein Beispiel für einen Pre-Commit-Hook; Früher wurde es deaktiviert, indem man es nicht das Execute-Bit gab, aber das ist etwas, das ziemlich leicht vermasselt werden kann (zum Beispiel unter Cygwin unter Windows), so dass in neueren Versionen von Git (seit over a year ago) die Beispiele deaktiviert wurden genannt pre-commit.sample. Sie können Ihre .git/hooks/pre-commit löschen oder verschieben, um zu verhindern, dass dieser Hook ausgeführt wird, wenn Ihnen das Verhalten nicht gefällt. Sie sollten Ihr Git auch auf etwas Neuere aktualisieren, da dies bereits seit einiger Zeit behoben ist.

+0

Das ist nur dumm, das war standardmäßig aktiviert. Idiotisch wirklich. –

+8

Es ** ist nicht standardmäßig aktiviert **. – hobbs

+2

Entschuldigung; Ich irrte mich durch die Tatsache, dass ich viele Male davon gebissen wurde, aber ich merke jetzt, dass es immer unter Cygwin war. –

11

Git interessiert überhaupt nicht. Der Beispiel Pre-Commit-Hook führt eine Whitespace-Überprüfung durch, um zu demonstrieren, wie ein Hook geschrieben wird, aber ist standardmäßig nicht aktiviert. Sie müssen es ausführbar machen, damit es etwas tun kann.

3

Wie Hobbs schrieb, kann der Beispiel-Pre-Commit-Hook eine Überprüfung auf nachfolgende Leerzeichen durchführen. Um es zu deaktivieren, schauen Sie in .git/hooks und stellen Sie sicher, dass die Dateien dort nicht ausführbar sind.

Eine mögliche Möglichkeit, dass die Hooks aktiviert wurden, ist, dass das ausführbare Bit möglicherweise gesetzt wurde, wenn Sie Ihr Repo auf einem FAT-formatierten Flash-Laufwerk bewegen.

+0

Aus diesem Grund verwenden Beispiel-Hooks in neueren Versionen das Suffix ".sample", anstatt keine ausführbaren Berechtigungen zu haben. –

4

Warum? Weil nachfolgende Leerzeichen leicht verloren gehen, was zu falschen Änderungen und zu nicht angewendeten Patches führt (wegen der Änderung des Weißraums). Es ist eine Frage der Übereinstimmung mit Programmierung Stil.

Das sagte, es ist eine Frage von pre-commithook: Sie können es bearbeiten oder deaktivieren, oder konfigurieren Sie nachfolgende Leerzeichen (vielleicht nur für einige Arten von Dateien), um nicht als ein Fehler betrachtet werden.


Der pre-commit Haken sollte deaktiviertstandardmäßig, aber ältere Versionen (vor 1.6.0) werden verwendet, um sie, indem ausführbare Berechtigungen ausgeschaltet, die auf nicht möglicherweise nicht ausgeschaltet zu installieren -UNIX Dateisysteme wie FAT; Ab 1.6.0 werden sie deaktiviert (deaktiviert), indem das Suffix ".sample" angehängt wird.

+1

Ja nun, ich brauche keine git-Entwickler, die mir sagen, was sie oder er für einen guten Programmierstil hält, dem ich mich anpassen muss. Wenn ich etwas wie jslint haben möchte, bekomme ich etwas wie jslint. Ich möchte nicht, dass mein VCS das tut, das ist dumm. Wenn es ein Problem mit unechten Änderungen hat und keine Patches angewendet wurden, dann ist das ein Problem mit GIT, nicht mit meinem Code. –

+0

Es ** ist nicht standardmäßig aktiviert **. – hobbs

+0

@Apphacker: Die standardmäßig verwendeten Vorab-Hooks beziehen sich auf * das Senden von Patches per E-Mail *, nicht so sehr auf den Programmierstil. –

0

Es ist keine Frage von VCS zu versuchen, Ihnen zu sagen, was guter Programmierstil ist. Es ist eine Sache, dass nachfolgende Leerzeichen für sie eine schlechte Sache sind, da nachfolgende Leerzeichen als eine nutzlose Modifikation durch das VCS betrachtet werden können.

Wie so?

Stellen Sie eine Zeile wie diese haben:

puts "Hello World"^M^M^M 

Wo jedes „^ M“ ist ein nachfolgendes Leerzeichen (es zu vereinfachen gestellt).

Ein anderer Entwickler versehentlich ändert dies wie folgt aus:

puts "Hello World"^M^M 

Der VCS dies als eine Änderung sehen. Ein nutzloser, der den Code überhaupt nicht stört, sondern eine Veränderung. Auf diese Art von Veränderung kann das VCS sogar als Konflikt hinweisen (was möglichst vermieden werden sollte). Außerdem verschmutzt es deine Geschichte ohne Notwendigkeit.

Verwandte Themen