Machen Sie git Highlight-Tab-Zeichen in einem Diff?

Lesezeit: 7 Minuten

Ich versuche sicherzustellen, dass ich keinen Code übertrage, der Tabulatorzeichen zum Einrücken verwendet. Dies ist eine weiche Einschränkung, die ich auf meine eigenen Commits anwende (im Moment haben wir keinen Standard für Einrückungszeichen, aber ich würde gerne Leerzeichen verwenden, da es keine Meinungsverschiedenheiten über die Breite eines Leerzeichens gibt, aber einige Benutzer verwenden Breite-4-Tabs im Vergleich zu Breite-8-Tabs).

Der einfachste Weg, solche Einschränkungen zu überprüfen, besteht oft darin, sich jedes Mal, wenn Sie einen Commit durchführen möchten, die tatsächliche Ausgabe von git diff anzusehen und zu sehen, ob es irgendwelche Probleme gibt. Zum Beispiel werden für mich nachgestellte Leerzeichen standardmäßig hervorgehoben und Windows-Zeilenumbrüche sind auch im Diff sichtbar. Wenn ich also versehentlich Code mit nachgestelltem Leerzeichen übergebe, werde ich darauf aufmerksam gemacht. Gibt es eine Möglichkeit, Tabulatorzeichen auch in Git Diff anzuzeigen?

Benutzer-Avatar
Chris Johnsen

Git lernte das tab-in-indent Whitespace-Kategorie in 1.7.2 (21. Juli 2010).
Aus Dokumentation/RelNotes/1.7.2.txt:

  • Die in „git apply –whitespace“ und „git diff“ verwendeten Whitespace-Regeln haben ein neues Mitglied in der Familie (tab-in-indent) erhalten, um Projekten mit Richtlinien zu helfen, nur mit Leerzeichen einzurücken.

Sie wird auf die gleiche Weise gesteuert und verwendet wie die anderen Optionen zum Prüfen von Leerzeichen.

Die Hervorhebung im git diff ist dasselbe wie die anderen Leerzeichenfehler.
Überprüfung ist verfügbar mit git diff --check.
Und so weiter.

Hinzufügen tab-in-indent zum Wert der core.whitespace Konfigurationsvariable, um sie zu aktivieren (wahrscheinlich entweder in einem oder mehreren spezifischen Repositories oder in Ihrer „globalen“ (pro Verwendung) Konfiguration).

set-show-tabs() {
    global=
    test "$1" = -g || test "$1" = --global && global=--global
    cws=$(git config $global core.whitespace)
    case "$cws" in
        tab-in-indent,*|*,tab-in-indent|*,tab-in-indent,*) ;;
        *) git config $global core.whitespace "$cws"${cws:+,}tab-in-indent ;;
    esac
}
set-show-tabs           # only in local repository
set-show-tabs --global  # for all your Git activities
# or just edit it manually with "git config [--global] --edit"

Oder Sie können es für einzelne Befehle festlegen (git -c ist auch von 1.7.2):

git -c core.whitespace=tab-in-indent diff --check

Sie könnten so etwas in a verwenden pre-commit Hook, um nach Registerkarten zu suchen, ohne dass es in einer Ihrer tatsächlichen Repository-Konfigurationsdateien enthalten ist.

  • Ich bin mir sicher, dass es so funktioniert, wie @jonderry wollte, aber es nimmt nur Tabulatoren zum Einrücken auf, keine Tabulatoren, die in der Mitte einer Zeile eingebettet sind. Wenn Sie eine Richtlinie “überhaupt keine Tabs” hatten, finden Sie meine Antwort möglicherweise hilfreich.

    – Matt Curtis

    8. April 2011 um 21:52 Uhr

  • Aus irgendeinem Grund werden alle Tabulatorzeichen mit roter Farbe gerendert. Gibt es eine Möglichkeit, sie dazu zu bringen, sich so zu verhalten? color.diff.new und color.diff.old?

    – rr-

    26. Juni 2015 um 21:23 Uhr

  • @rr-: Das ist einer der Effekte des Puttens tab-in-indent in core.whitespace. Wenn Sie nicht möchten, dass die Registerkarten speziell hervorgehoben werden, entfernen Sie sie einfach aus Ihrer Konfiguration (sie ist standardmäßig nicht aktiviert, sodass sie in einer Ihrer Konfigurationsdateien sichtbar ist, z git config --edit oder git config --edit --global). Wenn Sie die Hervorhebung ändern möchten, siehe color.diff.whitespace (obwohl es wie die rote Hervorhebung in den „alten“ und „neuen“ Abschnitten dieselbe Farbe hat).

    – Chris Johnsen

    26. Juni 2015 um 23:42 Uhr

  • Ich möchte, dass führende Tabulatoren genauso hervorgehoben werden wie führende Leerzeichen in Diffs; Im Moment kann ich ihnen nur eine bestimmte Farbe geben (das ist nicht kompatibel mit old und new) wie du gesagt hast. Ich frage mich, warum ist das so? Ich meine, warum werden Tabulatoren besonders behandelt (und das werden sie, sonst würden sie wie jeder andere Text hervorgehoben), sogar anders als normale Leerzeichen?

    – rr-

    27. Juni 2015 um 6:55 Uhr


  • @rr-: Die Verwendung einer einzigen Farbe für die Hervorhebung von Leerzeichenfehlern war wahrscheinlich eine Designentscheidung, um die Dinge einfach zu halten. Der Teil über das niemals Hervorheben von Registerkarten (auch mit -tab-in-indent; und Leerzeichen vor Tabulatoren mit -space-before-tab) kann ein Fehler oder nur ein Implementierungsdetail sein. Git 2.5.0 wird haben --ws-error-highlight=none Dadurch wird die Hervorhebung von Leerzeichenfehlern vollständig deaktiviert, sodass diese Tabulatoren (und Leerzeichen vor der Tabulatortaste) genau wie der Rest der „neuen“ und „alten“ Zeile gefärbt bleiben.

    – Chris Johnsen

    27. Juni 2015 um 9:11 Uhr

