如果我对 ( '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:externals
revprop !