强制解析无法正确处理重命名



假设仓库中有这些流

main
/  
A    B

所有这些流都有以下文件:

01.txt:01

02.txt:02

从A,我提交了这两个变更列表。

#1:p4 move 01.txt legacy_01.txt

#2:p4 move 02.txt 01.txt

然后我将这些更改列表复制到main。此时,main的文件与预期的一致。

legacy_01.txt:01

01.txt:02

然而,当我向下合并到B时,问题就出现了。在一些自动解析之后(不管你已经p4 resolve然后盲目接受所有,或者甚至使用p4v的安全无合并自动解析),文件变成:

legacy_01.txt:02

(删除其他文件)

这是更有问题的,因为它发生即使你使用p4v的安全自动的决心。当然,我可以仔细调整解析顺序来防止这种情况,但是为什么这是默认的呢?

tl;dr:将文件重命名到彼此的位置,然后压缩生成的更改列表是有问题的。

当您复制到main.

时出现问题。
C:Perforcetestseongchan-test>p4 copy A/... main/...
//stream/main/seongchan-test/main/02.txt#1 - delete from //stream/main/seongchan-test/A/02.txt#1,#2
//stream/main/seongchan-test/main/01.txt#1 - sync/integrate from //stream/main/seongchan-test/A/01.txt#1,#3
//stream/main/seongchan-test/main/legacy_01.txt#1 - branch/sync from //stream/main/seongchan-test/A/legacy_01.txt#1
C:Perforcetestseongchan-test>p4 opened
//stream/main/seongchan-test/main/01.txt#1 - integrate default change (text)
//stream/main/seongchan-test/main/02.txt#1 - delete default change (text)
//stream/main/seongchan-test/main/legacy_01.txt#1 - branch default change (text)
C:Perforcetestseongchan-test>p4 resolved
c:Perforcetestseongchan-testmain1.txt - copy from //stream/main/seongchan-test/A/01.txt#1,#3
c:Perforcetestseongchan-testmain2.txt - delete from //stream/main/seongchan-test/A/02.txt#1,#2
c:Perforcetestseongchan-testmainlegacy_01.txt - branch from //stream/main/seongchan-test/A/legacy_01.txt#1

请注意,没有一个文件是为"move"01->legacy_0102->01操作的顺序(由move/addmove/delete操作按特定顺序表示)由于"压扁"而丢失这两个更改列表!

这会混淆后续的merge/resolve;它试图一次完成所有的操作,它最大的努力是将02->0101->legacy_01合并成02->legacy_01,考虑到这些操作最初发生的顺序,这实际上不是你想要的。

copy操作期间,有一个undoc设置会警告你这个问题:

C:Perforcetestseongchan-test>p4 configure set dm.copy.movewarn=1
For server 'any', configuration variable 'dm.copy.movewarn' set to '1'
C:Perforcetestseongchan-test>p4 copy A/... main/...
//stream/main/seongchan-test/main/02.txt#1 - delete from //stream/main/seongchan-test/A/02.txt#1,#2
//stream/main/seongchan-test/main/01.txt#1 - sync/integrate from //stream/main/seongchan-test/A/01.txt#1,#3
... can't open as move/add because a file already exists in this location.
//stream/main/seongchan-test/main/legacy_01.txt#1 - branch/sync from //stream/main/seongchan-test/A/legacy_01.txt#1
... can't open as move/add because //stream/main/seongchan-test/main/01.txt is not being opened for delete.
Some files couldn't be opened for move.  Try copying from @268 instead?

如果我接受错误消息的建议,我最终会分阶段进行复制,每个阶段复制move操作中的一个:

