在 `update` 中用外部结果替换目录 "working copy locked"

Replacing directory with external results in "working copy locked" on `update`

(相关: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。

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

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

svn update --ignore-externals

这可以防止传入的 bar 外部目录与传出目录发生冲突。但是,当然,这意味着您的外部内容不会出现。您现在可以提交,但在接下来的时间里您可能会在 SVN 中遇到损坏的修订,因为您无法先构建和测试。

有一种不理想的 hacky 方法可以解决这个问题,但至少可以让您了解新代码是否有效。它涉及在您的工作目录中移动文件夹:

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

并提交。