Почему команды `git` терпят неудачу при запуске как часть ловушки git в подпапке? - PullRequest
0 голосов
/ 07 мая 2019

Недавно мы переместили проект 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

1 Ответ

1 голос
/ 07 мая 2019

TL; DR: не установлено $GIT_DIR (в скрипте sh, unset GIT_DIR).

Есть подсказка в документации githooks :

Перед тем, как Git вызывает ловушку, он меняет свой рабочий каталог на $ GIT_DIR в пустом хранилище или на корень рабочего дерева в не пустом хранилище.Исключением являются перехваты, запускаемые во время отправки ( предварительное получение , обновление , пост-получение , пост-обновление , push-to-checkout ), которые всегда выполняются в $ GIT_DIR.

плюс еще несколько на странице руководства Git верхнего уровня :

- git-dir =
Укажите путь к хранилищу.Это также можно контролировать, задав переменную окружения GIT_DIR.Это может быть абсолютный или относительный путь к текущему рабочему каталогу.

GIT_DIR
Если установлена ​​переменная окружения GIT_DIR, то она указывает путь для использования вместо значения по умолчанию .git длябаза хранилища.Параметр командной строки --git-dir также устанавливает это значение.

В данном случае программа Git верхнего уровня устанавливает $GIT_DIR путь, по которому .git каталог должен быть найден.Поскольку ловушка изменила свой рабочий каталог на рабочее дерево, программа Git установила $GIT_DIR на .git.Если вы chdir в другом месте, вы должны соответствующим образом настроить $GIT_DIR - и если вы полностью удалились от основного хранилища и хотите, чтобы Git обнаружил $GIT_DIR снова, вы должны unset $GIT_DIR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...