Я написал скрипт, который заменяет последние 3 цифры номера версии в файле, содержащем строку в этом формате.
"version-all:255.24.788"
Есть 2 режима работы скрипта: обычный и расширенный. Обычный режим просто вносит необходимые изменения, добавляет файлы в git и фиксирует их. Расширенная версия создает ветку для внесения этих изменений, изменяет файлы, добавляет, фиксирует, а затем возвращается к исходной рабочей ветке.
Я наблюдаю странное поведение при запуске скрипта. Скрипт работает при первом запуске, но при втором запуске он прекращает фиксацию результатов и пытается изменить ветку, что приводит к конфликтам слияния. Я не могу понять, почему скрипт сработает только нечетное количество раз (первый, третий, пятый раз), а когда запустится четное количество раз (второй, четвертый, шестой), произойдет сбой.
Я попытался изменить синтаксис переменных и заменить вызовы perl простым
echo "test" > file1.txt
для целей отладки, и тогда он, кажется, работает нормально. При обратном добавлении команд perl сценарий, кажется, возвращается к своему странному поведению.
#!/bin/bash
# This script replaces last 3 digits of a version number in a file
# There are 2 modes for the script
# 1. Regular - no flag needed, requires 1 argument: a version number
# 2. Advanced - flag "-a" needs to be used followed by 3 arguments: version number, push repo name, remote repo name.
advanced_script=false
version = "none"
if [ "$1" = "-a" ] ; then
advanced_script=true
fi
if [ "$advanced_script" = true ] ; then
if [ $# -ne 4 ] ; then
echo -e "ERROR: Please supply the following 3 arguments and try again.\n"
echo -e " 1. New version number\n"
echo -e " 2. Push repository name\n"
echo -e " 3. Remote repository name\n"
exit 1
fi
version = "$2"
else
if [ $# -ne 1 ] ; then
echo -e "ERROR: Please supply version number and try again.\n"
exit 1
fi
version = "$1"
fi
old_version_full = "version-all:255.24.788"
old_version=${old_version_full##*all:}
new_version=${old_version%.*}
new_version+ = ".${version}"
current_branch=$(git branch | grep \* | cut -d ' ' -f2)
commit_string = "Bump the version to $version"
if [ "$advanced_script" = true ] ; then
local_branch = "new_$version"
remote_master = "$4/master"
git stash
git checkout -b "$local_branch" "$remote_master"
fi
perl -i -pe"s/${old_version}/${new_version}/g" file1.txt
perl -i -pe"s/${old_version}/${new_version}/g" file2.txt
git add file1.txt
git add file2.txt
git status
git commit -m "$commit_string"
if [ "$advanced_script" = true ] ; then
git push "$3"
git checkout "$current_branch"
git stash apply
fi
Вероятно, не связанная проблема: .
имеет особое значение в регулярном выражении Perl, поэтому ваш шаблон не соответствует тому, что вы думаете. Исправьте это и связанные с ним ошибки внедрения кода следующим образом: perl -i -spe's/\Q$o/$n/g' -- -o = "$old_version" -n = "$new_version" file1.txt
Совет: Вы можете объединить оба вызова в perl
: perl -i -spe's/\Q$o/$n/g' -- -o = "$old_version" -n = "$new_version" file1.txt file2.txt
Проблема была в шаблоне регулярного выражения, используемом в вызове Perl. Изменение следующей строки решило проблему:
perl -i -spe's/\Q$o/$n/g' -- -o = "$old_version" -n = "$new_version" file1.txt file2.txt
Спасибо @ikegami за решение
git stash
иногда ничего не делает и не создает тайник. Если это так, ваш более позднийgit stash apply
применит некоторый тайник разное, если он есть, или просто потерпит неудачу; ни то, ни другое не кажется хорошей идеей. Вероятно, это не связано с проблемой, которую вы видите, но, возможно, это так, трудно сказать, поскольку здесь нет минимальный воспроизводимый пример.