是否有单个Subversion命令将工作副本“重置”到存储在存储库中的状态?类似于git reset --hard
或(ha,硬Git重置不会删除未版本控制的文件!)rm -rf wc && svn co <url> wc
。
更新:我不是在简单的还原之后,因为它不会删除工作副本中的额外文件。我真的想要的东西与删除工作副本并再次检出它一样,只需要不必再次下载数据。 (显然我不介意丢失所有未提交的更改。)
答案 0 :(得分:164)
您可以像这样递归还原:
svn revert --recursive .
没有办法(没有编写创意脚本)删除不受源代码管理的内容。我认为你最接近的是遍历所有文件,然后使用grep svn list
的结果,如果grep失败,则删除它。
修改强>: 广告素材脚本的解决方案如下:Automatically remove Subversion unversioned files
因此,您可以创建一个脚本,将revert
与链接问题中的任何答案结合起来,最适合您。
答案 1 :(得分:33)
svn revert . -R
svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')
-rf
最初可能/应该看起来很可怕,但一旦理解就不会出于以下原因:
rm
-rf
是必需的,否则这些目录不会被删除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) ;)'
答案 2 :(得分:22)
使用以下方法删除本地副本中的所有内容:
rm -r your_local_svn_dir_path/*
使用以下命令递归恢复所有内容。
svn revert -R your_local_svn_dir_path
这比删除整个目录然后重新结账更快,因为文件正在从您本地的SVN元数据中恢复。它甚至不需要网络连接。
答案 3 :(得分:7)
svn revert . -R
重置所有内容。
svn revert path/to/file
单个文件
答案 4 :(得分:5)
删除未版本控制的文件并还原所有更改:
svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned
输出:
D D:\tmp\sql\update\abc.txt
答案 5 :(得分:3)
Pure 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
答案 6 :(得分:2)
从操作系统中删除工作副本并再次检查是最简单的,但显然不是一个命令。
答案 7 :(得分:2)
非常快速和简单,完全符合您的要求
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(config | .ini)/是出于我自己的目的。
将-no-ignore添加到svn命令
可能是个好主意答案 8 :(得分:1)
我能够通过以下方式列出bash中svn st
报告的所有未跟踪文件:
echo $(svn st | grep -P "^\?" | cut -c 9-)
如果您感到幸运,可以将echo
替换为rm
以删除未跟踪的文件。如果您感觉不太幸运,可以手动复制要删除的文件。
(我用@ abe-voelker的回答来还原剩余的文件:https://stackoverflow.com/a/6204601/1695680)