Репозиторий Subversion становится поврежденным при настройке внешних настроек через скрипт

У меня есть автоматический скрипт (написанный на KSH), который устанавливает внешние SVN для папок в репозитории. Когда я запускаю этот скрипт, он делает следующее:

Оформление части хранилища полностью.

Затем перебирает файл со всеми свойствами Subversion для установки внешних параметров и:

  1. Выполняет обновление SVN для локальной рабочей копии. Выводит текущее внешнее свойство SVN папки, над которой в данный момент работает скрипт. (который может быть один или несколько уровней глубиной)
  2. Извлекает переменную для нового внешнего из файла
  3. Установите предыдущие внешние и один новый внешний в этой папке с помощью SVN propset.
  4. Подтверждает изменение в хранилище

Затем скрипт перемещается на следующую строку в файле.

Сценарий отрывка:

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.

0 ответов

Другие вопросы по тегам