重新排序 subversion 存储库失败
Posted
技术标签:
【中文标题】重新排序 subversion 存储库失败【英文标题】:Reordering subversion repository fails 【发布时间】:2014-07-03 04:56:33 【问题描述】:我想重新排序一个颠覆存储库;为此,我使用 svnadmin dump、svnadmin load、svndumpfilter 和 sed。
例如,我想“移动”下面的目录(其实还有很多,但我现在一步一步来):
project1/common/bib -> trunk/pub/common/bib
为此,我对导出的转储文件执行以下命令:
sed -i "s|Node-path: project1/common/bib|Node-path: trunk/pub/common/bib|g" repo.dump
sed -i "s|Node-copyfrom-path: project1/common/bib|Node-copyfrom-path: trunk/pub/common/bib|g" repo.dump
但是,当我将它加载到一个新的/空的存储库中时,我得到:
<<< Neue Transaktion basierend auf Originalrevision 64 gestartet
svnadmin: Datei nicht gefunden: Transaktion »63-1r«, Pfad »trunk/pub/common/bib«
* Füge Pfad hinzu: trunk/pub/common/bib ...
我不明白为什么这不起作用,因为我愚蠢地替换了每个条目!
【问题讨论】:
你说你使用svndumpfilter
,但你没有指定你运行的命令。
没关系(只是为了包含/排除)。假设我根本没有 svndumpfilter(我的实验确实如此)。我想要的是将 project1/common/bib 移动到存储库中的trunk/pub/common/bib(即它的转储文件)
svn 有一个本机命令 (svn mv URL1 URL2
) 用于将存储库中的目录移动到同一存储库中的另一个位置。为什么不使用它而不是 dump/sed/load?
因为移动在历史记录中是可见的,所以历史记录有点损坏等等。据我所知,dump/sed/load 将允许移动它们,因为它们本来就在那里。由于它涉及我的回购的大结构,这就是我想要的
【参考方案1】:
svnadmin dump 确实会生成“project1”存储库的完整历史记录。
但是,尽管有可能,但更改该历史记录中的文件路径可能会很棘手。您的 sed 命令很好,但它们可能只能完成 98% 的工作。要正确更改历史记录,您需要对更改的历史记录文件进行更多搜索和验证。
这是一个示例,说明如果您只执行这 2 个 sed 命令,事情会如何被破坏:
假设在修订版 5 中添加并提交了 common 目录,svndump 将给出:
Node-path: project1/common
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
您运行了不完整的 sed 魔法,但新存储库无法创建 trunk/pub/common 目录:
Node-path: project1/common # bad! should be: trunk/pub/common !!!
Node-kind: dir
Node-action: add
Prop-content-length: 10
Content-length: 10
PROPS-END
从这个时间点开始,svn 将尝试重新创建您的无效路径,从而给出:
<<< Started new transaction, based on original revision 2
svnadmin: File not found: transaction '1-1', path '/trunk/pub/common'
* adding path : trunk/pub/common ...
有时这可以工作。但大多数时候它都失败了。
解决方案:
就个人而言,我会使用具有良好搜索和替换功能的文本编辑器(例如 vim),并替换所有“project1”、“project1/common”和“project1/common/bib”外观.
【讨论】:
以上是关于重新排序 subversion 存储库失败的主要内容,如果未能解决你的问题,请参考以下文章
Subversion存储库中“分支”,“标记”和“主干”的含义是什么?