将SVN中的单个文件还原到特定版本


180

我在SVN存储库中有一个如下所示的文件,我想还原到以前的版本。在SVN中执行此操作的方式是什么?我只想将此特定文件降级到较旧的版本,而不是整个存储库。

谢谢。

$ svn log myfile.py
----------------------
r179 | xx | 2010-05-10

Change 3
----------------------
r175 | xx | 2010-05-08

Change 2
----------------------
r174 | xx | 2010-05-04

Initial

当您说还原时,您的意思是什么,7年前,大声笑
Kalpesh Soni

Answers:


181

如果只想在工作副本中使用旧文件:

svn up -r 147 myfile.py

如果要回滚,请参见“ 如何在Subversion中返回我们的代码的较旧版本? ”。


8
但是下次更新时,它会得到您不想要的文件...:S
andygoestohollywood 2013年

2
如果你不想回去,SVN提交这个文件,把你想成回购的版本
Packet Tracer中

14
这可能实际上并没有解决问问者想要的问题。使用此功能,工作副本是干净的,无法按原样提交,并且未指定版本号的“ svn更新”将检索最新的不需要的版本。
CXJ 2014年

1
那我该如何提交还原的文件?
marcio

2
这不太正确,因为正如CXJ所提到的,没有一种方法可以提交更新的文件。您可能想要按照Mitch Dempsey所说的去做(但是请注意--force强制覆盖文件):svn export --force -r 147 myfile.py myfile.py
avejidah 2016年

75

svn cat也需要一个修订版arg!

svn cat -r 175 mydir/myfile > mydir/myfile


19
到目前为止,这是该页面上的最佳答案。它将更改后的文件保持在可以提交的状态。
dotancohen

当您粘贴到新文件中时,这似乎不起作用
ahnbizcad

哈哈回头看,idk我发帖时在想什么背景。我不记得了 这似乎是荒谬的。
ahnbizcad '16

当您只想撤消更改并使文件恢复到预提交状态而无需任何版本控制技术时,这是简单明了的。
匿名

57
svn revert filename 

这应该还原一个文件。


4
使用较长命令的所有其他答案如何处理?谢谢。
masterxilo 2014年

别客气。我不知道其他答案是什么..大声笑
thestar

13
恢复到哪个版本?Doc说,只是用最新的仓库来代替。问题是如何还原到早期版本。
tgkprog 2014年

1
这将恢复为最新版本的repo。如果您阅读了问题的描述,似乎他在寻找如何还原单个文件而不是整个目录的方法。
Thestar 2014年

5
我相信所有这些都是通过“还原”到头来破坏您的工作副本。或曾经签到的。通过执行svn update -r VER文件进行确认,然后执行svn还原。
Gerard ONeill 2015年

49

对于单个文件,您可以执行以下操作:

svn export -r <REV> svn://host/path/to/file/on/repos file.ext

您可以这样做,svn revert <file>但这只会还原最后一个工作副本。


2
导出,然后将其粘贴到本地副本,然后再次提交?
tgkprog 2013年

1
@tgkprog是做到这一点的一种方法,是的
Mitch Dempsey

@tgkprog,“首选”方式是什么?
hbogert 2014年

不知道,但是那对我有用:导出了过去的修订版。在记事本中打开,复制,粘贴到工作文件中。承诺首先评论哪个版本以及原因。UI工具可能有更好的方法。
tgkprog 2014年

20

到目前为止,这里的所有答案似乎都有很大的弊端,很复杂(需要找到存储库URI),或者它们没有执行可能要问的问题:如何使用旧版本的Repo再次使存储库恢复工作状态文件

svn merge -r head:[revision-number-to-revert-to] [file-path]IMO是最干净,最简单的方法。请注意,带回已删除的文件似乎无法这种方式[1]。另请参阅以下问题:还原到文件的先前SVN版本的更好方法?

[1]为此svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up,请参见从SVN恢复已删除文件的正确方法是什么?


我想指出,至少出于我的Subversion版本,svn merge出于某种原因,它不将多个文件作为参数。在这种情况下,它似乎什么也不做(没有错误消息)。
Wrzlprmft

但是我的命令仍然可以通过对每个文件重复它来起作用,对吗?
米歇尔·穆勒

是的,的确如此。
Wrzlprmft

1
同意这是最干净的。
KevinG

13

最好的方法是:

svn merge -c -RevisionToUndo ^/trunk

这将撤消修订的所有文件,而不仅仅是还原您不希望撤消的那些文件。不要忘记破折号(-)作为修订的前缀。

svn revert File1 File2

现在,将更改提交回来。



7

我发现通过 svn cat命令因此您甚至不必指定修订版本。

svn cat mydir/myfile > mydir/myfile

这可能不会起到回退inode(元数据)数据(例如时间戳)的作用。


然后提交文件,以便将其转到存储库
tgkprog

3
这对我来说比更新更好。因为更新不允许您提交对该文件所做的修改。(svn 1.8.3)
fe_lix_

7

惊讶的是没有人提到这个

无需找出修订版本号就可以编写此代码,如果您只是提交了要还原的内容,那么如果您更改了其他文件并且目标文件不是最后更改的文件,则此操作将无效

svn merge -r HEAD:PREV file

如果您有意见,请在编辑之前在这里讨论?
Kalpesh Soni

1
问题中的场景是否不需要反向合并最近的更改,以便我们应该应用从HEAD到PREV所需的更改?
尼克·鲁索

4
该命令应该是 svn merge -r HEAD:PREV file如@Nick Russo所说
Heinz

4

如果只有几个文件,并且使用的是Tortoise SVN,则可以使用以下方法:

  1. 右键单击源文件,然后选择“ TortoiseSVN”->“显示日志”。
  2. 右键单击日志中的修订,然后选择“将修订保存到...”。
  3. 让旧版本覆盖您的当前文件。
  4. 提交覆盖的源文件。

这将保存一个新的未版本化文件,例如file-xxxx,其中xxxx是旧的修订版号。接下来我们要做什么?删除新版本(例如HEAD),重命名新文件,添加,提交?
亨氏

否,请勿将其与版本号一起保存。使用与同一文件的当前版本完全相同的文件名保存它(换句话说,文件名中没有xxxx)。然后在那之后做一个普通的提交。
Elling

4

只是添加到@Mitch Dempsy答案,因为我没有足够的代表评论。

svn export -r <REV> svn://host/path/to/file/on/repos --force

添加--force将用导出覆盖本地副本,然后您可以执行svn commit来将其推送到存储库。


这是最好的答案:)
Zgr3doo

为什么这是最佳答案?它无法以“ svn方式”管理历史
Jason S

2

单个文件的替代选项是用较旧的版本“替换”文件的当前版本:

svn rm file.ext
svn cp svn://host/path/to/file/on/repo/file.ext@<REV> file.ext
svn ci

它具有附加功能,不需要的更改不会显示在该文件的日志中(即svn log file.ext)。


1

如果要回滚特定修订版本中的单个文件并能够提交,请执行以下操作:

svn merge -c-[OldRev#] [文件名]

即。 svn merge -c -150 myfile.py

注意修订号上的负号


-1
sudo svn revert filename

这是还原单个文件的更好方法


1
我真的希望您永远不要接近拥有sudoer权限的生产机器。
David Lakatos
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.