如何在Subversion中返回代码的旧版本?


486

我正在与一个朋友一起进行项目,我想返回到我们的代码的旧版本并将其设置为当前版本。我该怎么做?

我在vs08上使用“ anksvn”。

我的PC上有我想要的版本,但是提交失败。我收到的消息是“提交失败,文件或目录已过期”。

我的PC上也有Subversion客户端。

Answers:


783

基本上,您需要“向后合并”- 在当前版本和先前版本之间应用差异当前版本(这样您最终得到的工作副本看起来就像旧版本一样),然后再次提交。例如,从修订版150(当前)回到修订版140:

svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"

《 Subversion红皮书》对此有很好的介绍


3
但是合并不会覆盖我的更改和新修订。
Chen Kinnrot 09年

76
如果您使用的是TortoiseSVN,请右键单击该文件,然后选择“合并”,然后选择“合并修订范围”。在日志框中输入140-150,然后单击“反向复选框”。之后,像往常一样提交。这将执行与Jon的示例相同的操作。
DavGarcia

8
使用eclipse和subclipse,您可以右键单击您的项目“团队/显示历史记录”,然后选择要“撤消”的修订,然后再次右键单击选择“从选定的修订中还原更改”。
fego 2012年

36
要从头部修订版还原,您也可以编写svn merge -r HEAD:140
sschmeck

3
@DavGarcia的TortoiseSVN指令不适合我,至少不还原版本中的所有文件(使用TortoiseSVN 1.8.8)。右键单击该文件夹,选择TortoisSVN-> Show log。选择要还原的修订,右键单击,例如“还原此修订的更改”。提交更改。
mhenry1384 2014年

177

您只能在Subversion历史记录的顶部提交新更改。

您无法直接对PC上的优质副本执行任何操作的原因是,其.svn文件夹知道它是过去的代码,因此在提交之前需要进行更新。

找到好的修订号并还原

  1. 查找所需的旧副本的修订号。

    通过以下方式获取当前版本:

    svn info --show-item revision
    # or
    svn log

    或要检查项目的版本,请使用:

    svn update -r <earlier_revision_number>

    直到找到正确的修订号。

  2. 记下好的修订号(假设123下面的示例)。

  3. 更新到最新版本:

    svn update
  4. 撤消您想要的修订和最新版本之间的所有更改:

    svn merge -r HEAD:123 .
    svn commit "Reverted to revision 123"

    (与上述乔恩·斯基特的答案相同。)

如果找不到修订号

如果找不到旧副本,而只想提交当前在PC上的文件:

  1. 制作一个好版本的副本(但不带任何.svn文件夹):

    cd ..
    rsync -ai --exclude=.svn  project/  project-good/
  2. 现在确保您具有最新版本:

    cd project
    svn update
    # or make a fresh checkout
    svn checkout <url>
  3. 将好的版本复制到工作副本的顶部。

    此命令将进行复制,并从工作树中删除所有不在您的良好副本中的文件,但不会影响现有.svn文件夹。

    cd ..
    rsync -ai --exclude=.svn --delete  project-good/  project/

    如果没有rsync,则可以使用,cp -a但还需要手动删除所有不需要的文件。

  4. 您应该能够落实您现在拥有的东西。

    cd project
    svn commit "Reverted to good copy"

2
svn不会将其解释为修改,我无法提交。
桑德堡

svn merge -r头:12345 是还原的正确命令,请勿执行更新-r。你这个疯子。
猫头鹰

我猜这个答案被找不到修订号或赞赏主要解释的人所推崇。我现在更新了答案,以包括两种方法。
joeytwiddle

36

只需使用此行

svn update -r yourOldRevesion

您可以使用以下方法了解您的当前修订:

svn信息


15
这不能解决问题。取而代之的是,这产生了提问者在问他们的问题时所处的状态。
Ingo Schalk-Schupp,2015年

1
如果您不幸地遵循了此建议,请运行:“ svn resolve --accept working -R”。
猫头鹰

27

如果您要这样做,则使用合并撤消整个签入的标准方法非常有用。但是有时候,您要做的只是还原单个文件。没有合法的方法可以做到这一点,但是有一个hack:

  1. 使用svn日志找到所需的版本。
  2. 使用svn的export子命令:

    svn导出http:// url-to-your-file @ 123 / tmp / filename

(其中123是该文件的正确版本的修订号。)然后移动或复制该单个文件以覆盖旧文件。签入修改后的文件,即可完成操作。


