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

zou*_*oul 105 svn

是否有一个Subversion命令可以将工作副本"重置"到存储在存储库中的状态?类似的东西git reset --hard或(ha,硬Git重置也不会删除未版本控制的文件!)rm -rf wc && svn co <url> wc.

更新:我不是在简单的还原之后,因为它不会删除工作副本中的额外文件.我真的想要的东西与删除工作副本并再次检出它一样,只需要不必再次下载数据.(显然我不介意丢失所有未提交的更改.)

vcs*_*nes 173

你可以像这样递归恢复:

svn revert --recursive .

没有办法(没有编写创意脚本)删除不受源代码管理的东西.我认为你最接近的是遍历所有文件,然后使用grep结果svn list,如果grep失败,则删除它.

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

因此,您可以创建一个脚本,该脚本将revert链接问题中的任何答案组合在一起,最适合您.

  • 您可能还希望首先在wc上运行`svn cleanup`.这是我在中止合并之后进行清理的标准做法. (2认同)
  • 如果通过命令行可以使用“删除未版本控制的文件”,那就太好了。特别是对于自动构建。 (2认同)
  • 请参阅我的回答... - sove修复存在--remove-unversioned (2认同)

小智 36

要还原跟踪的文件

svn revert . -R
Run Code Online (Sandbox Code Playgroud)

清理未跟踪的文件

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

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

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

恢复然后清理(OP问题)

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

为了一致的易用性

为.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) ;)'
Run Code Online (Sandbox Code Playgroud)


小智 22

使用以下方法删除本地副本中的所

rm -r your_local_svn_dir_path/*
Run Code Online (Sandbox Code Playgroud)

并使用以下命令递归恢复所有内容.

svn revert -R your_local_svn_dir_path
Run Code Online (Sandbox Code Playgroud)

这比删除整个目录然后重新结账更快,因为文件正在从您本地的SVN元数据中恢复.它甚至不需要网络连接.

  • 更快的是svn cleanup --remove-unversioned. (3认同)

Abe*_*ker 7

svn revert . -R
Run Code Online (Sandbox Code Playgroud)

重置一切.

svn revert path/to/file
Run Code Online (Sandbox Code Playgroud)

对于单个文件


Den*_*erg 5

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

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned
Run Code Online (Sandbox Code Playgroud)

出:

D         D:\tmp\sql\update\abc.txt
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,无需额外编写脚本。这是通用的并且与许多 svn 版本兼容。 (2认同)