C:Perforcetestseongchan-test>p4 revert ...
//stream/main/seongchan-test/main/legacy_01.txt#none - was branch, deleted
//stream/main/seongchan-test/main/01.txt#1 - was integrate, reverted
//stream/main/seongchan-test/main/02.txt#1 - was delete, reverted
C:Perforcetestseongchan-test>p4 copy A/...@268 main/...
//stream/main/seongchan-test/main/01.txt#1 - move/delete from //stream/main/seongchan-test/A/01.txt#1,#2
//stream/main/seongchan-test/main/legacy_01.txt#1 - move/add/sync from //stream/main/seongchan-test/A/legacy_01.txt#1
C:Perforcetestseongchan-test>p4 submit -d "copy from A@268"
Submitting change 271.
Locking 2 files ...
move/delete //stream/main/seongchan-test/main/01.txt#2
move/add //stream/main/seongchan-test/main/legacy_01.txt#1
Change 271 submitted.
C:Perforcetestseongchan-test>p4 copy A/... main/...
//stream/main/seongchan-test/main/02.txt#1 - move/delete from //stream/main/seongchan-test/A/02.txt#1,#2
//stream/main/seongchan-test/main/01.txt#2 - move/add/sync from //stream/main/seongchan-test/A/01.txt#3
C:Perforcetestseongchan-test>p4 submit -d "finish copy from A"
Submitting change 272.
Locking 2 files ...
move/add //stream/main/seongchan-test/main/01.txt#3
move/delete //stream/main/seongchan-test/main/02.txt#2
Change 272 submitted.

现在,当我们合并到B时,它会看到两个移动并试图解决它们-而不是试图"压扁";就像copy那样,resolve会警告你不能同时做这两件事:

c:Perforcetestseongchan-testB2.txt - resolving move to //stream/main/seongchan-test/B/01.txt
//Samwise-dvcs-1509687817/seongchan-test/B/01.txt - can't move to an existing file

此时的修复与之前类似;您必须一次备份并执行一个变更列表(在两者之间提交),以便它们成功合并。

C:Perforcetestseongchan-test>p4 merge main/...@271 B/...
//stream/main/seongchan-test/B/01.txt#1 - integrate from //stream/main/seongchan-test/main/legacy_01.txt#1 (remapped from //stream/main/seongchan-test/B/legacy_01.txt)
... must resolve content from //stream/main/seongchan-test/main/legacy_01.txt#1
... must resolve move to //stream/main/seongchan-test/B/legacy_01.txt
C:Perforcetestseongchan-test>p4 resolve -as
c:Perforcetestseongchan-testB1.txt - merging //stream/main/seongchan-test/main/legacy_01.txt#1
Diff chunks: 0 yours + 0 theirs + 0 both + 0 conflicting
//Samwise-dvcs-1509687817/seongchan-test/B/01.txt - copy from //stream/main/seongchan-test/main/legacy_01.txt
c:Perforcetestseongchan-testB1.txt - resolving move to //stream/main/seongchan-test/B/legacy_01.txt
//stream/main/seongchan-test/B/legacy_01.txt - moved from //stream/main/seongchan-test/B/01.txt
C:Perforcetestseongchan-test>p4 submit -d "merge from main@271"
Submitting change 273.
Locking 2 files ...
move/delete //stream/main/seongchan-test/B/01.txt#2
move/add //stream/main/seongchan-test/B/legacy_01.txt#1
Change 273 submitted.
C:Perforcetestseongchan-test>p4 merge main/... B/...
//stream/main/seongchan-test/B/02.txt#1 - integrate from //stream/main/seongchan-test/main/01.txt#3 (remapped from //stream/main/seongchan-test/B/01.txt)
... must resolve content from //stream/main/seongchan-test/main/01.txt#3
... must resolve move to //stream/main/seongchan-test/B/01.txt
C:Perforcetestseongchan-test>p4 resolve -as
c:Perforcetestseongchan-testB2.txt - merging //stream/main/seongchan-test/main/01.txt#3
Diff chunks: 0 yours + 0 theirs + 0 both + 0 conflicting
//Samwise-dvcs-1509687817/seongchan-test/B/02.txt - copy from //stream/main/seongchan-test/main/01.txt
c:Perforcetestseongchan-testB2.txt - resolving move to //stream/main/seongchan-test/B/01.txt
//stream/main/seongchan-test/B/01.txt - moved from //stream/main/seongchan-test/B/02.txt
C:Perforcetestseongchan-test>p4 submit -d "finish merge from main"
Submitting change 274.
Locking 2 files ...
move/add //stream/main/seongchan-test/B/01.txt#3
move/delete //stream/main/seongchan-test/B/02.txt#2
Change 274 submitted.

与复制操作一样,我们可以看到现在每个合并操作都"重播"。源的移动操作之一;它们必须一次发生一个,因为第二次合并需要将文件移动到第一次删除的路径中。

最新更新