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

Par*_*iva 6 git github eslint

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

npm install
./node_modules/.bin/eslint --fix ./index.js
Run Code Online (Sandbox Code Playgroud)

上面的行是我的钩子的一部分。它按照我想要的方式工作,并使用干净的代码将 index.js 文件更改为标准格式。成功提交后,当我执行git status时,我看到一个未暂存的更改,这是最近提交中预提交挂钩所做的更改。

我正在寻找一种方法,将预提交挂钩完成的所有更改都包含在当前提交中,而无需再次提交。所以,流程应该是

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

Mar*_*ger 4

因此,钩子需要暂存更改,就像您在提交中暂存所需的任何更改一样 - with git add

如果您知道在开始此过程时您的工作树与索引同步,那么就很简单

git add .
Run Code Online (Sandbox Code Playgroud)

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

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

这仍然假设(就像脚本的一般性质一样)如果您修改了文件,您的意图是暂存对该文件的所有修改。这可能对您的工作流程有效,如果是这样,那么上述内容就足够了。

当然,也许您的工作流程不允许这样的假设,在这种情况下,您需要从根本上重新审视脚本的工作方式。在这种情况下有几个选择:

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

git stash --keep-index --include-untracked
Run Code Online (Sandbox Code Playgroud)

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

git stash pop
Run Code Online (Sandbox Code Playgroud)

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