如何删除我的SVN工作目录中的所有更改?


195

我有一个SVN工作目录。我在该目录中进行了一些更改,并显示在中svn status。但是我有什么办法可以删除其中的所有更改,并仅使用命令行从中继中获取所有内容?

Answers:


274
svn revert -R .
svn up

这将递归还原当前目录及其下的所有内容,然后更新到最新版本。


2
请注意,这不适用于外部组件(貌似它们被忽略了)。
cic

86

我结合了其他人的答案来提出以下解决方案:

恢复正常的本地SVN更改

svn revert -R .

删除任何其他更改,并支持删除带有空格等的文件/文件夹。

svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf

不要忘记从SVN获取最新文件

svn update --force

非常感谢Shaize,这是最优雅的sed,...到目前为止,我已经看到它了:)特别要注意忽略。
欺负者

奇迹般有效。谢谢!
NiiloKeinänen19年

28
svn revert -R .
svn cleanup . --remove-unversioned

它不会删除* .class文件等
。– Trismegistos

2
如果您还想删除忽略的文件svn cleanup . --remove-ignored
Kip

14

如果您没有任何变化,那么您始终可以做到彻底彻底和/或懒惰,然后做...

rm -rf *
svn update

但是,除非您确实确定要使用“ nuke-from-space”选项,否则要这样做。这样做的好处是还限制了所有构建文件,临时文件以及SVN忽略的内容。

更正确的解决方案是使用revert命令:

svn revert -R .

-R导致Subversion递归并还原当前工作目录中及其下的所有内容。


我经常使用此技巧,但是在SVN 1.7中,元数据仅存储在WC根目录中,这不再是干净的解决方案。例如,已删除的文件保持删除状态。
巴特面包车Heukelom

8
svn nuke-from-space
2014年

9

这里没有答案完全是我想要的。这是我想出的:

# Recursively revert any locally-changed files
svn revert -R .

# Delete any other files in the sandbox (including ignored files),
# being careful to handle files with spaces in the name
svn status --no-ignore | grep '^\?' | \
    perl -ne 'print "$1\n" if $_ =~ /^\S+\s+(.*)$/' | \
    tr '\n' '\0' | xargs -0 rm -rf

在Linux上测试;也许可以在Cygwin中工作,但是(我相信)依赖于GNU特定的扩展,该扩展允许xargs拆分'\0'而不是基于空格。

上面命令的优点是它不需要任何网络活动即可重置沙箱。您将获得与以前完全一样的东西,并且丢失所有更改。(在有人责怪我破坏该代码的工作之前,免责声明);-)

我在持续集成系统上使用此脚本,在该系统上我想确保在运行一些测试后执行干净的构建。

编辑:我不确定这适用于所有版本的Subversion。目前尚不清楚svn status命令是否始终保持一致的格式。与使用此类统括rm命令的任何命令一样,使用时需自担风险。


7

svn revert将撤消您所做的任何本地更改


5

您可以使用以下命令还原所有本地更改:

svn st -q | awk '{print $2;}' | xargs svn revert

我收到错误消息“参数不足”以进行svn还原
循环

4
svn status | grep '^M' | sed -e 's/^.//' | xargs rm

svn update

将删除任何已修改的文件。我似乎记得在添加文件和目录时无法恢复。



0

如果您在Windows上,则以下for循环将还原对工作区所做的所有未提交的更改:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)

如果要删除所有未提交的更改和所有未版本控制的对象,则将需要2个循环:

for /F "tokens=1,*" %%d in ('svn st') do (
  svn revert "%%e"
)
for /F "tokens=1,*" %%d in ('svn st') do (
  svn rm --force "%%e"
)
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.