изменение каталога в bash не влияет на хук после фиксации - PullRequest
0 голосов
/ 12 июня 2019

Я сделал следующий скрипт bash для фиксации родительского репо после некоторого изменения в подмодуле. все дело в том, что скрипт хочет cd .. проверить текущую ветку родительского репо, но проблема в том, что cd .. не влияет на предстоящие команды, потому что я предполагаю subshell

я пытался бежать 1- cd ../ && перед каждой командой 2- сделать псевдоним, но не удалось 3 - запустить exec, но скрипт не продолжился

#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments.  The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "post-commit".
commit_msg= git log -1 --pretty=%B
if [[ $(git branch | grep \* | cut -d ' ' -f2) == "int1177/next" ]]; then
    cd ..
    if [[ $(git branch | grep \* | cut -d ' ' -f2) == "B0/next" ]]; then
        git add 6_Tests
        git commit -m "bs esss"
        echo "development branch B0/next has now new commit"
    else
        echo "development branch isn't B0/next"
    fi
else
    echo "current branch isn't int1177/next"    
fi

1 Ответ

4 голосов
/ 12 июня 2019

На самом деле, эта конкретная проблема - не проблема 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 Основная опасность в в этом случае заключается в том, что хранилище суперпроекта не обязательно имеет какую-либо форму для обработки коммита прямо сейчас. Редактировать: или, как обнаружено в этом комментарии , даже не настроено на быть суперпроектом для этого подмодуля, но, тем более, иметь подмодуль-добавлено обновление коммита.

...