许多修订版本,我的SVN存储库中的一个好文件被覆盖了。比方说,修订版10包含所需格式的文件samplefile.txt
;目前的修订版是30。
我使用修订版10 samplefile.txt
更新我的工作副本:
$ svn update -r 10 samplefile.txt
我确认我的文件工作副本中包含旧的但需要的内容。现在,我想将此文件提交到repo,形成版本31。
$ svn commit -m "reverting file to 10" samplefile.txt
然而,这永远不会提交。执行该命令会将我返回到终端提示符,而无需通常的SVN输出来确认新版本,并且更新的文件不会出现在存储库中。
如何使用SVN命令提交此内容?
答案 0 :(得分:1)
您应该在工作副本中运行以下命令:
svn merge ^/trunk . -c-10
并提交此更改:
svn commit -m "Revert changes made in r10"
答案 1 :(得分:0)
svn merge
如何运作
svn merge
命令以几种不同的方式使用,但从根本上说它总是按顺序执行两项操作:1)通过比较两个源创建 diff ,并且2)应用< em> diff 到目标。
两个源和目标由命令行参数指定,但在许多情况下,如果merge
可以隐式确定它们应该是什么,则可以省略一个或多个参数。
通常,命令行调用的格式为
$ svn merge [create diff] [apply to target]
更详细,
1) [创建差异]
svn merge
将源A和源B进行比较,以创建 diff ,这是将源A转换为源B所需的指令集。
源可以是文件集的任何元素:主干或分支,目录子树或单个文件。源可以是工作副本的一个元素(在这种情况下,它由文件路径标识)或者存储库本身的元素(在这种情况下,它由其repo URL标识)。源可以引用存储库的任何修订;如果未指定修订版,则通常会假定最新修订版(HEAD)。
2) [适用于目标]
创建 diff 后,merge
会将该组指令应用于目标。目标必须是工作副本的元素;通常假定merge
命令是在此工作副本中执行的。
显然,如果目标与用于创建 diff 的两个源完全无关,那么当应用 diff 指令时,你只会得到废话它。目标也必须是相同的&#34;类型的东西&#34;作为两个来源;也就是说,如果 diff 比较两个分支或分支/主干,那么目标也应该是分支或主干。如果两个源是文件,那么目标应该是文件,依此类推。
这就是必须仔细构建merge
命令的原因。但是,不要过多地冒汗:因为目标必须是工作副本的一个元素,merge
只会影响工作副本,而不会影响回购。只要您不commit
而未查看merge
的结果,如果merge
错误,则很容易解决。
反向合并
A&#34;反向合并&#34;恢复文件是cherry-pick merge的一种形式,它将单个元素的两个不同版本作为其两个来源。因此,我们在命令行上只指定一个源名称,并附带-r
或-c
标志,以说明哪两个修订将成为源。
-r
标志及其参数指定修订版本,可以是绝对编号N
,也可以是范围N:M
。
-c
标志指定修订版所做的更改。这在某些情况下很有用,但不适用于这个,因为当前文件(rev 30)和所需文件(rev 10)之间的差异涵盖了20多个不同修订版本的许多更改 - 我不想恢复单个版本改变,但多达二十个!
就我的假设samplefile.txt
而言,
[create diff] = -r 10:30 <URL of repository>/path/to/samplefile.txt
生成一组将samplefile.txt@10
转换为samplefile.txt@30
的指令。但这不是我想要的 - 我想要相反的是,将当前samplefile.txt@30
带回samplefile.txt@10
的指令集。这可以通过反转转数来指定,即
[create diff] = -r 30:10 <URL of repository>/path/to/samplefile.txt
这就是它反向合并的原因。 (请注意,-r
标志与单词&#34; reverse&#34;无关。)
我的目标是工作副本中的文件samplefile.txt
,或
[apply to target] = WC_root/filepath/to/samplefile.txt
由于 diff 构造为采用samplefile.txt@30
- &gt; samplefile.txt@10
,我工作副本中的副本必须是最新版本(rev 30)。这一点非常重要,因为我之前已经直接将文件更新为rev 10但由于某种原因徒劳地尝试将该内容作为修订版31提交回存储库。所以始终是在执行update
命令之前确保merge
。
使用反向合并恢复文件
将[create diff]
和[apply to target]
放在一起,使用反向合并将{30}内容从其rev 30内容恢复为其rev 10内容的命令是
samplefile.txt
如果一切都结束了,$ svn update
$ svn merge -r 30:10 <URL of repository>/path/to/samplefile.txt WC_root/filepath/to/samplefile.txt
的当前内容确实是修订版10的内容,那么我现在承诺回购:
samplefile.txt
为了其他开发人员的利益而锁定文件恢复。
<强>参考文献:强>
我可以在SVN Book中找到关于如何定义$ svn commit -m "reverting file to rev 10" WC_root/filepath/to/samplefile.txt
命令的最佳通用文档:
Merge Syntax
@bahrep链接的手册部分提供了几个如何使用merge
完成不同任务的示例。 (我不能在这里重复链接,因为这会让我超过2链接限制。)
当然还有merge
,在阅读这些链接后会更清楚(希望这个答案)。
非常感谢@alroc和@bahrep帮助我解决这个问题!
答案 2 :(得分:-1)
试试这个:
svn update samplefile.txt
svn cat -r 10 samplefile.txt > samplefile.txt
svn commit -m "reverting file to 10" samplefile.txt