Сделать git выделение символов вкладки в diff?
Я пытаюсь обеспечить, чтобы я не выполнял код, который использует символы табуляции для отступов. Это мягкое ограничение, которое я применяю к своим собственным коммитам (прямо сейчас у нас нет стандарта для символов отступа, но я бы хотел использовать пробелы, так как нет никаких разногласий по ширине пробела, но некоторые люди используют ширину-4 вкладки против ширины-8 вкладок).
Самый простой способ проверить такие ограничения - часто смотреть на фактический вывод git diff каждый раз, когда вы собираетесь совершить сделку, и посмотреть, есть ли какие-либо проблемы. Например, для меня по умолчанию выделение конечных пробелов выделено, а также строки Windows newline также видны в diff, поэтому, если я собираюсь случайно выполнить код с завершающим пробелом, я буду предупрежден об этом. Есть ли способ сделать символы табуляции также отображаться в git diff?
Ответы
Ответ 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) {