是否有Subversion命令来重置工作副本?


110

是否有一个Subversion命令可以将工作副本“重置”为确切的状态,使其恢复到存储在存储库中的状态?喜欢的东西git reset --hard或(HA,硬的Git复位不要么删除版本的文件!) rm -rf wc && svn co <url> wc

更新:我不需要进行简单的还原,因为这不会删除工作副本中的多余文件。我真的想要一些与删除工作副本并再次签出相同的东西,而不必再次下载数据。(显然,我不介意丢失所有未提交的更改。)


还原工作副本中的所有更改?
mauris 2011年

5
git clean -xdf通常会删除不受源代码控制的内容。
vcsjones 2011年

1
@vcsjones:谢谢,手册页中的git clean引号正好是我要查找的内容:“可以使用它(可能与git reset结合使用)创建一个原始的工作目录,以测试干净的构建。” 可惜Subversion似乎没有内置的东西。
zoul 2011年

Answers:


180

您可以像这样递归还原:

svn revert --recursive .

没有办法(不编写创意脚本)除去不在源代码控制之下的内容。我认为您最能做的是遍历所有文件,然后使用grep的结果svn list,如果grep失败,则将其删除。

编辑:创意脚本的解决方案在这里:自动删除Subversion未版本化的文件

因此,您可以创建一个脚本,该脚本结合revert最适合您所链接问题中的任何答案的脚本。


3
您可能还想先svn cleanup在wc 上运行。这是我在中止合并后进行清理的标准做法。
Mike Miller

乌龟在清理对话框中还具有“删除未版本化的文件”选项。
v.oddou

2
如果可以通过命令行使用“删除未版本化的文件”,那就太好了。特别是对于自动构建。
C. Tewalt

3
看到我的回答...-移除svn清理已存在unversioned版本
Denny Weinberg

38

还原跟踪的文件

svn revert . -R

清理未跟踪的文件

svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

-rf会/应该看看吓人,但一旦了解它不会是这些原因:

  1. 只有完全未跟踪的目录才能匹配传递给的模式 rm
  2. -rf是必需的,否则这些目录将不被删除

恢复然后清理(OP问题)

svn revert . -R && svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')

始终如一的易用性

向您的.bash_aliases添加永久别名

alias svn.HardReset='read -p "destroy all local changes?[y/N]" && [[ $REPLY =~ ^[yY] ]] && svn revert . -R && rm -rf $(awk -f <(echo "/^?/{print \$2}") <(svn status) ;)'

awk: fatal: error reading input file '-': Input/output error
第二段

我必须?awk命令中转义,否则它与svn status
gpanders '18

23

使用以下命令删除本地副本中的所有内容:

rm -r your_local_svn_dir_path/*

然后使用以下命令以递归方式还原所有内容。

svn revert -R your_local_svn_dir_path

这比删除整个目录然后重新进行检出要快得多,因为正在从本地SVN元数据还原文件。它甚至不需要网络连接。


4
svn cleanup --remove-unversioned更快。
Znik

7
svn revert . -R

重设一切。

svn revert path/to/file

对于单个文件


1
那不会删除工作副本中多余的未版本化文件,对吗?
zoul 2011年

@zoul我不这么认为,但是由于我使用SVN已有一段时间了,所以请不要在此引用我的信息
Abe Voelker

不幸的是,它不会触摸未跟踪的文件。尝试svn revert -R your_local_svn_dir_path
Znik

7

删除未版本控制的文件并还原所有更改:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

出:

D         D:\tmp\sql\update\abc.txt

1
这是最好的答案,而无需其他脚本。这是通用的,并且与许多svn版本兼容。
Znik

3

纯Windows cmd / bat解决方案:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
     If [%%A]==[?] ( Call :UniDelete %%B
     ) Else If [%%A]==[I] Call :UniDelete %%B
   )
svn update .
goto :eof

:UniDelete delete file/dir
IF EXIST "%1\*" (
    RD /S /Q "%1"
) Else (
    If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

2

从操作系统中删除工作副本并再次检出是最简单的,但是显然不是一个命令。


痛苦的缓慢。这就是为什么我一直在寻找解决方法。
zoul 2011年

1
+1,这通常是解决奇怪问题的唯一方法,至少我已经发现了。
Brad 2012年

2

非常快速和简单,完全可以满足您的需求

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

/(config|.ini)/是我自己的目的。

将--no-ignore添加到svn命令可能是一个好主意


2
真可怕 Windows用户呢?在将Subversion视为版本控制工具之前,显然需要进行一些工作。
沃伦P

1

删除未跟踪的文件

svn st通过执行以下操作,我能够列出bash 报告的所有未跟踪文件:

echo $(svn st | grep -P "^\?" | cut -c 9-)

如果你感到幸运,你可以替换echorm删除未跟踪文件。如果感觉不太幸运,也可以手动复制要删除的文件。


(我使用@ abe-voelker的答案来还原其余文件:https ://stackoverflow.com/a/6204601/1695680 )

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.