2010-05-11 81 views
145

我在SVN回购中显示了一个文件,我想要恢复到以前的版本。在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 
+0

当你说回复,你是什么意思,7年前,大声笑 – 2017-02-21 03:08:09

回答

161

如果你只是想在你的工作拷贝旧文件:

svn up -r 147 myfile.py 

如果要回滚,看到这个“How to return to an older version of our code in subversion?”。

+6

,但下一次你更新它会得到你不想回来的文件...:S – andygoestohollywood 2013-11-15 09:53:40

+1

如果你不想回来, svn提交该文件,将你想要的版本加入回购 – 2014-01-27 10:21:22

+12

这可能实际上并没有做问题提供者想要的东西。使用它,工作副本是干净的,不能按原样提交,没有指定版本号的“svn update”将检索最新的不需要的版本。 – CXJ 2014-02-19 02:35:54

49

对于单个文件,你可以这样做:

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

你可以做svn revert <file>但只会恢复最后一个工作副本。

+2

出口,然后将其粘贴到您的本地副本,然后再次提交? – tgkprog 2013-09-17 18:53:30

+0

@tgkprog这是一种方法,是的 – 2013-09-17 20:59:42

+0

@tgkprog和什么是“首选”的方式? – hbogert 2014-10-28 08:43:51

13

最好的办法是:

svn merge -c -RevisionToUndo ^/trunk 

这将撤消不是简单地恢复那些你不喜欢撤消文件修订的所有文件。不要忘记破折号(-)作为修订的前缀。

svn revert File1 File2 

现在提交更改。

5

我发现通过svn cat命令执行此操作非常简单,因此您甚至不必指定修订。

​​

这可能不会回来角色索引节点(元数据)的数据,如时间戳。

+0

然后提交文件,以便它进入回购 – tgkprog 2013-09-17 18:54:38

+2

这对我的工作比更新更好。因为更新不允许您提交对该文件所做的修改。 (svn 1.8.3) – 2013-10-24 07:54:57

44
svn revert filename 

这应该还原单个文件。

+2

更长命令的其他答案是什么?谢谢。 – masterxilo 2014-08-06 12:50:49

+0

不客气。我不知道什么是与其他答案..大声笑 – thestar 2014-08-20 14:46:44

+0

他们起来,他们更长。我同意。 – 2014-09-02 10:49:19

41

svn猫也修改了arg!

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

+0

这工作得很好。谢谢。 – 2015-08-26 14:42:44

+11

**这是迄今为止页面上最好的答案。**它将更改后的文件保留在可提交的状态。 – dotancohen 2016-03-02 14:08:54

+0

当你粘贴到一个新文件 – ahnbizcad 2016-03-04 21:19:02

12

到目前为止,这里所有的答案似乎有显著缺点,很复杂(需要找到回购URI),或者他们不这样做的问题可能问:如何获得回购在工作状态与旧版本的文件

svn merge -r head:[revision-number-to-revert-to] [file-path]是IMO最干净和最简单的方法来做到这一点。请注意,带回删除的文件似乎并没有这样工作[1]。还可以看到以下问题:Better way to revert to a previous SVN revision of a file?

[1]对于要svn cp -r [rev-number] [repo-URI/file-path]@[rev-number] [repo-URI/file-path] && svn up,也看到What is the correct way to restore a deleted file from SVN?

+0

我想说的是,至少对于我的Subversion版本,'svn merge'由于某些原因不会将多个文件作为参数。在这种情况下,它似乎什么也没做(没有错误信息)。 – Wrzlprmft 2016-01-09 10:53:03

+0

但我的命令仍然对每个文件重复它的作品,对吧? – 2016-01-09 14:31:55

+0

是的,它的确如此。 – Wrzlprmft 2016-01-09 16:07:39

3

如果这只是一对夫妇的文件,如果你使用龟SVN,你可以用下面的办法:

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

这会保存一个新的未版本控制的文件,如file-xxxx,其中xxxx是旧版本号。我们接下来做什么?删除新版本(HEAD例如),重命名新文件,添加,提交? – Heinz 2018-01-19 15:49:06

+0

不,请勿将它与修订号一起保存在文件名中。使用与同一文件的当前版本完全相同的文件名保存它(换句话说,文件名中不包含xxxx)。然后在那之后做一个普通的提交。 – Elling 2018-02-06 23:56:39

3

惊讶提到这个

谁都没有查清的版本号,你可以写这篇文章,如果你只是承诺要恢复的东西,这不会工作,如果你改变了一些其他的文件和目标文件是不是最后更改的文件

svn merge -r PREV:HEAD file 
+0

如果您有意见,请在进行编辑之前在这里讨论? – 2017-11-17 17:24:14

+0

问题中的场景是否需要反向合并最近的更改,以便我们应该应用从HEAD到PREV所需的更改? – 2017-11-25 17:33:23

+0

该命令应该是'svn merge -r HEAD:PREV file' as @Nick Russo says – Heinz 2018-01-19 16:01:40

2

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

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

添加--force将覆盖与出口的本地副本,那么你可以做一个svn承诺将其推到仓库。

+0

and this is the best answer :) – Zgr3doo 2017-09-26 10:40:04

1

你想干什么

svn merge -r [revision to revert from]:[revision to revert to] [path/filename]

一旦你这样做,你将有该文件的修订工作时在可提交状态。提交文件。

相关问题