Как отловить ошибку «fatal index.lock: файл существует» при вызове git checkout в сценарии оболочки? - PullRequest
0 голосов
/ 20 февраля 2020

Shell-скрипт создает файлы для дельта-релиза Flyway, который применяет все изменения для нового выпуска в базе данных Oracle.

  1. "git checkout" новый релиз-тег со всеми новыми изменениями
  2. Убедитесь, что код возврата вызова "git checkout" в порядке
  3. Получить список всех файлов, которые изменились между выпусками
  4. Измененные файлы в основном копируются в новый каталог и получают сгенерированный префикс для Flyway2

Позже эти файлы можно легко применить с помощью Flyway ...

Произошла проблема недавно: Шаг 1 может завершиться с ошибкой из-за "фатального: невозможно создать '... /. git / index.lock': файл существует". ошибка (скорее всего, из-за обновления статуса SourceTree).

К сожалению, в этом случае код возврата git равен 0 (что означает отсутствие ошибки), что означает, что скрипт не замечает, что файлы были не обновляется на шаге 2 и продолжается с шагами 3 и 4 (но с неверными файлами).

В этом примере я пытаюсь обойти проблему, ожидая, пока «index.lock» не будет удалены, однако это не отказоустойчиво! Может быть, index.lock создан сразу после того, как пройден while-l oop, но перед проверкой git и у меня снова возникла такая же проблема.

GIT="Path to Git.exe"
INDEXLOCK="Path to potential .git/index.lock"

#Unfortunately git checkout returns 0 (everything is ok), when it failed due to an existing index.lock
#The script would then commence, although the sources were not checkout correctly!
#Loop until index.lock does not exist anymore
while [ -f "$INDEXLOCK" ]
do
    echo "Index.lock exists! Waiting until open git process is finished."
    sleep 5
done

echo " "
echo "Trying to check out tag: $2"
$GIT checkout "$2" -q
if [ $? = 1 ]; then
    echo "Error: Can't checkout tag: $2"
    exit;
fi
echo "Check out finished"

Есть ли возможность сделать уверен, что сценарий оболочки останавливается при ошибке «.git / index.lock»?

1 Ответ

0 голосов
/ 24 февраля 2020

Захват stdout сработал. Я смог проверить функциональность, поместив index.lock в каталог.

GIT="Path to Git.exe"
INDEXLOCK="Path to potential .git/index.lock"

#Unfortunately git checkout returns 0 (everything is ok), when it failed due to an existing index.lock
#The script would then commence, although the sources were not checkout correctly!
#Loop until index.lock does not exist anymore
while [ -f "$INDEXLOCK" ]
do
    echo "Index.lock exists! Waiting until open git process is finished."
    sleep 5
done

echo " "
echo "Trying to check out tag: $2"
OUTPUT=$($GIT checkout "$2" -q 2>&1)
RETURNCODE=$?

if [[ $OUTPUT == *"fatal: Unable to create"*".git/index.lock': File exists."* ]];
then
    echo "Error: Can't checkout release tag '$2' due to index.lock"
    exit;
elif [ $RETURNCODE = 1 ]; then
    echo "Error: Can't checkout tag: $2"
    exit;
fi
echo " "
echo "Check out attempt finished"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...