ChatGPT解决这个技术问题 Extra ChatGPT

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

svn

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


M
Mike McQuaid
svn revert -R .
svn up

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


请注意,这不适用于外部(它们似乎被忽略了)。
P
Peter Mortensen

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

恢复正常的本地 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,... 管道 :) 尤其要注意忽略。
奇迹般有效。谢谢!
l
lexa-b
svn revert -R .
svn cleanup . --remove-unversioned

它不会删除 *.class 文件等。
如果您还想删除被忽略的文件 - svn cleanup . --remove-ignored
b
bbum

如果你没有改变,你总是可以非常彻底和/或懒惰并做......

rm -rf *
svn update

但是,不,真的,除非你真的确定 nuke-from-space 选项是你想要的,否则不要这样做!这样做的好处是还可以删除所有构建杂物、临时文件和 SVN 忽略的东西。

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

svn revert -R .

-R 导致 subversion 递归并恢复当前工作目录中和下面的所有内容。


我经常使用这个技巧,但是在 SVN 1.7 中,元数据只存储在 WC 根目录中,这不再是以前的干净解决方案。例如,已删除的文件仍然被删除。
svn nuke-from-space
m
mpontillo

这里没有一个答案是我想要的。这是我想出的:

# 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 命令的命令,风险自负。


S
Sean

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


P
Peter Mortensen

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

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

我收到 svn revert 的错误消息“没有足够的参数”
J
Juan
svn status | grep '^M' | sed -e 's/^.//' | xargs rm

svn update

将删除任何已修改的文件。我似乎记得在添加文件和目录时遇到问题。


N
Nick Van Brunt
D
David

如果您在 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"
)