ChatGPT解决这个技术问题 Extra ChatGPT

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

svn

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

更新:我不是在进行简单的还原,因为这不会删除工作副本中的额外文件。我真的想要一些与删除工作副本并再次检查相同的东西,而无需再次下载数据。 (显然我不介意丢失所有未提交的更改。)

还原工作副本中的所有更改?
您将使用 git clean -xdf 删除不受源代码控制的内容。
@vcsjones:谢谢,git clean 的手册页准确地引用了我正在寻找的内容:“这可以用来(可能与 git reset 结合使用)来创建一个原始工作目录来测试一个干净的构建。”可惜 Subversion 似乎没有内置这样的东西。

C
Community

您可以像这样递归还原:

svn revert --recursive .

没有办法(不编写创意脚本)删除不受源代码控制的内容。我认为您可以做的最接近的方法是遍历所有文件,然后使用 grep svn list 的结果,如果 grep 失败,则将其删除。

编辑:广告脚本的解决方案在这里:Automatically remove Subversion unversioned files

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


您可能还想先在 wc 上运行 svn cleanup。这是我在中止合并后清理的标准做法等等。
tortoise 在清理对话框中还有一个“删除未版本控制的文件”选项。
如果可以通过命令行使用“删除未版本控制的文件”,那就太好了。特别是对于自动化构建。
看我的回答... --remove-unversioned 存在于 svn cleanup
P
Peter Mortensen

恢复跟踪的文件

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 输出中的所有行
P
Peter Mortensen

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

rm -r your_local_svn_dir_path/*

并使用以下命令递归地还原所有内容。

svn revert -R your_local_svn_dir_path

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


更快的是 svn cleanup --remove-unversioned 。
D
Denny Weinberg

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

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

出去:

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

这是最好的答案,无需额外的脚本。这是通用的并且与许多 svn 版本兼容。
我也需要/想要svn cleanup --remove-ignored。仍然 - 最好的答案在这里。
A
Abe Voelker
svn revert . -R

重置一切。

svn revert path/to/file

对于单个文件


这不会删除工作副本中额外的未版本控制文件,是吗?
@zoul我不这么认为,但不要引用我的话,因为我已经有一段时间没有使用SVN了
不幸的是,它不会触及未跟踪的文件。尝试 svn revert -R your_local_svn_dir_path
P
Peter Mortensen

纯 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

佚名

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


痛苦的慢。这就是为什么我一直在寻找解决这个问题的方法。
u
user1299374

非常快速和简单,完全符合您的要求

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

/(config|.ini)/ 是出于我自己的目的。

将 --no-ignore 添加到 svn 命令可能是个好主意


这太可怕了。 Windows 用户呢? Subversion 显然需要做一些工作才能被认真对待作为版本控制工具。
C
Community

删除未跟踪的文件

通过执行以下操作,我能够在 bash 中列出 svn st 报告的所有未跟踪文件:

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

如果您觉得幸运,您可以将 echo 替换为 rm 以删除未跟踪的文件。如果您感觉不太幸运,或者手动复制要删除的文件。

(我使用@abe-voelker 的答案来还原剩余的文件:https://stackoverflow.com/a/6204601/1695680