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

201

我有一个文件,它在 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

当你说“revert”时,你是什么意思?是指7年前的事吗?哈哈 - Kalpesh Soni
13个回答

190

9
但下次更新时,它会获取你不想要的文件回来... :S - andygoestohollywood
2
如果您不想要它,请将该文件提交到svn,以便将您想要的版本放入存储库。 - Packet Tracer
17
这可能实际上并不是问题提问者想要的。使用这个方法,工作副本是干净的,不能按原样提交,并且没有指定版本号的“svn update”将检索到最新的、不需要的版本。 - CXJ
1
我该如何提交已还原的文件呢? - marcio
4
这不完全正确,因为正如CXJ所提到的,没有一种方法可以提交更新后的文件。你可能想按照Mitch Dempsey所说的做(注意,需要使用--force强制覆盖文件):svn export --force -r 147 myfile.py myfile.py。 - benbotto
显示剩余2条评论

102

svn cat命令也可以接受一个版本参数!

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


31
这是页面上目前最好的答案。它将更改后的文件保持在可以提交的状态。 - dotancohen
当您将其粘贴到新文件中时,似乎无法正常工作。 - ahnbizcad
1
哈哈,回头看看,我不知道我发帖时在想什么背景。我记不起来了。它似乎毫无意义。 - ahnbizcad
这很简单直接,适用于当您只想撤消更改并将文件恢复到提交前的状态而不涉及任何版本控制技术细节。 - pretzlstyle

58
svn revert filename 

这应该撤销单个文件。


4
其他答案为什么命令更长?谢谢。 - masterxilo
他们已经上线了,而且时间更长了。我同意。 - Berry Tsakala
18
这需要回退到哪个版本?文档中只提到用最新版本替换。问题是如何回退到早期的版本。 - tgkprog
1
这将还原到仓库的最新版本。如果您阅读问题描述,似乎他正在寻找如何还原单个文件,而不是整个目录。 - thestar
5
我相信这样做的唯一作用就是通过“还原”将您的工作副本破坏掉,使其回到head或者检出的版本。确认方式是执行svn update -r VER file,然后再执行svn revert。 - Gerard ONeill
显示剩余2条评论

50

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

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

您可以执行 svn revert <file>,但这只能还原上一个工作副本。


2
将其导出,然后粘贴到本地副本中,再次提交? - tgkprog
1
@tgkprog 这是一种方法,是的。 - Mitch Dempsey
@tgkprog,什么是“首选”的方式? - hbogert
我不知道为什么,但这对我起作用了:导出过去的修订版本。在记事本中打开,复制,粘贴到工作文件中。使用注释将其提交到主干上,并说明修订版本和原因。UI 工具可能有更好的方法。 - tgkprog

27

迄今为止,这里所有的答案都有明显的缺点,要么很复杂(需要找到仓库URI),要么不能实现问题的真正需求:如何使用那个旧版本的文件将仓库恢复到工作状态。

svn merge -r head:[revision-number-to-revert-to] [file-path] 是我认为最干净、最简单的方法。请注意,如果是要恢复一个被删除的文件,则似乎不能使用这种方法[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?


我想指出,至少对于我的Subversion版本,“svn merge”由于某种原因不接受多个文件作为参数。在这种情况下,它似乎什么也没做(没有错误消息)。 - Wrzlprmft
但是我的命令仍然可以通过为每个文件重复执行来工作,对吗? - Michel Müller
是的,确实如此。 - Wrzlprmft
1
同意这是最干净的。 - KevinG

13

最好的方法是:

svn merge -c -RevisionToUndo ^/trunk

这将撤销所有修订版本的文件,而不仅仅是还原您不喜欢的文件。不要忘记在修订版本前加上破折号(-)。

svn revert File1 File2

现在提交更改。


11

您想要执行的操作是:

svn merge -r [要还原的版本]:[还原至哪个版本] [路径/文件名]

执行上述命令后,您将会得到该文件指定版本的可提交状态。请提交该文件。


9

很惊讶没有人提到这个

如果你只是提交了一些你想要撤销的内容,而不知道版本号,你可以编写以下代码。如果你改变了其他文件并且目标文件不是最后更改的文件,则此方法不起作用。

svn merge -r HEAD:PREV file

1
如果您有评论,请在进行编辑之前在此讨论? - Kalpesh Soni
1
问题场景不需要反向合并最近的更改吗?这意味着我们应该应用从HEAD到PREV所需的更改。 - Nick Russo
4
如@Nick Russo所说,命令应为 svn merge -r HEAD:PREV file - Heinz

7

我发现可以通过使用svn cat命令来完成这个操作,这样你甚至不需要指定一个版本。

svn cat mydir/myfile > mydir/myfile

这可能不会回滚inode(元数据)数据,例如时间戳。

然后提交文件,使其进入仓库。 - tgkprog
3
这对我来说比更新更有效。因为更新不允许您提交对该文件所做的修改。(svn 1.8.3) - fe_lix_

5

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

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

这将保存一个新的未版本化文件,例如file-xxxx,其中xxxx是旧的修订号。接下来我们该怎么做?删除新版本(如HEAD),重命名新文件,添加,提交? - Heinz
不要在文件名中保存修订号。请使用与当前版本相同的文件名保存(换句话说,文件名中不要有xxxx)。然后进行普通提交即可。 - bjaastad_e

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接