使用Tortoise-svn,我可以右键单击单个文件并将其合并。还应该有一种方法可以使用svn吗?
lc。

10
svn cat -r 123 path-in-your-working-copy > path-in-your-working-copy
dash17291 2013年


5

我认为这是最合适的:

例如,如果提交的代码包含从rev 5612到5616的修订版,请向后合并,只需将其向后合并。它对我有效。

例如:

svn merge -r 5616:5612 https://<your_svn_repository>/

它包含一个合并的代码,可以还原到以前的版本,然后可以提交它。


3

这就是我为我所做的工作。

我想撤消我在某些时间所做的多次提交中的更改,并想转到上一个提交点。

  1. 转到团队->显示历史记录。
  2. 右键单击要忽略的修订版本或范围。
  3. 选择“还原更改”选项。

这将运行反向合并,撤消工作副本中的更改。

只需查看代码并提交。



2

先前的大多数答案都是使用反向合并,通常这是正确的答案。但是,有一种情况(只是发生在我身上)没有。

进行小的更改时,我不小心将Unix行尾的文件更改为DOS行尾,并提交了它。通过更改行尾并再次提交或通过反向合并,可以很容易地撤消此操作,但是这样做的效果是使svn blame我的编辑列表成为文件每一行的源。(有趣的是,Windows上的TortoiseSVN不受此影响;仅受命令行影响svn blame。)

如果您想保留所报告的历史记录svn blame,我认为您需要执行以下操作:

  • 删除文件并提交。
  • 在存储库中,将文件的先前完整副本复制到头部,然后提交。
  • 恢复您要保留的所有编辑。

删除有些吓人,但请记住您始终将文件保存在存储库中,因此恢复它并不是什么大问题。这是一些代码来说明这些步骤。假定这xxx是最后一个好的副本的修订版号。

svn rm svn+ssh://path/to/file
svn copy svn+ssh://path/to/file@xxx svn+ssh://path/to -m"Restore good copy"
svn update
<restore the edits>
svn commit -m"Restore edits"

请注意,对于存储库中的副本,目标位置必须是目录,而不是文件名。


1

右键单击项目>替换为>修订或URL>选择要还原的特定修订。

现在将本地更新代码版本提交到存储库。这会将代码库还原为特定的修订版。


1

此页面上有很多危险的答案。请注意,从SVN 1.6版开始,执行update -r可能会导致树冲突,从而迅速升级为潜在的数据丢失的卡夫式睡梦night,您正在其中搜索有关树冲突的信息。

还原到版本的正确方法是:

svn merge -r HEAD:12345 .

其中12345是版本号。不要忘记点。


0

同步到旧版本并提交。这应该可以解决问题。

也是撤销更改的说明。


0

乔恩·斯凯特(Jon Skeet)的答案简而言之就是解决方案,但是,如果您像我一样,可能需要一个解释。Subversion手册将此称为

樱桃选择合并

从手册页。

  1. 这种形式称为“樱桃选择”合并:“ -r N:M”是指修订版N和M之间源分支历史记录中的差异。

    “反向范围”可用于撤消更改。例如,当源和目标引用同一分支时,可以“撤消”先前提交的修订。在反向范围内,N大于'-r N:M'中的M,或者'-c'选项使用负数:'-c -M'等效于'-r M:'。取消这样的更改也称为执行“反向合并”。


  • 如果源是文件,则差异将应用于该文件(对于反向合并先前的更改很有用)。否则,如果源是目录,则目标默认为“。”。

    在正常使用中,工作副本应该是最新的,并且是单个修订版,没有本地修改,也没有切换的子树。

例:

svn merge -r 2983:289 path/to/file

这将用服务器的修订版289替换本地副本[2983](根据上面的引用应与服务器同步-由您负责)。更改在本地进行,这意味着如果您有完整的签出,则可以在提交更改之前对其进行检查。


-1

以下对我有用。

我进行了很多本地更改,需要丢弃本地副本中的内容,并签出SVN中的最后一个稳定版本。

  1. 检查所有文件的状态,包括忽略的文件。

  2. Grep所有行以获取新添加和忽略的文件。

  3. 将其替换为//

  4. 和rm -rf所有行。

    svn status --no-ignore | grep'^ [?I]'| sed“ s / ^ [?I] //” | | xargs -I {} rm -rf“ {}”

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.