1

如果我对 ( 'd) 存储库svn:externals的本地副本拥有管理员权限,如何修复现有修订版的属性?svnsync

让我用一个脚本来演示这个想法,该脚本将被命名为类似fixup.sh并放置在本地存储库根路径中(包含conf/, db/,hooks/等的同一文件夹):

#!/usr/bin/env bash
CURRBASENAME=$(dirname $(readlink -e $0))
svn propget -R svn:externals "file://$CURRBASENAME"|while read extrnls; do
    [[ -n "$extrnls" ]] || continue
    LOC=$(echo "$extrnls"|cut -f 1 -d ' ')
    NME=$(echo "$extrnls"|cut -f 3 -d ' ')
    REV=$(echo "$extrnls"|cut -f 4 -d ' ')
    [[ "${REV:0:2}" == "-r" ]] || REV=''
    [[ -z "$REV" ]] && EXT=$(echo "$extrnls"|cut -f 4 -d ' ')
    [[ -n "$REV" ]] && EXT=$(echo "$extrnls"|cut -f 5 -d ' ')
    LOCALIZED="^/${EXT##*/svn/}"

    svnmucc -n -m "Adjusting svn:externals $NAME to: $LOCALIZED $REV" propset svn:externals "$NME $REV $LOCALIZED" "$LOC"
done

请注意,除非转义,否则该脚本不适用于包含空格的路径。

不幸的是,这种修改会创建新的修订,这反过来又会使从原始远程仓库增量更新本地仓库成为不可能。

最好我想在这个sync阶段这样做,例如通过一个钩子。这里介绍的“解决方案”与其说是一个解决方案,不如说是一个拐杖,因为这意味着我每次同步后都必须重写历史记录,实际上必须保留两个单独的副本:一个修改过的副本和一个“原始的”副本(嗯,除了小svnsync修正)。

注意:我正在处理 repo,而不是工作副本。另请注意,这不是svn:externalsrevprop !

4

0 回答 0