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

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

更新: 我不想要简单的恢复,因为这不会删除工作副本中的额外文件。我真的想要一些东西,这将是相同的删除工作副本和检出再次,只是不必下载的数据了。(显然,我不介意失去所有未提交的更改。)

121939 次浏览
svn revert . -R

重置一切。

svn revert path/to/file

for a single file

You can recursively revert like this:

svn revert --recursive .

There is no way (without writing a creative script) to remove things that aren't under source control. I think the closest you could do is to iterate over all of the files, use then grep the result of svn list, and if the grep fails, then delete it.

编辑: The solution for the creative script is here: Automatically remove Subversion unversioned files

因此,您可以创建一个脚本,将 revert与链接问题中最适合您的答案结合起来。

从操作系统中删除工作副本并再次检查它是最简单的,但显然不是一个单一的命令。

很快,很简单,做你想做的事

svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'

The /(config|.ini)/ is for my own purposes.

也许应该在 svn 命令中添加—— no-annon

纯 Windows cmd/bat 解决方案:

svn cleanup .
svn revert -R .
For /f "tokens=1,2" %%A in ('svn status --no-ignore') Do (
If [%%A]==[?] ( Call :UniDelete %%B
) Else If [%%A]==[I] Call :UniDelete %%B
)
svn update .
goto :eof


:UniDelete delete file/dir
IF EXIST "%1\*" (
RD /S /Q "%1"
) Else (
If EXIST "%1" DEL /S /F /Q "%1"
)
goto :eof

使用以下方法删除本地副本中的所有内容:

rm -r your_local_svn_dir_path/*

并使用下面的命令递归地恢复所有内容。

svn revert -R your_local_svn_dir_path

这比删除整个目录然后重新签出要快得多,因为这些文件是从您的本地 SVN 元数据还原的。它甚至不需要网络连接。

恢复跟踪文件

svn revert . -R

清除未追踪的文件

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

-rf一开始可能看起来很吓人,但一旦理解了它就不会这样了:

  1. 只有完全未跟踪的目录才会匹配传递给 rm的模式
  2. The -rf is required, else these directories will not be removed

恢复然后清洁(OP 问题)

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

为了持续易用

向.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) ;)'

删除未跟踪的文件

I was able to list all untracked files reported by svn st in bash by doing:

echo $(svn st | grep -P "^\?" | cut -c 9-)

如果你觉得幸运,你可以用 rm代替 echo来删除未跟踪的文件。或者复制你想要手动删除的文件,如果你觉得不那么幸运的话。


(我使用@abe-voelker 的回答恢复剩余的文件: https://stackoverflow.com/a/6204601/1695680)

删除未版本化的文件并恢复任何更改:

svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned

退出:

D         D:\tmp\sql\update\abc.txt