项目场景:
在一次代码提交的时候,怎么也无法提交成功。【前情提要】该项目启动时,报错npm ERR! could not determine executable to run
,然后我参考了这篇文章。将项目中的依赖升级并安装了husky…项目确实是正常启动了,但是提交代码的时候,让人头大的事情发生了,如下图所示
如图所示,changeId丢失。根据图中的建议,我重新安装了hook并commit --amend --no-edit,但仍然无法提交。
然后尝试了如下解决方案
- 原因:已经安装hook,本地做merge操作,此时默认生成的merge commit不带change-id。
解决方法: 这种情况下执行git commit --amend --no-edit一下就会自动生成change-id,进而正常push了。
- 原因:已安装hook,本地也不是做merge操作,依然报错。原因很可能是由于你的commit信息在编辑的时候写到了最后一行『change-id:xxxxx』的后面,push时的check会检查最后一行是否为change-id,如果夹在commit信息中间会被识别为commit信息的内容造成change-id缺失无法push。
解决方法:使用git commit --amend修改commit message信息,一定要保证change-id在最后。
但是我的这种情况里amend操作中该次提交没有commitId…因此无法像gerrit "missing Change-Id"这篇文章中一样补充commit信息。因为根本原因是确实没有commitI(枯辽)
- 原因:本地安装了【husky】插件,icode的hook很husky产生了冲突,导致hook添加不上change_id
解决方法: 对husky进行降级至5.x以下,之后重新安装一次hook(原因1的解决方法)。 附属husky的issue:https://github.com/typicode/husky/issues/538
虽然不是因为它,但是本次情况与husky有关。
后来去请教了我的mentor,实在太厉害了,就没有我mentor解决不了的问题。
经过一番操作,发现了是.git文件夹下的config文件中多了hookPath = .husky
的原因,将其删除即可。终于成功提交,留下感动的泪水。
Git Hooks 是如何工作的
每一个使用了 git 的工程下面都有一个隐藏的 .git 文件夹。挂钩都被存储在 .git 目录下的 hooks 子目录中,即大部分项目中的 .git/hooks。
Git 默认会放置一些脚本样本在这个目录中,除了可以作为挂钩使用,这些样本本身是可以独立使用的。所有的样本都是shell脚本,其中一些还包含了Perl的脚本。不过,任何正确命名的可执行脚本都可以正常使用 ,也可以用Ruby或Python,或其他脚本语言。
上图是git 初始化的时候生成的默认钩子,已包含了大部分可以使用的钩子,但是 .sample 拓展名防止它们默认被执行。为了安装一个钩子,你只需要去掉 .sample 拓展名。或者你要写一个新的脚本,你只需添加一个文件名和上述匹配的新文件,去掉.sample拓展名。把一个正确命名且可执行的文件放入 Git 目录下的 hooks子目录中,可以激活该挂钩脚本,之后他一直会被 Git 调用。
husky是什么?
husky 是一个 Git Hook 工具。husky 其实就是一个为 git 客户端增加 hook 的工具。将其安装到所在仓库的过程中它会自动在.git/目录下增加相应的钩子实现在pre-commit阶段就执行一系列流程保证每一个commit 的正确性。部分 cd在 commit stage执行的命令可以挪动到本地执行,比如 lint 检查、比如单元测试。当然,pre-commit阶段执行的命令当然要保证其速度不要太慢,每次 commit 都等很久也不是什么好的体验。
GitHook 工具 —— husky介绍及使用
在此给自己定一个学习git的计划~!