【问题标题】:SVN command to delete all locally missing filesSVN命令删除所有本地丢失的文件
【发布时间】:2012-03-07 11:12:42
【问题描述】:

在 SVN 中有一个命令可以用来删除目录中所有本地丢失的文件吗?

或者如果做不到这一点,可以通过某种方式仅列出那些丢失的文件(或者,在更一般的情况下,状态为 A、D、?等)

【问题讨论】:

  • 我维护 1 个工作文件夹和 1 个结帐文件夹。并且仅将文件从工作文件夹移动到签出文件夹。如果必须添加/删除文件夹,我会手动执行,然后将文件移动到该文件夹​​中(例如新包、旧包)。大多数 svn 问题发生在您移动工作副本上的文件夹时。即使将文件从工作副本复制到签出副本,您也应该只移动文件,而不是文件夹。

标签: svn file-io


【解决方案1】:

如果您使用的是 TortoiseSVN,只需执行 Check for Modifications,按 Status 列排序,选择所有标记为missing 的条目,右键打开上下文菜单,然后选择删除。最后,提交以将更改发布到存储库。

如果您使用的是 Windows,但更喜欢命令行并喜欢涉足 PowerShell,那么这个单行代码就可以解决问题:

svn status | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] }

也就是说,将输出过滤到仅显示丢失文件的那些行(由行首的感叹号表示),捕获关联的文件名,然后对该文件名执行svn rm

(博文 Remove all “missing” files from a SVN working copy 为 Unix/Linux 做了类似的事情。)

【讨论】:

  • 在 Eclipse 中有没有办法使用 subclipse 插件?更新一个然后在项目中找到它们并再次删除它们真是太糟糕了。
  • 仅供参考,如果需要颠覆密码,这里的语法是:svn status --username user_name_here --password password_here | ? { $_ -match '^!\s+(.*)' } | % { svn rm $Matches[1] --username user_name_here--password password_here }
  • 在执行svn up之前,你应该先在这行之后提交吗?因为文件是从svn服务器恢复的
  • 此操作是否也会从存储库中删除文件?
【解决方案2】:
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm
  1. svn status
  2. 仅过滤丢失的文件
  3. 去掉感叹号
  4. 过滤掉尾随空格
  5. 添加前导引号
  6. 添加尾随引号
  7. svn remove每个文件

【讨论】:

  • 如果文件/目录中有空格,此解决方案有效。
  • 如何添加详细信息? xargs -verbose svn rm ?
  • 只是对脚本用户的提示等,如果没有找到要删除的文件,此命令将失败: svn: E205001: Try 'svn help delete' 获取更多信息 svn: E205001: 提供的参数不足
  • @ThorstenSchöning 的问题可以通过将-r 添加到xargs 选项来解决(如果没有给出参数,请不要运行)。此外,参数的数量应该是有限的,并且应该批量删除,因为调用失败并且要删除的文件数量非常多,例如-n 500。最后但并非最不重要的一点是,对于包含诸如 $ 之类的 shell 特殊信息的文件,执行的引用不是最理想的 - 最好使用 \n 作为分隔符并将引用保留为 xargssvn status | grep "!" | cut -d! -f2 | sed 's/^ *//' | xargs -n 500 -d "\n" -r svn rm
【解决方案3】:

如果您使用的是 Mac (Darwin) 或 Linux,您可以将以下命令的输出通过管道传输到 svn rm,以查找所有丢失的文件。您可以在运行之前将当前工作目录设置为适当的目录或子目录 - 取决于您是要运行整个工作副本还是只运行一个子集。

  1. 运行 svn 状态
  2. 搜索以“!”开头的行(缺失)
  3. 打印 #2 输出的“--force”(svn 参数)和第二列(文件名)
  4. 使用#3 的输出作为参数运行svn rm

所以完整的命令是:

svn st | grep ^! | awk '{print " --force "$2}' | xargs svn rm

参考资料:

【讨论】:

  • 如果文件名中有空格,这不起作用。不过,我不知道足够的 awk 来修复它。
  • 如果您的文件名包含@,则使用awk '{print " --force "$2"@"}'(例如,如果您是iOS开发人员)
  • 并处理带有空格的文件名,awk '{$1=""; print " --force \""substr($0,2)"@\"" }' 应该可以解决问题(并且开始看起来很丑)
  • 处理空间的完整命令是 "svn st | grep ^! | awk '{$1=""; print " --force \""substr($0,2)"@\ "" }' | xargs svn rm"
  • 为什么不把--force放到xargs部分呢?
【解决方案4】:

