ChatGPT解决这个技术问题 Extra ChatGPT

SVN命令删除所有本地丢失的文件

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

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

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

P
Peter Mortensen

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

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

所以完整的命令是:

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

参考:

使用 awk 检查字段(列)

使用 xargs 运行带参数的 shell 命令


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

如果您使用的是 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插件的方法?更新 a 然后在项目中找到它们并再次删除它们真是太糟糕了。
仅供参考,如果需要颠覆密码,语法如下: 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服务器恢复的
此操作是否也会从存储库中删除文件?
P
Peter Mortensen
svn st | grep ! | cut -d! -f2| sed 's/^ *//' | sed 's/^/"/g' | sed 's/$/"/g' | xargs svn rm

svn status 仅对丢失的文件进行过滤 删除感叹号 过滤掉尾随空格 添加前导引号 添加尾随引号 svn 删除每个文件


如果文件/目录中有空格,则此解决方案有效。
如何为此添加详细信息? xargs -verbose svn rm ?
只是对脚本等用户的提示,如果找不到要删除的文件,此命令将失败:svn:E205001:尝试'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
b
brasofilo

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

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

在 OS X 上为我工作。谢谢 :)
P
Peter Mortensen

感谢 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/…,因此您似乎必须使用当前工作目录来执行此操作。
P
Peter Mortensen

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

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

A
Amfasis

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

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

供参考 - 这是 Windows 中的 DOS / cmd.exe
g
gilyen

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

svn delete `svn status | grep ! | awk '{print $2}'`

c
cibercitizen1

此 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

P
Peter Mortensen

对命令行稍作修改,可在 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

J
Jonas Eberle

在处理大量文件时,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

Z
Zeta

改良版

所以完整的命令是:

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

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