Репозиторий Subversion становится поврежденным при настройке внешних настроек через скрипт
У меня есть автоматический скрипт (написанный на KSH), который устанавливает внешние SVN для папок в репозитории. Когда я запускаю этот скрипт, он делает следующее:
Оформление части хранилища полностью.
Затем перебирает файл со всеми свойствами Subversion для установки внешних параметров и:
- Выполняет обновление SVN для локальной рабочей копии. Выводит текущее внешнее свойство SVN папки, над которой в данный момент работает скрипт. (который может быть один или несколько уровней глубиной)
- Извлекает переменную для нового внешнего из файла
- Установите предыдущие внешние и один новый внешний в этой папке с помощью SVN propset.
- Подтверждает изменение в хранилище
Затем скрипт перемещается на следующую строку в файле.
Сценарий отрывка:
mkdir "${SVNLOC}/${PROJNAME}"
svn co --no-auth-cache --username $SVNUSER --password $SVNPASSWORD "${1}" "${SVNLOC}/${PROJNAME}" >> $LOGFILE 2>&1
while read extline
do
# parse line for variables
parent=$(echo $extline | cut -f1 -d,);
extfolder=$(echo $extline | cut -f2 -d,);
exturl=$(echo $extline | cut -f3 -d,);
revision=$(echo $extline | cut -f4 -d,);
# execute a SVN update to ensure we have the very latest properties
echo "SVN Update in ${SVNLOC}/${PROJNAME}" >> $LOGFILE 2>&1
echo "svn update --no-auth-cache --username $SVNUSER --password $SVNPASSWORD --ignore-externals ${SVNLOC}/${PROJNAME}/${parent}" >> $LOGFILE 2>&1
svn update --no-auth-cache --username $SVNUSER --password $SVNPASSWORD --ignore-externals ${SVNLOC}/${PROJNAME} >> $LOGFILE 2>&1
# change directory to folder in local check-out where external will be set.
cd ${SVNLOC}/${PROJNAME}/${parent}
pwd >> $LOGFILE 2>&1
# if the revision is empty/unset then set external with out revision setting
if [ "$revision" == "" ] ; then
echo "Set External ${exturl} at ${SVNLOC}/${PROJNAME}/${parent}" >> $LOGFILE 2>&1
# output externals info to a file
echo "'${extfolder}' '${exturl}'" > svnext
# append current externals to the list so they're not deleted
svn propget --no-auth-cache --username $SVNUSER --password $SVNPASSWORD svn:externals . >> svnext
# set new and existing externals to the property
svn propset --no-auth-cache --username $SVNUSER --password $SVNPASSWORD svn:externals --file svnext . >> $LOGFILE 2>&1
rm svnext
else # if the revision is set then set external with revision setting
echo "Set External ${exturl}@${revision} at ${SVNLOC}/${PROJNAME}/${parent}" >> $LOGFILE 2>&1
# output externals info to a file
echo "'${extfolder}' -r${revision} '${exturl}'" > svnext
# append current externals to the list so they're not deleted
svn propget --no-auth-cache --username $SVNUSER --password $SVNPASSWORD svn:externals . >> svnext
# set new and existing externals to the property
svn propset --no-auth-cache --username $SVNUSER --password $SVNPASSWORD svn:externals --file svnext . >> $LOGFILE 2>&1
rm svnext
fi
# commit externals set in this loop
echo "Commit Externals in ${SVNLOC}/${PROJNAME}/${parent}" >> $LOGFILE 2>&1
echo "svn commit --no-auth-cache --username $SVNUSER --password $SVNPASSWORD -m "Committing externals to SVN for Project ${PROJNAME}" ${SVNLOC}/${PROJNAME}" >> $LOGFILE 2>&1
svn commit --no-auth-cache --username $SVNUSER --password $SVNPASSWORD -m "Committing externals to SVN for Project ${PROJNAME}" "${SVNLOC}/${PROJNAME}" >> $LOGFILE 2>&1
done < "$2"
Фиксация SVN может работать в первой паре итераций цикла, но затем происходит сбой на итерации с ошибкой SVN, такой как:
svn: E160004: Commit failed (details follow):
svn: E160004: Corrupt node-revision '0.0.r180/4191'
Но если я проверяю svnadmin по хранилищу, над которым работал мой скрипт, он говорит, что проверка проверена:
* Verified revision 177.
* Verified revision 178.
* Verified revision 179.
* Verified revision 180.
Поэтому, если я работаю с репозиторием (или просматриваю его с помощью TortoiseSVN) после ошибки, я получаю ту же ошибку svn, что и выше, но она не перехватывается проверкой svnadmin.
Изменить: я проверил журналы ошибок SVN на соответствующем сервере SVN и обнаружил следующую ошибку:
Could not MERGE resource "<SVN_REPOS_PATH>/!svn/txn/179-4z" into "<SVN_REPOS_PATH>/<PATH_TO_FOLDER>". [500, #0]
Could not open the FS root for the revision just committed. [500, #160004]
Corrupt node-revision '0.0.r180/4191' [500, #160004]
Missing id field in node-rev [500, #160004]
Could not fetch resource information. [404, #0]
(2)No such file or directory: Named transaction doesn't exist. [404, #0]
Что до сих пор не объясняет, почему фиксация действительно не удалась.
Кто-нибудь сталкивался с этим? Если да, то какие-либо советы, рекомендации или возможные решения?
Я использую клиент CLI SVN 1.7.2 против хранилища SVN 1.7.8.