ClearCase希望在传递到备用目标后合并未更改的文件

7
使用 Rational ClearCase v. 7.0.1.1 和 UCM,我在使用 ClearCase 的“从流传递到备用目标”的功能时遇到了问题。
假设我们有一个项目集成流和两个开发者流 A 和 B,它们都是从集成流派生而来。现在我在流 A 中更改了一个文件。我希望拥有流 B 的开发人员能够使用我的工作,而不必让我将文件传递到集成流中,因此我将文件从流 A 传递到备用目标流 B 中。
到目前为止还好。我继续对该文件进行另一次更改,但是流 B 的开发人员不需要这个更改,因此我没有将其传递给他。
一段时间后,我将我的工作交付给了主要的集成流。这很好,尽管我想知道为什么 ClearCase 将合并标记为普通的“已合并”,而不是“已合并(微不足道)”——除了我之外,没有人对文件进行过更改。
交付后,在主要的集成流上创建了一个新的基线。
真正的问题出现在开发人员 B 尝试重新定位他的流时。由于开发人员 B 从未对文件进行过任何更改,我期望合并是微不足道的,不需要任何交互。但是实际情况是,开发人员 B 被迫以图形方式解决该文件上的合并冲突,让他选择集成流上的基本版本、我传递给他的版本和我传递给集成流的版本之间的区别。
当完成了重新定位和解决合并后,开发人员 B 想要将其交付到主要的集成流时,混乱就开始了。除了我最初向他提供的活动外,他还可以提供名为“rebase_...”的活动进行交付,这是我从未期望过会被提供进行交付的。
我在这里漏掉了什么吗?我们是否错误地使用了 ClearCase 还是这是一个已知的限制/错误?是否有任何对此功能有经验的人?
感谢您的帮助!
Jan

