在Subversion中取消删除文件的简单方法是什么?


74

这些说明有些令人生畏和令人困惑:http : //svnbook.red-bean.com/en/1.0/ch04s04.html#svn-ch-4-sect-4.3。而且,他们似乎也没有提到如果您在执行svn rm[1]之后仍未签到,这会简单得多。

因此,我认为这是为那些使用谷歌搜索技术的人记录一个简单答案的好地方。

[1]对于svn新手,似乎“ svn rm”立即破坏了文件。我记得svn rm当时有种想法,那就是将其从源代码管理中删除,并在文件本身实际消失时吓坏了。因此,有一个子问题是,从版本控制中删除文件而不实际删除本地副本的正确方法是什么?


svn status | grep "^D" | awk '{print $2}' | xargs svn revert
fiorentinoing

Answers:


89

如果你只是做了

svn rm foo.txt

那么您可以简单地撤消

svn revert foo.txt

如果您在执行“ svn rm”之后已经签入,则可以查看日志(svn log),找到文件所在的最新修订,然后从该版本中获取它。

一种方法是在具有该文件的旧修订版中合并。假设当前版本为123,而该文件的最新版本为120,则执行以下操作:

svn merge -r123:120

也许首先进行一次试运行,以确保它不会做您不想要的任何事情:

svn --dry-run merge -r123:120

对于子问题,如何从svn中删除文件而不删除本地副本:

svn rm foo.txt --keep-local

或者,当然,您可以只在svn rming前复制到临时文件,然后再复制回去:

cp foo.txt foo.txt-tmp
svn rm foo.txt
(svn ci -m "just removed foo.txt from the repository")
cp foo.txt-tmp foo.txt

1
合并的问题在于,它会丢失文件的先前历史记录。斯蒂芬答案中详细介绍的svn cp可能更好,也更容易理解。
阿维(Avi)2010年

好的答案,救了我一天。谢谢!pls1
雅致的用户,

我发现如果更改版本顺序,它只是将已删除的文件添加到当前工作副本中,而没有其他更改未删除的文件,例如svn merge -r120:123 svn_url .
zhuguowei

svn revert没有递归工作,我不得不做svn stat | egrep ^D | cut -c8- | xargs svn revert
Axel Bregnsbo '16

我的“反向合并”问题是,它创建了树冲突。
UncaAlby

43

出于某种原因,该-rarg不适用于我(svn版本1.6.9)。我在之前和之后进行了尝试src,但始终收到一条消息,指出当前版本(duh)中找不到该文件。与--revision相同。使用@样式语法可以:

svn cp url/to/removed/foo.txt@4 foo.txt

永远不知道确定最后一个工作版本的最简单方法是什么,但这句话是黄金。
BernhardDöbler'17

@style语法是什么?
费迪南多·兰迪西

通常,您-r需要指定一个修订号(请参阅修订说明符)。该@符号用于钉钉修订(请参见钉钉和操作修订
Michael Rush

1
如果您不想为自己的存储库找到实际的URL而烦恼,可以^/path/from/repo/root改用。例如,在我的情况下,我曾经^/trunk/path/to/my/file.js还原了原来位于path/to/my/file.js工作副本(即^/trunk)中的文件。
埃里克·海斯特兰德

这个答案为我一直很困惑的概念提供了很多清晰度。我也无法使用-r <先前版本>“删除”文件,并显示一条错误消息,指出该文件不在当前版本中。阅读上述有关peg修订版本的链接后,我认为这意味着颠覆希望我的标志文件所在的确存在指定peg修订版本问心无愧的,所以它知道的oldfile.c我所要求的(潜在的)进行复制。
SirNickity

31

要删除文件但将其保留在工作副本中,请使用

svn rm foo.txt --keep-local

要在提交删除后取回文件,可以使用merge命令或copy命令-两者都将保留文件历史记录。由于合并方式已经在其他地方介绍过,因此这里是复制方式:

svn rm foo.txt
svn ci foo.txt -m "removed file"
(now at r5 as an example)
svn cp url/to/removed/foo.txt -r4 foo.txt
svn ci foo.txt -m "got file back"

7
为了使我工作,复制命令必须有所不同:svn cp url/to/removed/foo.txt@4 -r4 foo.txt ----如果没有@ 4,则会出现“找不到路径”错误
Barth 2012年

1
是的,对我来说,通过svn info在目录中运行并查看“ URL”字段,我发现“ URL /到/已删除” 。然后,我还必须执行“ @ 4”技巧,而不必使用“ -r4”。有趣的是,除了删除条目外,还恢复了文件日志历史记录!
Heath Raftery

6

对于TortoiseSVN用户,可以通过回购浏览器轻松完成此操作。在Repo Browser中,在删除文件之前切换到修订版本(您可以使用右上方的“ Revision:”按钮更改版本):

在此处输入图片说明

然后,您应该能够在Repo Browser中的原始位置看到已删除的文件。右键单击它,然后选择“复制到工作副本...”:

在此处输入图片说明

然后,该文件将还原到准备提交的工作副本中(就像添加了svn一样),并且其日志历史记录保持不变。


4

在SVN中还原已删除的文件。在删除之前查找修订号(例如341)。然后将该文件单独还原为该修订号。

svn up -r341 [path_to_deletedFile]

2
这将获得另一个本地副本,但是文件在存储库中仍被“删除”。您的下一个“ svn up”将消失。
UncaAlby

1

我使用乌龟使用了先前版本的复制菜单项,为我工作并保留了历史记录。


2
听起来很有前途,您能提供更多细节吗?您究竟从哪里发出copy命令?
VdesmedT
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.