Подтвердить что ты не робот

Сделать git выделение символов вкладки в diff?

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

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

4b9b3361

Ответ 1

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

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

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

Выделение в git diff совпадает с другими ошибками пробела.
Проверка доступна с помощью git diff --check.
Et cetera.

Добавьте 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

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

Ответ 2

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

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 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 с C-q C-i.

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

Я положил этот крюк на github здесь.

Ответ 3

Я сделал крюк pre-commit, который мешает вам совершать код с записями с вкладками https://github.com/martinjoiner/portable-code-pre-commit-hook, он выглядит так...

введите описание изображения здесь

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

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

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

Ответ 4

Один из способов сделать видимыми символы табуляции - заменить их чем-то заметным, например .        (точка, за которой следует семь пробелов). Этого можно добиться, заменив пейджер в вашей конфигурации, чтобы добавить вызов 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) {