我必须离开两个小时,但我会尝试创建一个测试UCM项目并检查我的配置(CC7.0.1)是否存在冲突。 - VonC
测试已添加,仅进行微小的合并,未出现冲突。请查看我的测试前的评论以获取想法或建议。 - VonC
是的...我确认这种合并(分支“Stream B”的最后一次变基到v2)不应该产生任何冲突。ClearCase版本7.0.1(2007年5月17日星期四) ClearCase版本7.0.1_iFix01(2007年9月19日星期三) @(#) MVFS版本7.0.1.0-IFIX01(2007年9月5日星期三22:15:13) - VonC
回到一些更多的测试(那是一个紧凑的下午;)我必须同时支持我的常规ClearCase或SubVersion用户;) - VonC
总之:从B的角度来看是“未更改的文件”,但从共同祖先的角度来看是“已更改的文件”。因此产生了冲突。因此需要手动解决。这是侧向合并的一个有趣副作用(请参见http://www.ibm.com/developerworks/rational/library/5134.html)。 - VonC
显示剩余5条评论
2个回答

7
实际上,当我查看版本树时,重新定位期间冲突的源是清晰明了的: version tree with conflict 当您重新阅读ClearCase 3-way merge works的方式时,您会发现它需要返回版本树以找到一个公共祖先来比较:
- 源(Int/2) - 目标(B/1)
那个公共祖先是Int/1
现在有可能自那时起,在这两个版本之间已经更改了公共行:
- 上次重新定位的源(Int/2)来自A/3 - 上次重新定位的目标(B/1)来自A/2 - 公共祖先(Int/1)来自A/1
如果公共行已经在A/2和A/3中被修改……那么这里就有手动合并解决的原因!
(我正在测试这个过程)
得到了!发生了冲突!
继续我的之前的实验
让我们在流A中进行新的修改:
M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_a\adev\test>echo modif by A to B>>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_a\adev\test>type aFile.txt
first line done on Int
Second line from Int
Addition by A to be delivered to B first
Modification by A to be delivered to Int, B does not need it
modif by A to B

将其直接传递给B:
M:\vonc_test_dat_a\adev\test>ct deliver -to vonc_test_dat_b -target Test_DAT_B@\myPVob -cact -gmerge -force
Changes to be DELIVERED to non-default target stream in current project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_A"
          TO: stream "Test_DAT_B"
Using target view: "vonc_test_dat_b".
Activities included in this operation:
        activity:test_dat_a@\myPVob   vonc        "test_dat_a"
Trivial merge: "M:\vonc_test_dat_b\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\2".
Copying "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\3" to output file.
Deliver has merged

M:\vonc_test_dat_a\adev\test>ct deliver -target Test_DAT_B@\myPVob -cact -complete -force

(微不足道的合并)

现在让我们完全更改该文件的内容:

M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_a\adev\test>echo change first line>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_a\adev\test>type aFile.txt
change first line

将新的基线放在交付后,交付给Int:

M:\vonc_test_dat_a\adev\test>ct deliver -force
M:\vonc_test_dat_a\adev\test>ct deliver -force -complete
M:\vonc_test_dat_a\adev\test>ct mkbl -comp ADV_TST@\myPVob -view vonc_test_dat_int TST_DAT1.2.0

(另一个琐碎的合并)

从B进行rebase怎么样?

M:\vonc_test_dat_b\adev\test>ct rebase -bas TST_DAT1.2.0
Advancing to baseline "TST_DAT1.2.0" of component "ADV_TST"
Updating rebase view's config spec...
Creating integration activity...
Setting integration activity...
Merging files...
Checked out "M:\vonc_test_dat_b\adev\test\aFile.txt" from version "\main\Test_DAT_Int\Test_DAT_B\3".
  Attached activity:
    activity:rebase.Test_DAT_B.20090707.163300@\myPVob  "rebase Test_DAT_B on 07/07/09 4:33:00 PM."
Needs Merge "M:\vonc_test_dat_b\adev\test\aFile.txt" [to \main\Test_DAT_Int\Test_DAT_B\CHECKEDOUT from \main\Test_DAT_Int\4 base \main\T
est_DAT_Int\3]
********************************
<<< file 1: M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\3
>>> file 2: M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\4
>>> file 3: M:\vonc_test_dat_b\adev\test\aFile.txt
********************************
---------[changed 1-4 file 1]----------|---------[changed to 1 file 2]---------
first line done on Int                 | change first line
Second line from Int                   |-
Addition by A to be delivered to B fir+|
Modification by A to be delivered to I+|
                                      -|
*** Automatic: Applying CHANGE from file 2 [line 1]
============
============
-----------[after 4 file 1]------------|----------[inserted 5 file 3]----------
                                      -| modif by A to B
                                       |-
Do you want the INSERTION made in file 3?  [yes] no
============
============
Output of merge is in "M:\vonc_test_dat_b\adev\test\aFile.txt".
Recorded merge of "M:\vonc_test_dat_b\adev\test\aFile.txt".
Build and test are necessary to ensure that any merges and configuration changes were completed correctly.
When build and test are confirmed, run "cleartool rebase -complete".

这就是一个很好的冲突示例,它展示了两个不兼容的变更来自于同一个祖先。

下面是一张图来说明:

合并过程中的冲突

.


再次感谢您提供详细的解释和付出的所有努力。遗憾的是,CC并不太智能,因为在技术上自动解决冲突是可能的。我想对我来说,这意味着要避免向非默认目标交付。我认为,在rebase期间,B流上的开发人员搞砸A的工作的危险太高了。 - Jan
2
嗯...这就是侧向合并的代价。在另一个分支上进行的下一个三路合并将检测源和目标中的更改,因此会产生冲突。实际上,我想知道是否有任何其他启用了三路合并的SCM会以不同的方式处理这个问题?我将不得不用Git进行测试。 - VonC
好问题。ClearCase有所有信息来确定在rebase之后哪个版本显然是正确的。 - Jan
我刚意识到这个问题有一个解决方法。如果开发者B在他的rebase操作中需要合并,他可以撤销rebase。然后开发者A可以向流B再次交付,其中包含他向集成流交付的相同版本。这又是一个微不足道的合并。之后,开发者B就可以重新进行rebase而没有任何问题了。 - Jan
@Jan:确实是一种解决方法,但如果需要反复重复执行,则可能表明当前的工作流程不是“最佳”方案。如果您可以共享一个流而不是两个流,则无需处理那些额外的合并。 - VonC

2
我对这个冲突感到惊讶:由于ClearCase会注册从流A到B的合并,除非流B没有与流A相同的基线基础(分支的起始点或初始标签)。
除了我最初交给他的活动外,他还提供了一个名为rebase_...的活动,我从未想过会被提供交付。
当您从Int到B进行rebase时,会创建自动“时间轴”,将所有活动链接在一起。这意味着,在下一次交付期间,B将不得不交付rebase,即使此更改集中存在的所有版本都没有执行合并。
首先,有几点评论:
  • 你可能希望避免创建连接到资源的流(开发者"A",开发者"B"):如果他们正在为同一个全局“开发任务”工作的不同文件集,则应该只有一个Stream_FeatureF代表手头的任务。
    A和B应该看到连接到该流的相同分支的相同LATEST版本(无需从一个流传递到另一个流)
    如果B经常破坏A的工作,那么只有在不能与主功能“F”同时开发具有破坏性的子功能时才可以为其创建子流。

  • 当合并是trivial(即基础与源或目标相同,请参见core concepts)时,交付/重定位GUI不会显示“Yes(微不足道)”。这并不意味着合并不是微不足道的。

  • 我下面的测试遵循您描述的合并工作流程,但仅显示微不足道的合并。
    可能解释非微不足道的合并的原因是“evil twins”(在一个流中添加的文件,在另一个流中从头开始重新创建,名称相同)


好的,让我们来测试一下,假设有一个名为“adev”(代表我的团队存储工具的“开发架构”)的Vob,其中包含一个名为ADV_TST的UCM组件,位于\adev\test中。
在Windows上使用ClearCase7.0.1进行操作(尽管Vob实际上位于Unix上)。

我们从一个测试项目开始,一个集成流和一个空的测试组件:

M:\>ct mkproj -in folder:ADV_Tests@\myPVob Test_DeliverToAlternateTarget@\myPVob
M:\>ct mkstream -int -in Test_DeliverToAlternateTarget@\myPVob Test_DAT_Int@\myPVob
Created stream "Test_DAT_Int".
M:\>ct mkview -tag vonc_test_dat_int -stream Test_DAT_Int@\myPVob -stg hostname_ccstg_c_views
M:\vonc_test_dat_int\adev\test>ct rebase -bas ADV_TST0.0.0
Adding baseline "ADV_TST0.0.0" of new component "ADV_TST"
M:\vonc_test_dat_int\adev\test>ct rebase -complete

让这个组件可写:
M:\vonc_test_dat_int\adev\test>ct chproj -amodcomp component:ADV_TST@\myPVob Test_DeliverToAlternateTarget@\myPVob
M:\vonc_test_dat_int\adev\test>ct chstream -generate Test_DAT_Int@\myPVob
M:\vonc_test_dat_int\adev\test>ct setcs -stream

A会在Int上创建一个文件,添加内容,修改它,然后设置一个基准。
M:\vonc_test_dat_int\adev\test>ct mkact test_dat_int
M:\vonc_test_dat_int\adev\test>echo first line done on Int>aFile.txt
M:\vonc_test_dat_int\adev\test>ct co -nc .
M:\vonc_test_dat_int\adev\test>ct mkelem -nc aFile.txt
M:\vonc_test_dat_int\adev\test>ct ci -nc .
M:\vonc_test_dat_int\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_int\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_int\adev\test>echo Second line from Int>>aFile.txt
M:\vonc_test_dat_int\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_int\adev\test>type aFile.txt
first line done on Intct mkview vonc_
Second line from Int

M:\vonc_test_dat_int\adev\test>ct mkbl -comp ADV_TST@\myPVob TST_DAT1.0.0
Created baseline "TST_DAT1.0.0" in component "ADV_TST".

现在,让我们创建两个子流,一个为每个开发人员(尽管可能被认为是“不良实践”),它们都使用相同的基准版本TST_DAT1.0.0进行初始化:
M:\vonc_test_dat_int\adev\test>ct mkstream -in Test_DAT_Int@\myPVob Test_DAT_A@\myPVob
M:\vonc_test_dat_int\adev\test>ct mkstream -in Test_DAT_Int@\myPVob Test_DAT_B@\myPVob
M:\vonc_test_dat_int\adev\test>ct mkview -tag vonc_test_dat_a -stream Test_DAT_A@\myPVob -stg hostname_ccstg_c_views
M:\vonc_test_dat_int\adev\test>ct mkview -tag vonc_test_dat_b -stream Test_DAT_B@\myPVob -stg hostname_ccstg_c_views
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_a -bas TST_DAT1.0.0
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_a -complete
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_b -bas TST_DAT1.0.0
M:\vonc_test_dat_int\adev\test>ct rebase -view vonc_test_dat_b -complete

A将对他的流A进行修改,以交付给B:
M:\vonc_test_dat_a\adev\test>ct mkact test_dat_a
M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
Created branch "Test_DAT_A" from "aFile.txt" version "\main\Test_DAT_Int\2".
M:\vonc_test_dat_a\adev\test>echo Addition by A to be delivered to B first>>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

直接从A流传输到B:
M:\vonc_test_dat_a\adev\test>ct deliver -to vonc_test_dat_b -target Test_DAT_B@\myPVob -cact -gmerge
Changes to be DELIVERED to non-default target stream in current project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_A"
          TO: stream "Test_DAT_B"
Using target view: "vonc_test_dat_b".
Activities included in this operation:
        activity:test_dat_a@\myPVob   vonc        "test_dat_a"
Created branch "Test_DAT_B" from "M:\vonc_test_dat_b\adev\test\aFile.txt" version "\main\Test_DAT_Int\2".
Checked out "M:\vonc_test_dat_b\adev\test\aFile.txt" from version "\main\Test_DAT_Int\Test_DAT_B\0".
  Attached activity:
    activity:deliver.Test_DAT_A.20090707.123738@\myPVob  "deliver Test_DAT_A on 07/07/09 12:37:38 PM."
Needs Merge "M:\vonc_test_dat_b\adev\test\aFile.txt" [to \main\Test_DAT_Int\Test_DAT_B\CHECKEDOUT from \main\Test_DAT_Int\Test_DAT_A\1 b
ase \main\Test_DAT_Int\2]
Trivial merge: "M:\vonc_test_dat_b\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\
2".
Copying "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\1" to output file.
Deliver has merged
M:\vonc_test_dat_a\adev\test>ct deliver -target Test_DAT_B@\myPVob -force -complete

我确认 GUI 没有显示“Trivial”,尽管相同交付的文本输出中提到了“Trivial merge”...
A 继续在 'aFile.txt' 上工作并将其提交给 Int:
M:\vonc_test_dat_a\adev\test>ct co -nc aFile.txt
M:\vonc_test_dat_a\adev\test>echo Modification by A to be delivered to Int, B does not need it>>aFile.txt
M:\vonc_test_dat_a\adev\test>ct ci -nc aFile.txt

M:\vonc_test_dat_a\adev\test>ct deliver
Changes to be DELIVERED to default target stream in project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_A"
          TO: stream "Test_DAT_Int"
Using target view: "vonc_test_dat_int".
Activities included in this operation:
        activity:test_dat_a@\myPVob   vonc        "test_dat_a"
Do you wish to continue with this deliver operation?  [no] yes
Checked out "M:\vonc_test_dat_int\adev\test\aFile.txt" from version "\main\Test_DAT_Int\2".
  Attached activity:
    activity:deliver.Test_DAT_A.20090707.124108@\myPVob  "deliver Test_DAT_A on 07/07/09 12:41:08 PM."
Needs Merge "M:\vonc_test_dat_int\adev\test\aFile.txt" [to \main\Test_DAT_Int\CHECKEDOUT from \main\Test_DAT_Int\Test_DAT_A\2 base \main
\Test_DAT_Int\2]
Trivial merge: "M:\vonc_test_dat_int\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_int\adev\test\aFile.txt@@\main\Test_DAT_
Int\2".
Copying "M:\vonc_test_dat_int\adev\test\aFile.txt@@\main\Test_DAT_Int\Test_DAT_A\2" to output file.
Deliver has merged
M:\vonc_test_dat_a\adev\test>ct deliver -force -complete

另一个微不足道的合并
让我们在 Int 上设定一个基准线:
M:\vonc_test_dat_a\adev\test>ct mkbl -nc -view vonc_test_dat_int TST_DAT1.1.0
Created baseline "TST_DAT1.1.0" in component "ADV_TST".
Begin incrementally labeling baseline "TST_DAT1.1.0".
Done incrementally labeling baseline "TST_DAT1.1.0".

现在我们切换到B,他开始对另一个文件进行一些自己的小工作。
M:\vonc_test_dat_b\adev\test>ct mkact test_dat_b
M:\vonc_test_dat_b\adev\test>echo myFile by B>aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct co -nc .
M:\vonc_test_dat_b\adev\test>ct mkelem -nc aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct ci -nc aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct ci -nc .

然后,突然间,他不得不将自己的工作与已经在Int中合并的内容进行重新基础。
M:\vonc_test_dat_b\adev\test>ct rebase -bas TST_DAT1.1.0
Advancing to baseline "TST_DAT1.1.0" of component "ADV_TST"
Updating rebase view's config spec...
Creating integration activity...
Setting integration activity...
Merging files...
Checked out "M:\vonc_test_dat_b\adev\test\aFile.txt" from version "\main\Test_DAT_Int\Test_DAT_B\1".
  Attached activity:
    activity:rebase.Test_DAT_B.20090707.125044@\myPVob  "rebase Test_DAT_B on 07/07/09 12:50:44 PM."
Needs Merge "M:\vonc_test_dat_b\adev\test\aFile.txt" [to \main\Test_DAT_Int\Test_DAT_B\CHECKEDOUT from \main\Test_DAT_Int\3 base \main\T
est_DAT_Int\Test_DAT_A\1]
Trivial merge: "M:\vonc_test_dat_b\adev\test\aFile.txt" is same as base "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\
Test_DAT_A\1".
Copying "M:\vonc_test_dat_b\adev\test\aFile.txt@@\main\Test_DAT_Int\3" to output file.
Output of merge is in "M:\vonc_test_dat_b\adev\test\aFile.txt".
Recorded merge of "M:\vonc_test_dat_b\adev\test\aFile.txt".

M:\vonc_test_dat_b\adev\test>type aFile.txt
first line done on Int
Second line from Int
Addition by A to be delivered to B first
Modification by A to be delivered to Int, B does not need it

M:\vonc_test_dat_b\adev\test>ct rebase -complete

完全没有冲突:再次进行琐碎的合并。
B 继续在他的文件上工作:
M:\vonc_test_dat_b\adev\test>ct setact test_dat_b
M:\vonc_test_dat_b\adev\test>ct co -nc aFileByB.txt
M:\vonc_test_dat_b\adev\test>echo a modif by B to be delivered to Int>>aFileByB.txt
M:\vonc_test_dat_b\adev\test>ct ci -nc aFileByB.txt

然后他将所有的工作交给了Int公司。
M:\vonc_test_dat_b\adev\test>ct deliver -cact
cleartool: Error: Activity "deliver.Test_DAT_A.20090707.123738" must be added to activity list to preserve baseline order in stream.
cleartool: Error: Activity "rebase.Test_DAT_B.20090707.125044" must be added to activity list to preserve baseline order in stream.
cleartool: Error: The list of activities specified is incomplete.
cleartool: Error: Unable to deliver selected activities.
cleartool: Error: Unable to deliver stream "Test_DAT_B".

我确认他必须选择所有活动(不仅仅是他自己的):上次重建期间设置的时间轴将所有活动链接在一起。
即使不会与“deliver.Test_DAT_A.20090707.123738”和“rebase.Test_DAT_B.20090707.125044”活动合并,它们也必须包括在内。
M:\vonc_test_dat_b\adev\test>ct deliver
Changes to be DELIVERED to default target stream in project "Test_DeliverToAlternateTarget":
          FROM: stream "Test_DAT_B"
          TO: stream "Test_DAT_Int"
Using target view: "vonc_test_dat_int".
Activities included in this operation:
        activity:deliver.Test_DAT_A.20090707.123738@\myPVob   vonc        "deliver Test_DAT_A on 07/07/09 12:37:38 PM."
        activity:test_dat_b@\myPVob   vonc        "test_dat_b"
        activity:rebase.Test_DAT_B.20090707.125044@\myPVob    vonc        "rebase Test_DAT_B on 07/07/09 12:50:44 PM."
Do you wish to continue with this deliver operation?  [no]

  Attached activity:
    activity:deliver.Test_DAT_B.20090707.131614@\myPVob  "deliver Test_DAT_B on 07/07/09 1:16:14 PM."
Needs Merge "M:\vonc_test_dat_int\adev\test" [to \main\Test_DAT_Int\CHECKEDOUT from \main\Test_DAT_Int\Test_DAT_B\1 base \main\Test_DAT_
Int\1]
********************************
<<< directory 1: M:\vonc_test_dat_int\adev\test@@\main\Test_DAT_Int\1
>>> directory 2: M:\vonc_test_dat_int\adev\test@@\main\Test_DAT_Int\Test_DAT_B\1
>>> directory 3: M:\vonc_test_dat_int\adev\test
********************************
-----------[ directory 1 ]-------------|---------[ added directory 2 ]---------
                                      -| aFileByB.txt  --07-07T12:50 vonc
*** Automatic: Applying ADDITION from directory 2
Recorded merge of "M:\vonc_test_dat_int\adev\test".
Created branch "Test_DAT_Int" from "M:\vonc_test_dat_int\adev\test\aFileByB.txt" version "\main\0".
Checked out "M:\vonc_test_dat_int\adev\test\aFileByB.txt" from version "\main\Test_DAT_Int\0".
  Attached activity:
    activity:deliver.Test_DAT_B.20090707.131614@\myPVob  "deliver Test_DAT_B on 07/07/09 1:16:14 PM."
Needs Merge "M:\vonc_test_dat_int\adev\test\aFileByB.txt" [to \main\Test_DAT_Int\CHECKEDOUT from \main\Test_DAT_B\2 base \main\0]
Trivial merge: "M:\vonc_test_dat_int\adev\test\aFileByB.txt" is same as base "M:\vonc_test_dat_int\adev\test\aFileByB.txt@@\main\0".

Copying "M:\vonc_test_dat_int\adev\test\aFileByB.txt@@\main\Test_DAT_B\2" to output file.
Deliver has merged
M:\vonc_test_dat_b\adev\test>ct deliver -complete

.


有趣的是,我不理解为什么这只会在交付到替代目标的特殊情况中发生。顺便说一下,流A和B确实使用相同的基础线。 - Jan
首先,非常感谢您的所有努力和建议。总结一下,我明白我已经做了正确的事情,尽管如果可以预见A和B将一起工作,使用两个流可能不是一个好的实践方式。显然,您不能重现我在这里可以重现的问题。这可能真的是CC的一个错误吗?您正在使用客户端的哪个补丁版本?或者这可能是一个服务器问题? - Jan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接