题
我正在与朋友一起开发一个项目,我想返回到旧版本的代码并将其设置为当前版本。我该怎么做?
我在 vs08 上使用“anksvn”。
我的电脑上有我想要的版本,但提交失败;我得到的信息是 “提交失败,文件或目录已过期。”
我的电脑上也有 subversion 客户端。
解决方案
基本上你需要“向后合并”。 - 在当前版本和先前版本之间应用差异到当前版本(因此您最终得到的工作副本看起来像旧版本),然后再次提交。例如,从修订版150(当前)回到修订版140:
svn update
svn merge -r 150:140 .
svn commit -m "Rolled back to r140"
Subversion Red Book有一个关于这个的好部分。
其他提示
您只能在subversion历史记录的 head 处提交新的更改。
您无法直接使用PC上的好副本进行任何操作的原因是它的 .svn
文件夹知道它是过去的代码,因此需要先更新提交。
找到好的修订号并恢复
-
查找所需旧版本的修订版号。通过以下方式获取当前版本:
svn info --show-item revision # or svn log
或使用:
svn update -r <earlier_revision_number>
检查项目的各种旧版本,直到找到正确的版本号。
-
记下好的修订版号(假设
123
以下示例)。 -
更新到最新版本:
svn update
-
撤消所需修订版本与最新版本之间的所有更改:
svn merge -r HEAD:123 . svn commit "Reverted to revision 123"
(与Jon Skeet上面的回答相同。)
醇>
-
制作好版本的副本(但没有任何
.svn
文件夹):cd .. rsync -ai --exclude=.svn project/ project-good/
-
现在确保您拥有最新版本:
cd project svn update # or make a fresh checkout svn checkout <url>
-
将好的版本复制到工作副本的顶部。
此命令将复制并删除工作树中不在您的正版中的任何文件,但不会影响现有的
.svn
文件夹。cd .. rsync -ai --exclude=.svn --delete project-good/ project/
如果您没有rsync,可以使用
cp -a
,但您还需要手动删除任何不需要的文件。 -
你应该能够提交你现有的东西。
cd project svn commit "Reverted to good copy"
醇>
如果找不到修订号
如果找不到旧版本,而您只想提交PC上当前的文件:
只需使用此行
即可svn update -r yourOldRevesion
您可以使用以下方式了解当前版本:
svn info
使用合并撤消整个签到的标准方法非常有用,如果这是您想要做的。但有时,您只想恢复单个文件。没有合法的方法可以做到这一点,但有一个黑客:
- 使用svn log查找所需的版本。
-
使用svn的export子命令:
svn export http:// url-to-your-file @ 123 / tmp /文件名
醇>
(其中123是文件的正确版本的修订号。)然后移动或复制该单个文件以覆盖旧文件。检查修改后的文件,您就完成了。
多一点老派
svn diff -r 150:140 > ../r140.patch
patch -p0 < ../r140.patch
然后是通常的
svn diff
svn commit
我认为这是最合适的:
例如,如果提交的代码包含来自的修订版,则向后合并 rev 5612到5616,只是向后合并。它最终起作用。
例如:
svn merge -r 5616:5612 https://<your_svn_repository>/
它将包含一个返回到以前版本的合并代码,然后您可以提交它。
这就是我为我所做的工作。
我想撤消我在特定时间执行的多次提交中的更改,并希望转到上一个提交点。
- 转到团队 - &gt;显示历史。
- 右键单击要忽略的修订版或范围。
- 选择“还原更改”选项。 醇>
这将运行反向合并,撤消工作副本中的更改。
只需查看代码并提交。
右键点击要还原的最高层级&gt;&gt; Revert
或 Revert to Revision
右键单击项目&gt;替换为&gt;修订版或网址&gt;选择要还原的特定修订版。
现在将本地更新代码版本提交到存储库。这会将代码库还原为特定版本。
之前的大多数答案都使用反向合并,这通常是正确的答案。然而,有一种情况(这恰好发生在我身上)却并非如此。
我在进行小更改时不小心将 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"
请注意,对于存储库中的副本,目标必须是目录,而不是文件名。
与旧版本同步并提交。这应该可以解决问题。
这是也是撤消更改的解释。
简而言之,乔恩·斯基特的回答几乎就是解决方案,但是如果您像我一样,您可能需要一个解释。Subversion 手册称其为
精选合并
来自手册页。
这种形式称为“cherry-pick”合并:'-r N:M' 是指 修订版 N 和 M 之间的源分支。
“反向范围”可用于撤消更改。例如,当 source 和 target 引用同一个分支,即之前提交的 修订可以“撤消”。在一个 反向范围, ,N 大于 M '-r N:M',或“-c”选项与负数一起使用:'-c -M' 等价于 '-r M:'。撤消这样的更改也是已知的 作为执行“反向合并”。
如果源是文件,则对该文件应用差异 文件(用于反向合并早期的更改)。否则 如果源是目录,则目标默认为“.”。
在正常使用中,工作副本应该是最新的,单个 修订版,没有本地修改,也没有切换的子树。
例子:
svn merge -r 2983:289 path/to/file
这将用服务器中的修订版 289 替换本地副本 [2983](根据上面的引用,它应该与服务器同步——您的责任)。更改发生在本地,这意味着如果您进行了干净的签出,则可以在提交之前检查更改。
此页面上有很多危险的答案。请注意,自SVN版本1.6以来,执行更新-r可能会导致树冲突,这会迅速升级为潜在数据,从而丢失kafkeresque噩梦,您可以在Google上搜索有关树冲突的信息。
恢复版本的正确方法是:
svn merge -r HEAD:12345 .
其中12345是版本号。不要忘记点。
以下对我有用。
我有很多本地更改,需要丢弃本地副本中的那些并检查SVN中的最后一个稳定版本。
-
检查所有文件的状态,包括被忽略的文件。
-
Grep所有行以获取新添加和忽略的文件。
-
用
//
替换它们。 -
和rm -rf所有行。
svn status --no-ignore | grep'^ [?I]'| sed“s / ^ [?I] //” | xargs -I {} rm -rf&quot; {}&quot;
醇>