我很困惑,假设我在工作副本中并执行以下操作:
svn mkdir trunk
svn mkdir tags
svn mkdir branches
svn commit -m "added trunk branches and trunk"
cd trunk
touch a b c d e f g
svn add a b c d e f g
cd ..
svn commit -m "added files"
svn copy trunk tags/1.0
svn commit -m "tagged 1.0"
现在我想删除一个文件并标记另一个版本
svn delete trunk/e
svn commit -m "deleted file e"
svn copy trunk tags/1.1
svn commit -m "created tag 1.1"
我收到类似于以下内容的错误消息:
/svn/repos/banana/!svn/wrk/1f39512a-0e1e-11e0-9d1f-5be991158436/63885/tags/1.1/e” 路径未找到
我在这里做错了什么?
更新
我发现如果我在删除后执行svn更新一切正常。我想解释一下这种行为。
答案 0 :(得分:10)
这显然是Subversion的一个已知问题,在提交后使用删除。提交时,您的工作副本将成为混合修订工作副本,然后不允许提交删除。
您可以在执行更新/提交之前运行svnversion
来验证这一点。您会注意到混合版本标记为“0:4”之类的工作副本版本。
来自Subversion best practices document:
您的工作副本的目录和文件可以处于不同的“工作”版本:这是一个深思熟虑的功能,允许您将旧版本的东西与新版本混合搭配。但是你必须要注意的事实很少:
- 每次svn提交后,您的工作副本都有混合版本。您刚刚提交的内容现在是HEAD修订版,其他所有内容都是旧修订版。
- 某些提交被禁止:
- 您无法提交删除没有HEAD工作版本的文件或目录。
- 您无法将属性更改提交到没有HEAD工作版本的目录。
- svn update会将您的整个工作副本带到一个工作版本,并且是第2点中提到的问题的典型解决方案。
醇>
这篇文章也很好地解释了mixed revision working copies。
答案 1 :(得分:2)
错误消息也包含此
svn: Commit failed (details follow):
svn: File '1.1/e' is out of date
我发现,如果我在复制到标签之前进行svn更新,那么
svn delete trunk/e
svn commit -m "deleted file e"
svn update
svn copy trunk tags/1.1
svn commit -m "created tag 1.1"
这很好用。对此行为的解释将不胜感激。