用外部替换目录导致"工作副本锁定"在`update`

时间:2015-05-15 11:39:33

标签: svn svn-externals

(与SVN externals repo "is already locked" on update相关)

我开始使用这样的存储库结构:

^/
├ module1/
│ ├ foo/
│ ├ bar/
│ ├ baz/
├ module2/

目录^/bar实际上是module2的一个稍微过时的副本,我认为最好是现代版本的外部版本,而不是字节副本:

^/
├ module1/
│ │ (external: "^/module2 bar")
│ ├ foo/
│ ├ baz/
├ module2/

设置顺利进行:

svn co svn://module1 module1
cd module1
svn delete bar
svn propset svn:externals "^/module2 bar" .

现在我想更新工作目录,以便我可以执行构建和放大在提交之前使用新代码进行测试。

但是,svn update会导致以下错误:

Fetching external item into 'module1/bar'
svn: warning: Working copy 'module1/bar' locked

我在每个目录中尝试svn cleanup,但后续更新仍然失败并出现相同的错误。

这是因为我试图在同一次提交中用同名的外部替换目录吗?我想做什么?

我正在使用SVN 1.8。

1 个答案:

答案 0 :(得分:1)

是的,这就是原因。在外部内容试图在同一位置产生的同时,该目录被锁定以进行删除。

您可以通过无外部更新来使您的工作目录进入可提交状态:

svn update --ignore-externals

这可以防止传入的bar外部与传出目录冲突。但是,当然,这意味着您的外部内容不会出现。你现在可以提交了,但是你可能会在SVN的剩余时间内被修复破坏,因为你无法构建&先测试一下。

围绕这种方法有一种不太理想的方法,但至少会让你知道你的新代码是否正常工作。它涉及在工作目录中移动文件夹:

svn propset svn:externals "^/module2 bar_tmp" .
svn update
rm -rf bar
mv bar_tmp bar

现在你可以做你的构建&通过合理保证测试您将要测试的内容,尽管它有点不正统,但是进行测试。

您的工作目录结构如下所示:

~/
├ module1/
│ ├ foo/
│ ├ bar/    (external to "^/module2")
│ ├ baz/

不要做svn update!您[故意]屠杀了您的工作目录 在一定程度上,SVN知道的越少越好。你不需要SVN去做一个构建&测试

但是,当你完成并且开心时,你需要把它们放回原处:

svn propset svn:externals "^/module2 bar" .
rm -rf bar
svn update --ignore-externals

并提交。