Benutzer-Avatar
Matt Curtis

So suchen Sie Zeilen mit Tabulatoren:

git grep -n --cached 'LITERAL TAB HERE'

In bash oder zsh können Sie mit einen wörtlichen Tabulator eingeben Strg-V Strg-I. Dieser Befehl zeigt Ihnen alle Dateien + Zeilen mit Tabulatoren.

Wenn Sie Ihre Richtlinie durchsetzen möchten, indem Sie ein Commit mit Tabs verhindern, fügen Sie dies ein .git/hooks/pre-commit und markiere es als ausführbar (chmod +x):

#!/bin/sh
allowtabs=$(git config hooks.allowtabs)
if [ "$allowtabs" != "true" ] &&
   git diff --cached | egrep '^\+.* '>/dev/null
then
   cat<<END;
Error: This commit would contain a tab, which is against this repo's policy.

If you know what you are doing you can force this commit with:

  git commit --no-verify

Or change the repo policy like so:

  git config hooks.allowtabs true
END
  exit 1
fi

Dazwischen steht ein wörtlicher Tabulator * und die ' auf der git diff --cached | egrep Linie. Sie können dies in Vim mit bekommen Strg-V Strg-Ioder Emacs mit Cq Ci.

Es sucht nach einer neuen Zeile im Diff (beginnend mit “+”), die einen Tabulator enthält. Du könntest die setzen git grep Zeile in der Fehlermeldung, wenn Sie die störenden Tabulatoren im Hook anzeigen möchten.

Ich habe diesen Hook auf github gesetzt hier.

  • Aus irgendeinem Grund kann egrep keine Zeilen finden, wenn ich die Zeilenanfangszeichenfolge „^“ einfüge, aber es findet die relevanten Zeilen, wenn ich das „^“ entferne. Wissen Sie, warum dies der Fall sein könnte?

    – Scherz

    7. April 2011 um 1:04 Uhr

  • Ich habe herausgefunden, warum ‘^’ bei mir nicht funktioniert. Ich glaube, sed versucht, den Farbcode in der hinzugefügten Zeile abzugleichen, die dem ‘+’ am Anfang der Zeile vorangeht. Gibt es eine einfache Möglichkeit, damit umzugehen?

    – Scherz

    7. April 2011 um 2:27 Uhr

  • Um die volle Wirkung zu erzielen, habe ich letztendlich Folgendes getan: git diff --cached | sed -e "s/^\(^[\[32m+\)[^\t]*\(\t\+\)/\\1${red_bg}\\2${norm_bg}/g" wo ^[ is a raw escape (C-q ESC in emacs) with norm_bg=$(tput sgr0) and red_bg=$(tput setab 1) as per stackoverflow.com/questions/5575109/…

    – jonderry

    Apr 7, 2011 at 4:50


  • @jonderry Very nice! Colors draw your eye to exactly the right spot.

    – Matt Curtis

    Apr 7, 2011 at 6:14

  • I’ve added a link to the hook on github which contains the tabs in the right spot: github.com/mrc/git-hook-library/blob/master/pre-commit.no-tabs – by the way I think your issue about “+” may be because you’re using color “always” and I have color “auto” – looks like you solved it anyway, nicely done 🙂

    – Matt Curtis

    Apr 7, 2011 at 7:55

I have made a pre-commit hook that stops you from committing tab-indented code https://github.com/martinjoiner/portable-code-pre-commit-hook it looks like this…

enter image description here

I routinely use it on all my projects now. Feel free to use it yourself.

I work on a team that write code in a mix of Mac, Windows and Linux environments as well as reviewing it in-browser via the Github website. The team are really happy to have a helping hand checking their code so it looks consistent across all those places.

If you find any problems please let me know, I’d like the chance to improve any weaknesses. Thanks.

One way of making tabulation characters visible is to replace them with something that’s noticeable, for example .        (that’s a dot followed by seven spaces). This can be achieved by substituting pager in your configuration to add invocation of sed. Like this:

[core]
    pager = sed 's/\t/.  /g' |  weniger -R

Beispiel

Ohne benutzerdefinierten Pager:

         for (int i = 0; i < 3; ++i) {
-        for (int h = 0; h < 4; ++h) {
+                for (int h = 0; h < 4; ++h) {
                         for (int k = 0; k < 4; ++k) {

Mit benutzerdefiniertem Pager:

 .       for (int i = 0; i < 3; ++i) {
-        for (int h = 0; h < 4; ++h) {
+.       .       for (int h = 0; h < 4; ++h) {
 .       .       .       for (int k = 0; k < 4; ++k) {

1158380cookie-checkMachen Sie git Highlight-Tab-Zeichen in einem Diff?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy