是否有一个 Subversion 命令可以将工作副本完全“重置”为存储在存储库中的状态? git reset --hard
或(哈,Git 硬重置也不会删除未版本控制的文件!)rm -rf wc && svn co <url> wc
。
更新:我不是在进行简单的还原,因为这不会删除工作副本中的额外文件。我真的想要一些与删除工作副本并再次检查相同的东西,而无需再次下载数据。 (显然我不介意丢失所有未提交的更改。)
git clean -xdf
删除不受源代码控制的内容。
git clean
的手册页准确地引用了我正在寻找的内容:“这可以用来(可能与 git reset 结合使用)来创建一个原始工作目录来测试一个干净的构建。”可惜 Subversion 似乎没有内置这样的东西。
您可以像这样递归还原:
svn revert --recursive .
没有办法(不编写创意脚本)删除不受源代码控制的内容。我认为您可以做的最接近的方法是遍历所有文件,然后使用 grep svn list
的结果,如果 grep 失败,则将其删除。
编辑:广告脚本的解决方案在这里:Automatically remove Subversion unversioned files
因此,您可以创建一个脚本,将 revert
与链接问题中最适合您的答案结合起来。
恢复跟踪的文件
svn revert . -R
清理未跟踪的文件
svn status | rm -rf $(awk '/^?/{$1 = ""; print $0}')
-rf
一开始可能/应该看起来很吓人,但一旦理解它就不会因为以下原因:
只有完全未跟踪的目录才会匹配传递给 rm 的模式 -rf 是必需的,否则这些目录将不会被删除
恢复然后清理(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) ;)'
awk: fatal: error reading input file '-': Input/output error
awk
命令中转义 ?
,否则它匹配 svn status
输出中的所有行
使用以下命令删除本地副本中的所有内容:
rm -r your_local_svn_dir_path/*
并使用以下命令递归地还原所有内容。
svn revert -R your_local_svn_dir_path
这比删除整个目录然后重新签出要快得多,因为文件是从本地 SVN 元数据中恢复的。它甚至不需要网络连接。
删除未版本控制的文件并恢复任何更改:
svn revert D:\tmp\sql -R
svn cleanup D:\tmp\sql --remove-unversioned
出去:
D D:\tmp\sql\update\abc.txt
svn cleanup --remove-ignored
。仍然 - 最好的答案在这里。
svn revert . -R
重置一切。
svn revert path/to/file
对于单个文件
纯 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
从操作系统中删除工作副本并再次检查是最简单的,但显然不是一个命令。
非常快速和简单,完全符合您的要求
svn status | awk '{if($2 !~ /(config|\.ini)/ && !system("test -e \"" $2 "\"")) {print $2; system("rm -Rf \"" $2 "\"");}}'
/(config|.ini)/ 是出于我自己的目的。
将 --no-ignore 添加到 svn 命令可能是个好主意
删除未跟踪的文件
通过执行以下操作,我能够在 bash 中列出 svn st
报告的所有未跟踪文件:
echo $(svn st | grep -P "^\?" | cut -c 9-)
如果您觉得幸运,您可以将 echo
替换为 rm
以删除未跟踪的文件。如果您感觉不太幸运,或者手动复制要删除的文件。
(我使用@abe-voelker 的答案来还原剩余的文件:https://stackoverflow.com/a/6204601/1695680)
svn cleanup
。这是我在中止合并后清理的标准做法等等。