禁止svn删除“文件不存在”错误

时间:2012-05-19 18:47:33

标签: bash svn shell

在我的项目中,我有一个包含资源的文件夹,当我将其添加或删除到我的工作副本时,我不想手动添加或删除到资源库。

我编写了一个简单的bash脚本,用于检查svn state并为svn add调用标有?svn remove的文件,以查找!的文件。我将这个bash脚本添加到了我的构建脚本中。问题是,svn remove在使用本地不存在的文件调用时返回错误。这导致我的构建脚本被中止并返回错误。

有没有办法来抑制这些错误?我尝试了--force--quiet。没有帮助。

示例:

MacBook-Pro:proj Bill$ echo "test" > foo.bar
MacBook-Pro:proj Bill$ svn st
?       foo.bar
MacBook-Pro:proj Bill$ svn add foo.bar 
A         foo.bar
MacBook-Pro:proj Bill$ rm foo.bar 
MacBook-Pro:proj Bill$ svn st
!       foo.bar
MacBook-Pro:proj Bill$ svn rm foo.bar
D         foo.bar
svn: 'foo.bar' does not exist

2 个答案:

答案 0 :(得分:4)

有(至少)两种不同情况,其中svn stat打印带有感叹号的行:

  1. 该文件存在于存储库中,工作目录中不存在,并且未使用svn rm
  2. 存储库中不存在该文件,文件上使用了svn add,工作目录中不再存在该文件。
  3. svn rm适用于第一种情况,但在第二种情况下退出时出错。有几种方法可以解决这个问题 - 取决于您想要实现的目标:

    • 如果要在两种情况下删除文件,请执行:
      touch "$filename" ; svn rm --force "$filename"
    • 如果您只想在第二种情况下删除文件,并在第一种情况下还原,请执行:
      svn revert "$filename"

答案 1 :(得分:3)

因此,要回答我的问题,请使用--keep-local解决问题。

这是我最终使用的脚本。这将检查标记为未版本化(?)的文件并为其调用svn add。然后,它会检查标记为缺失的文件(!)并为其调用svn rm

svn st "$Resources" | grep '^?' | sed 's_^?       \(.*\)$_svn add "\1"_g' | sh
svn st "$Resources" | grep '^!' | sed 's_^!       \(.*\)$_svn rm --keep-local  "\1"_g' | sh