На самом деле, эта конкретная проблема - не проблема bash, а проблема с Git.
Почему «cd» не работает в сценарии оболочки? в целом допустимо,и является подходящим ответом на многие другие вопросы.Но этот конкретный хук post-commit
пытается chdir
из подмодуля в родительский суперпроект, а затем сделать коммит внутри родительского суперпроекта.Это возможно возможно.Это может быть плохой идеей по другим причинам - в общем случае неразумно, чтобы хуки коммитов Git создавали коммиты, даже в других репозиториях 1 - но в данном конкретном случае вы сталкиваетесь с тем, что Git находит свои каталоги через переменные окружения.
В частности, есть переменная окружения GIT_DIR
, которая сообщает Git: Каталог .git
, содержащий хранилище, находится по этому пути. Когда Git запускает Git hook, Git обычно устанавливает $GIT_DIR
в .
или .git
.Если $GIT_DIR
установлено не установлено , Git найдет каталог .git
посредством поиска по дереву каталогов, но если $GIT_DIR
установлено , Git предполагает, что $GIT_DIR
установлен правильно .
Решение состоит в том, чтобы unset GIT_DIR
:
unset GIT_DIR
cd ..
Остальные команды субоболочки будутзапускается в одношаговом каталоге, и теперь, когда $GIT_DIR
больше не задан, Git будет искать в рабочем дереве суперпроекта каталог .git
для суперпроекта.
Кроме этого,:
$(git branch | grep \* | cut -d ' ' -f2)
- это неуклюжий способ получить имя текущей ветви.Используйте вместо этого
git rev-parse --abbrev-ref HEAD
здесь.(Другой вариант - git symbolic-ref --short HEAD
, но он шумно завершается неудачно с отсоединенным HEAD, в то время как вы, вероятно, хотите, чтобы тихий результат был просто словом HEAD
, которое выдаст метод rev-parse
.)
1 Основная опасность в в этом случае заключается в том, что хранилище суперпроекта не обязательно имеет какую-либо форму для обработки коммита прямо сейчас. Редактировать: или, как обнаружено в этом комментарии , даже не настроено на быть суперпроектом для этого подмодуля, но, тем более, иметь подмодуль-добавлено обновление коммита.