如何lint提交,而不是工作目录?

时间:2017-10-16 23:40:36

标签: git eslint lint pre-commit-hook

我有一个恼人的问题。我们正在运行linting作为预提交钩子。问题是它是linting工作目录而不是实际的提交。这有两个问题:

  1. 承诺很糟糕,但是linting传球 如果您在修复掉毛问题后忘记分阶段进行更改,则会发生这种情况。

  2. 承诺很好,但掉毛失败 我经常有一些我不打算提交的调试代码。处理这些变化确实没有意义,处理起来很烦人。

  3. 现在,问题是如何编写一个更智能的预提交钩子来提示实际提交而不是工作目录,最好不要更改工作目录?

1 个答案:

答案 0 :(得分:1)

这通常很难。

最直接的方法是将索引提取到临时目录中。这有一些明显的缺点:特别是,生活在工作树中的被忽略的文件不会被带入临时目录。更糟糕的是,临时目录只有存储库的文件:任何环境(例如子模块和/或超级项目)都不会被转移。

可以携带这些东西,但可能消耗很多空间和/或时间。

这是一个简单的方法,用于将整个工作树(包括子模块)转移到临时目录,然后在其上提取索引内容:

#! /bin/sh -e

tmpdir=$(mktemp -d)
trap "rm -rf $tmpdir" 0 1 2 3 15

# remainder assumes we are at top of work-tree, which is true in
# practice in git hooks, even if it is not documented anywhere.

# step 1: copy current tree to tmp dir
tar cf - . | (cd $tmpdir; tar xf -)

# step 2: extract current index to tmp dir
git --work-tree=$tmpdir checkout -- .

# step 3: run tests
... tests go here ...

对于想要修改文件的预提交钩子(例如,使用gofmtclang-format),这会引起一般的想法,因为现在修改后的文件位于一个临时目录中除去。