我有一个 SVN 工作目录。我对该目录进行了一些更改,它显示在 svn status
中。但是有什么方法可以让我删除其中的所有更改并使用命令行从主干中获取所有内容?
svn revert -R .
svn up
这将递归地还原当前目录及其下的所有内容,然后更新到最新版本。
我结合了其他人的答案来提出这个解决方案:
恢复正常的本地 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
svn revert -R .
svn cleanup . --remove-unversioned
svn cleanup . --remove-ignored
如果你没有改变,你总是可以非常彻底和/或懒惰并做......
rm -rf *
svn update
但是,不,真的,除非你真的确定 nuke-from-space 选项是你想要的,否则不要这样做!这样做的好处是还可以删除所有构建杂物、临时文件和 SVN 忽略的东西。
更正确的解决方案是使用 revert 命令:
svn revert -R .
-R 导致 subversion 递归并恢复当前工作目录中和下面的所有内容。
svn nuke-from-space
这里没有一个答案是我想要的。这是我想出的:
# 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
命令的命令,风险自负。
svn revert 将撤消您所做的任何本地更改
您可以使用以下命令还原所有本地更改:
svn st -q | awk '{print $2;}' | xargs svn revert
svn status | grep '^M' | sed -e 's/^.//' | xargs rm
svn update
将删除任何已修改的文件。我似乎记得在添加文件和目录时遇到问题。
如果您在 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"
)
不定期副业成功案例分享