改进版

所以完整的命令是:

svn st | grep ^! | sed 's/![[:space:]]*//' |tr '\n' '\0' | xargs -0 svn --force rm

【讨论】:

  • “sed 's/![[:space:]]*//'”部分应为“sed 's/^![[:space:]]*//'”(注意额外的插入符号“^”),以便它只匹配“!” + 每行开头的空格,而不是中间的空格。
【解决方案5】:

我刚刚找到了这个,它可以解决问题,Remove all “missing” files from a SVN working copy

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' )

【讨论】:

  • 在 OS X 上为我工作。谢谢 :)
【解决方案6】:

实际上可以从 user3689460 和 Paul Martin 中完全删除 missing.list

for /F "tokens=* delims=! " %%A in ('svn status ^| findstr /R "^!"') do (svn delete "%%A")

【讨论】:

  • 供参考 - 这是 Windows 中的 DOS / cmd.exe
【解决方案7】:

感谢 Paul Martin 提供 Windows 版本。

这里对脚本稍作修改,因此也考虑了带有空格的 Windows 文件。最后,missing.list 文件也将被删除。

我将以下内容保存在我的 SVN bin 目录中的 svndel.bat 中(在我的 %%PATH 环境中设置),以便可以在命令提示符下从任何文件夹调用它。

### svndel.bat
svn status | findstr /R "^!" > missing.list
for /F "tokens=* delims=! " %%A in (missing.list) do (svn delete "%%A")
del missing.list 2>NUL

【讨论】:

  • 很高兴看到一些创新的批处理代码仍然出现:)
  • 哇,很好的答案。我正要使用 powershell,但这要容易得多。
  • 我在del missing.list 2>NUL 之后添加了另一行,因为我在第一次删除已删除的文件后直接添加了所有新文件,因此它将missing.list 添加到svn:svn delete "missing.list" 为我工作
  • 我已修改此脚本以尝试从任意位置运行,然后遇到此问题stackoverflow.com/questions/1137219/…,因此看来您必须使用当前工作目录来执行此操作。
【解决方案8】:

一种适用于 Linux (bash) 的替代方法,用于在路径中不包含空格的待删除文件:

svn 删除 `svn 状态 | grep! | awk '{print $2}'`

【讨论】:

    【解决方案9】:

    我喜欢 PowerShell 选项...但如果您使用的是 Windows 批处理脚本,这里还有另一个选项:

    svn status | findstr /R "^!" > missing.list
    for /F "tokens=2 delims= " %%A in (missing.list) do (svn delete %%A)
    

    【讨论】:

      【解决方案10】:

      对命令行稍作修改,可在 Mac OS 上运行(希望甚至在 Linux 上)并处理命令“svm sr”报告的文件,如“!M”(缺失和修改)。

      它处理文件中的空格。

      它基于对先前答案的修改:

      svn st | grep ! | sed 's/!M/!/' | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn --force rm
      

      【讨论】:

        【解决方案11】:

        此 shell 脚本递归检查项目中的 (svn status) 目录,删除丢失的文件(根据问题要求)将新文件添加到存储库。它是某种“将项目的当前快照存储到存储库中”。

        if [ $# != 1 ]
        then
            echo  "usage: doSVNsnapshot.sh DIR"
            exit 0
        fi
        
        ROOT=$1
        
        for i in `find ${ROOT} -type d \! -path "*.svn*" `
        do
        
            echo
            echo "--------------------------"
            ( cd $i ; 
            echo $i
            echo "--------------------------"
        
        
            svn status | awk '  
                    /^[!]/ { system("svn rm " $2) }
                    /^[?]/ { system("svn add " $2) }
                '
            )
            echo
        
        done
        

        【讨论】:

          【解决方案12】:

          处理大量文件时,xargs 的参数输入可能会变得太长。我选择了一个更天真的实现,它也适用于这种情况。

          这是针对 Linux 的:

          #! /bin/bash
          # 1. get all statii in the working copy
          # 2. filter out only missing files
          # 3. cut off the status indicator (!) and only return filepaths
          MISSING_PATHS=$(svn status $1 | grep -E '^!' | awk '{print $2}')
          # iterate over filepaths
          for MISSING_PATH in $MISSING_PATHS; do
              echo $MISSING_PATH
              svn rm --force "$MISSING_PATH"
          done
          

          【讨论】:

            猜你喜欢
            • 2011-06-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-01-07
            • 2018-10-06
            • 1970-01-01
            • 1970-01-01
            • 2023-01-18
            相关资源
            最近更新 更多