Недавно мы переместили проект Node в подпапку моно-репо, и после этого наши хуки фиксации (установленные с помощью 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
-ing в корневой каталог перед выполнением любых команд 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