更新的文件不会提交

时间:2016-11-28 16:42:12

标签: svn

许多修订版本,我的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命令提交此内容?

3 个答案:

答案 0 :(得分:1)

您应该在工作副本中运行以下命令:

svn merge ^/trunk . -c-10

并提交此更改:

svn commit -m "Revert changes made in r10"

阅读SVNBook | Undoing Changes

答案 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