gpt4 book ai didi

svn 树冲突 : what am i doing wrong?

转载 作者:行者123 更新时间:2023-12-01 15:14:41 31 4
gpt4 key购买 nike

每当我尝试在 SVN 中合并时,我都会遇到成堆的树冲突。好吧,就此示例脚本而言,只有一个,但仍然如此。

#!/bin/bash
svnadmin create repo
svn checkout file://`pwd`/repo wc
cd wc
mkdir trunk branches
svn add trunk branches
svn commit -m 'created trunk and branches'
echo red > trunk/colors
svn add trunk/colors
svn commit trunk -m 'created trunk/colors with red inside'
svn copy trunk branches/a
svn commit branches/a -m 'created branches/a'
echo green >> trunk/colors
svn commit trunk -m 'added green to trunk/colors'
echo blue >> branches/a/colors
svn commit branches/a -m 'added blue to branches/a/colors'
svn update
svn merge ^/trunk branches/a

我的结果是:

Checked out revision 0.
A trunk
A branches
Adding branches
Adding trunk

Committed revision 1.
A trunk/colors
Adding trunk/colors
Transmitting file data .
Committed revision 2.
A branches/a
Adding branches/a
Adding branches/a/colors

Committed revision 3.
Sending trunk/colors
Transmitting file data .
Committed revision 4.
Sending branches/a/colors
Transmitting file data .
Committed revision 5.
Updating '.':
At revision 5.
--- Merging r2 through r5 into 'branches/a':
C branches/a/colors
--- Recording mergeinfo for merge of r2 through r5 into 'branches/a':
U branches/a
Summary of conflicts:
Tree conflicts: 1

我知道 SVN 并不以合并友好而著称,但我必须假设在这种情况下这是我的错。感谢您的指点。

最佳答案

