预提交挂钩更改要添加到提交的文件

时间:2018-07-24 16:15:38

标签: git github eslint

我正在为存储库编写一个预提交挂钩,以根据编码标准来格式化代码。

npm install
./node_modules/.bin/eslint --fix ./index.js

上面的那行是我的钩子的一部分。它可以按我想要的方式工作,并使用干净的代码将index.js文件更改为标准格式。成功提交后,当我执行 git status 时,我看到了一个未分级的更改,该更改是最近提交中的pre-commit钩子所做的更改。

我正在寻找一种方法,将预先提交钩子所做的所有更改都包含在当前提交中,而不必再次提交。因此,流程应为

  1. git commit
  2. 预提交挂钩运行,必要时更改文件,将更改添加到当前提交中
  3. 现在,我可以推

2 个答案:

答案 0 :(得分:0)

因此,钩子需要进行更改,就像您在提交中进行所需的任何更改一样-使用git add

如果在启动此过程时知道工作树与索引同步,那么就这么简单

git add .

通常这不是一个很好的假设。您可以修改脚本以确保工作树是干净的(尽管如果您希望以后能够恢复工作树,则需要花一些时间来完成),或者如果不是,则中止它(尽管这样做可能会受到限制)在预提交挂钩中。

更好的方法是仅添加修改后的文件(尽管这意味着您必须能够知道脚本实际修改了哪些文件)。

这仍然假定(如脚本的一般性质一样),如果您已经修改了文件,则意图是对该文件进行所有修改。那对您的工作流程可能是有效的,如果是这样,那么上面的内容就足够了。

当然,也许您的工作流程 不允许这种假设,在这种情况下,您需要重新审查脚本的工作原理。在这种情况下,有几个选择:

1)您可以在脚本开始时存储未暂存的更改。

git stash --keep-index --include-untracked

然后运行清理并进行git add .(知道工作树中的所有更改都是运行脚本的结果),然后

git stash pop

2)您可以完全绕开工作树,对索引中存在的文件进行操作。 (由于索引不是您的工具可以直接使用的形式,因此基本上必须将每个索引条目提取到要清除的文件中,然后再更新回索引中。)

答案 1 :(得分:0)

Lint Staged软件包是一个选项。他们给出的示例使用Husky来管理git钩子,但我认为它应该与普通的git钩子一起工作。

它仅对分段文件运行linter,如果文件已更改,则重新启动它们,然后创建提交。但是,(此时)您将无法暂存文件的某些部分。