我们最近将一个 Node 项目移动到 mono-repo 的子文件夹中,之后我们的提交挂钩(使用 Husky 安装)由于在错误的目录中执行而开始失败:
{ Error: Command failed: git rev-parse HEAD
fatal: not a git repository: '.git'
at ChildProcess.exithandler (child_process.js:297:12)
at ChildProcess.emit (events.js:197:13)
at maybeClose (internal/child_process.js:978:16)
at Socket.stream.socket.on (internal/child_process.js:395:11)
at Socket.emit (events.js:197:13)
at Pipe._handle.close (net.js:611:12)
killed: false,
code: 128,
signal: null,
cmd: 'git rev-parse HEAD' }
我在解决问题时没有问题(基本上cd
是在执行挂钩中的任何命令之前 - 进入根目录git
),但我不明白为什么(未修复的)脚本在命令行上工作 - 不管哪个我执行它们的文件夹?.
脚本的失败部分基本上是:
console.log('PWD', cp.execSync('pwd'));
console.log(cp.execSync('git rev-parse HEAD'));
项目布局
.git/
frontend/
package.json
backend/
将触发上述错误的示例命令:
git checkout master
除了错误之外,它还会打印工作目录:PWD /tmp/foo/myproj/frontend
如果我手动触发脚本,一切正常:
npm run postcheckout
PWD /tmp/foo/myproj/frontend
82dc6d2089a397f0889addb562ea84ba8d846215
无论是根文件夹还是子文件夹,这都有效,我看不出有什么区别。Husky 应该找到该.git
文件夹,这似乎证明了这一点,但是当它作为挂钩脚本运行时,显然会发生一些变化。自动生成的 Husky 脚本的相关部分是:
cd "frontend"
...
...
npm run postcheckout