我有一个SVN工作目录。我在该目录中做了一些更改,它显示在svn状态中。但是有没有办法让我删除其中的所有更改,只使用命令行从主干中获取所有内容呢?
如果你没有改变,你总是可以非常彻底和/或懒惰地做……
rm -rf *
svn update
但是,不,真的,不要这样做,除非你真的确定从太空发射核武器是你想要的!!这样做的好处是可以销毁所有构建cruft、临时文件和SVN忽略的东西。
更正确的解决方案是使用revert命令:
svn revert -R .
-R使subversion递归并恢复当前工作目录下及以下的所有内容。
svn status | grep '^M' | sed -e 's/^.//' | xargs rm
svn update
将删除已修改的任何文件。我似乎记得当文件和目录可能已经添加时,在恢复时遇到了麻烦。
这里没有一个答案是我想要的。这是我想到的:
# 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本地正常变化
svn revert -R .
删除任何其他更改,并支持删除带有空格的文件/文件夹等。
svn status --no-ignore | grep -E '(^\?)|(^\I)' | sed -e 's/^. *//' | sed -e 's/\(.*\)/"\1"/' | xargs rm -rf
不要忘记从SVN获取最新的文件
svn update --force
如果你在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"
)
推荐文章
- 如何删除SVN工作目录中的所有更改?
- 提交前将文件“unadd”到SVN
- 如何查看最近的SVN日志条目?
- 如何丢弃SVN签出中的本地更改?
- 从SVN存储库中删除文件而不删除本地副本
- 如何移动文件?
- 什么原因导致SVN错误“Not a working copy”?
- 提交指定文件
- 我怎么能得到'查找'忽略。svn目录?
- 由于“之前的操作尚未完成”,Subversion被卡住?
- Subversion中的主干、分支和标签是什么?
- 哪些Eclipse文件属于版本控制?
- 命令行svn for Windows?
- 我如何移动一个文件(或文件夹)从一个文件夹到另一个在TortoiseSVN?
- 当“svn cleanup”失败时,我该怎么办?