这个预提交钩子如何修复尾随空格?

时间:2010-04-20 17:51:26

标签: git hook pre-commit-hook pre-commit

this pre-commit hook发生了什么?我认为更改文件会导致它们重新开始。

#!/bin/sh
#
# A git hook script to find and fix trailing whitespace
# in your commits. Bypass it with the --no-verify option
# to git-commit
#

if git-rev-parse --verify HEAD >/dev/null 2>&1 ; then
    against=HEAD
else
    # Initial commit: diff against an empty tree object
    against=4b825dc642cb6eb9a060e54bf8d69288fbee4904
fi
# Find files with trailing whitespace
for FILE in `exec git diff-index --check --cached $against -- | sed '/^[+-]/d' | sed -r 's/:[0-9]+:.*//' | uniq` ; do
    # Fix them!
    sed -i 's/[[:space:]]*$//' "$FILE"
done

# Now we can commit
exit

我认为这个想法是删除此提交所涉及的所有文件中的尾随空格。

3 个答案:

答案 0 :(得分:3)

除非这不起作用。我已经尝试在我的预提交挂钩结束时执行以下操作:

exec git diff-index --check --cached $against --

但是在这些钩子中所做的更改实际上仍未实现(至少在git 1.7.3.4中)。

如果您确实希望更改进入,则必须明确

git add "$file"

为您在预提交阶段修改的每个文件。

答案 1 :(得分:2)

关键是提交正确的内容,即:

  • 只有阶段(并添加到索引)
  • 加上pre-commit hook引入的一些修改

第一点是通过git diff-index

实现的
  

将通过树对象找到的blob的内容和模式与当前索引的内容进行比较,并可选择忽略磁盘上文件的stat状态。

exec git diff-index --check --cached $against --

选项--cached

  

根本不考虑磁盘文件

然后将任何修改考虑为新提交的一部分。

您可以查看source of commit.c

static int prepare_to_commit(const char *index_file, const char *prefix,
                 struct wt_status *s)
{
...

    if (!no_verify && run_hook(index_file, "pre-commit", NULL))
        return 0;
...


/*
 * Re-read the index as pre-commit hook could have updated it,
 * and write it out as a tree.  We must do this before we invoke
 * the editor and after we invoke run_status above.
 */
discard_cache();
read_cache_from(index_file);

答案 2 :(得分:0)

可以这样做,但需要一个棘手的脚本。

在这里你可以找到解决的同样问题。在那里,它是在每次提交时更新文件版本,而不是在空间中填充。它完全有效: https://github.com/addonszz/Galileo/tree/master/githooks

然后,您只需使用'Trilling Spaces'算法替换文件'updateVersion.sh'上的'版本文件替换'算法。也许您需要更改一些内容,例如删除分支限制,因为在那里,只有在“develop”分支上才会运行脚本。

此外,它只会更改文件,如果是暂存的话。如果文件没有暂存,那么它什么都不做。更确切地说,它打印出每一步都在做什么。