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

时间:2011-06-01 16:30:53

标签: svn

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

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

9 个答案:

答案 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最初可能/应该看起来很可怕,但一旦理解就不会出于以下原因:

  1. 只有完全未跟踪的目录才会匹配传递给rm
  2. 的模式
  3. -rf是必需的,否则这些目录不会被删除
  4. 要恢复然后清理(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) ;)'
    

答案 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