22

我试图确保我不会提交使用制表符进行缩进的代码。这是我应用于我自己的提交的软约束(现在我们没有缩进字符的标准,但我想使用空格,因为在空格的宽度上没有分歧,但有些人们使用宽度为 4 的选项卡与宽度为 8 的选项卡)。

检查此类约束的最简单方法通常是在每次提交时查看 git diff 的实际输出,看看是否有任何问题。例如,对我来说,默认情况下,尾随空格是突出显示的,并且窗口换行符在差异中也可见,所以如果我要不小心提交带有尾随空格的代码,我会收到警报。有没有办法让制表符也出现在 git diff 中?

4

4 回答 4

26

Gittab-in-indent在 1.7.2(2010 年 7 月 21 日)中学习了空白类别。
Documentation/RelNotes/1.7.2.txt

  • “git apply --whitespace”和“git diff”中使用的空白规则在家族中获得了一个新成员(tab-in-indent),以帮助项目仅使用空格缩进。

它的控制和使用方式与其他空白检查选项相同。

中的突出显示git diff与其他空白错误相同。
可使用 进行检查git diff --check
等等。

添加tab-in-indentcore.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挂钩中使用类似的东西来检查选项卡,而无需在任何实际的存储库配置文件中使用它。

于 2011-04-07T08:32:34.027 回答
12

要定位带制表符的行:

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-IEmacs 中使用C-q C-i.

它的作用是在包含选项卡的 diff 中查找新行(以“+”开头)。git grep如果您想在钩子中显示有问题的选项卡,您可以将该行放在错误消息中。

我在这里把这个钩子放在github上。

于 2011-04-07T00:07:32.087 回答
0

我做了一个预提交钩子,阻止你提交制表符缩进的代码https://github.com/martinjoiner/portable-code-pre-commit-hook它看起来像这样......

在此处输入图像描述

我现在经常在我所有的项目中使用它。随意使用它自己。

我在一个团队中工作,该团队在 Mac、Windows 和 Linux 环境的混合环境中编写代码,并通过 Github 网站在浏览器中对其进行审查。团队真的很高兴能帮助检查他们的代码,因此所有这些地方的代码看起来都是一致的。

如果您发现任何问题,请告诉我,我希望有机会改进任何弱点。谢谢。

于 2017-06-06T09:46:54.067 回答
0

使制表符可见的一种方法是将它们替换为引人注目的内容,例如.       (即一个点后跟七个空格)。这可以通过在配置中替换 pager 来添加对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) {
于 2017-07-16T15:08:47.937 回答