您遇到的问题不是由“本地副本”[1] 本身引起的。问题在于,在修订版 3 中,您复制了一个混合修订版工作副本 ( http://svnbook.red-bean.com/en/1.7/svn-book.html#svn.basic.in-action.mixedrevs )。

如果我们一直运行您的脚本,直到您将“trunk”复制到“branches/a”,我们发现我们有一个混合版本的工作副本:

>svn st -v
0 0 ? .
1 1 pburba branches
1 1 pburba trunk
2 2 pburba trunk\colors

因此,当您将“trunk”复制到“branches/a”时,您实际上是在复制 trunk@1 和 trunk/colors@2:

>svn copy trunk branches\a
A branches\a

>svn st -v
0 0 ? .
1 1 pburba branches
A + - 1 pburba branches\a
A + - 2 pburba branches\a\colors
1 1 pburba trunk
2 2 pburba trunk\colors

>svn ci -m "Copy mixed-rev trunk"
Adding branches\a
Adding branches\a\colors

Committed revision 3.

在查看 r3 的详细日志时,我们可以最清楚地看到这一点:

>svn log -v -r3
------------------------------------------------------------------------
r3 | pburba | 2013-03-11 15:31:23 -0400 (Mon, 11 Mar 2013) | 1 line
Changed paths:
A /branches/a (from /trunk:1)
A /branches/a/colors (from /trunk/colors:2)

Copy mixed-rev trunk
------------------------------------------------------------------------

跳到有问题的合并,我们有一个“干净”的工作副本,没有混合修订,也没有本地修改。到目前为止一切顺利:

>svn st -v
5 5 pburba .
5 5 pburba branches
5 5 pburba branches\a
5 5 pburba branches\a\colors
5 4 pburba trunk
5 4 pburba trunk\colors

但是如果我们使用 svn mergeinfo 命令来预览哪些修订将被合并,我们会注意到修订 2 是合格的:

>svn mergeinfo --show-revs eligible ^/trunk branches\a
r2
r4

等等,修订版 2 是添加了“颜色”,

>svn log -v -r2
------------------------------------------------------------------------
r2 | pburba | 2013-03-11 15:43:52 -0400 (Mon, 11 Mar 2013) | 1 line
Changed paths:
A /trunk/colors

created trunk/colors with red inside
------------------------------------------------------------------------

我们在修订版 3 中创建分支时已经复制了它!那么为什么 Subversion 试图再次合并它呢?原因回到我们制作的混合修订版 WC-to-WC 副本。合并目标“branch/a”知道它是在添加“trunk/colors”之前从 trunk@1 复制的。因此合并认为修订版 2 尚未合并到 branch/a 并尝试合并此更改,将“颜色”添加到已存在同名文件的“a”中,这导致 冲突:

>svn merge ^/trunk branches\a
--- Merging r2 through r5 into 'branches\a':
C branches\a\colors
--- Recording mergeinfo for merge of r2 through r5 into 'branches\a':
U branches\a
Summary of conflicts:
Tree conflicts: 1

>svn st
M branches\a
C branches\a\colors
> local file obstruction, incoming file add upon merge
Summary of conflicts:
Tree conflicts: 1

所以我们用我们的混合修订版 WC 到 WC 副本欺骗了 Subversion,这在复制期间有效地将修订版 2 带到了分支。那么,为什么 Subversion 不能检测到这一点并跳过修订版 2?在这种情况下,我们可以想象地做到这一点,但如果修订版 2 包含对“主干”的其他更改怎么办?例如:

>svn log -v -r2
------------------------------------------------------------------------
r2 | pburba | 2013-03-11 15:43:52 -0400 (Mon, 11 Mar 2013) | 1 line
Changed paths:
A /trunk/colors
A /trunk/README
M /trunk

created trunk/colors with red inside, add a README file, and set the
svn:ignore property on trunk
------------------------------------------------------------------------

Subversion 不支持将修订的部分合并到给定路径,它要么全有要么全无。

~~~~~

那么如何避免这个问题呢?正如您已经发现的那样,执行 URL 到 URL 复制可以解决它。为什么?因为当复制源是一个 URL 时,根据定义,它是在某个统一的版本上:

>svn log -v -r3
------------------------------------------------------------------------
r3 | pburba | 2013-03-11 16:02:59 -0400 (Mon, 11 Mar 2013) | 1 line
Changed paths:
A /branches/a (from /trunk:2)

Create branch 'a' from 'trunk' with a URL-to-URL copy.
------------------------------------------------------------------------

但是,您也可以使用 URL 到 WC 的副本来完成同样的事情:

 svn commit trunk -m 'created trunk/colors with red inside'
-svn copy trunk branches/a
+svn copy ^/trunk branches/a
svn commit branches/a -m 'created branches/a'

或者只需在原始脚本中的 WC 到 WC 副本之前更新 WC:

 svn commit trunk -m 'created trunk/colors with red inside'
+svn update
svn copy trunk branches/a
svn commit branches/a -m 'created branches/a'

您的原始解决方案是 URL 到 URL 副本,然后进行更新,这是 IMO 的最佳选择。 update & WC-to-WC 副本和 URL-to-WC 副本都允许在提交之前对副本进行额外更改的可能性——最好是创建分支的修订版没有除副本外的其他更改。也就是说,所有这些选项都可以正常工作[2]。

[1] 在 Subversion 中,我们通常将其称为工作副本到工作副本副本,或简称为 WC 到 WC 副本。将此与 URL 到 URL、URL 到 WC 或 WC 到 URL 的副本进行对比。 WC 到 URL 的副本也容易受到上述问题的影响。另请参阅“svn copy --help”。

[2] 当然,即使使用这三个选项之一仍然会导致 text 冲突,但这是预料之中的,因为我们对主干和分支上的“颜色”文件进行了不兼容的更改分支创建后。

>svn merge ^/trunk branches\a
--- Merging r3 through r5 into 'branches\a':
C branches\a\colors
--- Recording mergeinfo for merge of r3 through r5 into 'branches\a':
U branches\a
Summary of conflicts:
Text conflicts: 1
Conflict discovered in file 'branches\a\colors'.
Select: (p) postpone, (df) diff-full, (e) edit, (m) merge,
(mc) mine-conflict, (tc) theirs-conflict, (s) show all options: p

>svn st
M branches\a
C branches\a\colors
? branches\a\colors.merge-left.r2
? branches\a\colors.merge-right.r5
? branches\a\colors.working
Summary of conflicts:
Text conflicts: 1

关于svn 树冲突 : what am i doing wrong?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15005014/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com