Сделать git подсветкой символов табуляции в diff? - PullRequest
21 голосов
/ 07 апреля 2011

Я пытаюсь убедиться, что я не фиксирую код, который использует символы табуляции для отступа. Это мягкое ограничение, которое я применяю к своим собственным коммитам (сейчас у нас нет стандарта для символов отступа, но я бы хотел использовать пробелы, так как нет разногласий по ширине пробела, но некоторые люди используют вкладки шириной-4 и шириной-8).

Самый простой способ проверить такие ограничения - это часто просматривать фактический вывод git diff каждый раз, когда вы собираетесь зафиксировать, и видеть, есть ли какие-либо проблемы. Например, для меня, по умолчанию, конечные пробелы выделены, и новые строки окна также видны в diff, поэтому, если я собираюсь случайно зафиксировать код с конечными пробелами, я буду предупрежден об этом. Есть ли способ сделать так, чтобы символы табуляции также отображались в git diff?

Ответы [ 4 ]

25 голосов
/ 07 апреля 2011

Git изучил категорию пробелов tab-in-indent в 1.7.2 (21 июля 2010 г.).
От Документация / RelNotes / 1.7.2.txt :

  • Правила пробелов, используемые в "git apply --whitespace" и "git diff" получил нового члена в семье (вкладка в отступе), чтобы помочь проектам с политика для отступа только с пробелами.

Он контролируется и используется так же, как и другие параметры проверки пробелов.

Подсветка в git diff такая же, как и в других ошибках пробела.
Проверка доступна с git diff --check.
И так далее.

Добавьте tab-in-indent к значению переменной конфигурации core.whitespace, чтобы включить ее (возможно, в одном или нескольких определенных репозиториях или в вашей «глобальной» (для использования) конфигурации).

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"

Или вы можете установить его для отдельных команд (git -c также из 1.7.2):

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

Вы можете использовать что-то вроде этого в pre-commit хуке, чтобы проверить наличие вкладок, не имея его ни в одном из ваших реальных файлов конфигурации репозитория.

11 голосов
/ 07 апреля 2011

Чтобы найти строки с вкладками:

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

В bash или zsh вы можете ввести буквенную вкладку с помощью Ctrl-V Ctrl-I .Эта команда покажет вам все файлы + строки с вкладками.

Если вы хотите применить свою политику, запретив коммит с вкладками, укажите это в .git/hooks/pre-commit и отметьте его как исполняемый (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

Существует буквальная вкладка между * и ' в строке git diff --cached | egrep.Вы можете получить это в Vim с помощью Ctrl-V Ctrl-I или Emacs с Cq Ci .

Что он делает, так это ищет новую строку в diff (начиная с «+»), которая содержит вкладку.Вы можете поставить строку git grep в сообщении об ошибке, если хотите показать мешающие вкладки в хуке.

Я поставил этот хук на github здесь .

0 голосов
/ 16 июля 2017

Один из способов сделать символы табуляции видимыми - заменить их чем-нибудь заметным, например . (это точка, за которой следуют семь пробелов).Это может быть достигнуто путем замены пейджера в вашей конфигурации, чтобы добавить вызов sed.Например:

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

Пример

Без пользовательского пейджера:

         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) {

С пользовательским пейджером:

 .       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) {
0 голосов
/ 06 июня 2017

Я сделал хук перед фиксацией, который останавливает вас от фиксации кода с отступом табуляции https://github.com/martinjoiner/portable-code-pre-commit-hook это выглядит так ...

enter image description here

Сейчас я обычно использую его во всех своих проектах. Не стесняйтесь использовать его самостоятельно.

Я работаю в команде, которая пишет код в различных средах Mac, Windows и Linux, а также просматривает его в браузере на веб-сайте Github. Команда очень рада, что ее помощник проверяет свой код, поэтому он выглядит одинаково во всех этих местах.

Если вы обнаружите какие-либо проблемы, пожалуйста, дайте мне знать, я бы хотел улучшить ваши слабые стороны. Спасибо.

...