我有两个流,
Source
和Target
。在某个时刻,在 Source
上创建了一个文件,称为 FileA
。然后,从Source
分支创建目标流。 FileA
上的 Source
随后更名为 FileB
。
现在我需要将这个更改合并到
Target
。当 FileA
重命名为 Target
时,结果应该是 FileB
。
我通常可以使用
p4 integrate
并指定 fromFiles
和 toFiles
来合并单个文件。
对于标有
move/delete
的文件,此工作流程会中断。我收到一条错误消息,内容如下:
move/delete(s) must be integrated along with matching move/add(s)
好吧,我会看看
move/add
目标是什么,并将其添加到命令中。但这是一个转折点。 p4 integrate
允许仅通过使用文件规范系统来定位多个文件。我无法指定两个单独的文件,除非它们共享路径的某些部分,但在上述情况下并不总是如此。
但并非所有希望都破灭了,因为您可以使用
fromFiles
代替,而不是在 toFiles
中明确指定 p4 integrate
和 branch mapping
。您可以在其中指定任意数量的映射,因此我可以显式添加 move/delete
对和 move/add
对。问题解决了吧?
不,因为,这也不起作用,因为 perforce 似乎是逐行处理
branch mapping
的,所以一旦到达第一行,它就会抛出相同的错误。即使我交换顺序,将 move/add
对放在 move/delete
对之前,它仍然会抱怨。
如果文件被重命名为完全不同的内容,是否真的不可能将单个重命名从一个流集成到另一个流?我该如何处理这个问题?
在大多数情况下,您实际上可以只集成移动/添加;只要原始分支映射足够简单(对于流来说通常如此),就会自动发现相应的移动/删除。只有在某些棘手的情况下才严格需要指定完整分支映射(例如源中的各个路径映射到目标中的不同路径并且文件在这些路径之间移动)。
这是尝试单独合并
FileA
时出现的错误:
C:\Perforce\karl>p4 merge FileA
Move/delete(s) must be integrated along with matching move/add(s).
这里我们只是将
FileB
单独合并:
C:\Perforce\karl>p4 merge FileB
//stream/Target/FileA#1 - integrate from //stream/Source/FileB#1 (remapped from //stream/Target/FileB)
... must resolve content from //stream/Source/FileB#1
... must resolve move to //stream/Target/FileB
请注意,当我们说要合并
FileB
时,p4 能够发现它链接到 FileA
,因此我们在安排文件名解析时打开 FileA
进行集成。然后我们决定:
C:\Perforce\karl>p4 resolve
c:\Perforce\karl\FileA - merging //stream/Source/FileB#1
Diff chunks: 0 yours + 0 theirs + 0 both + 0 conflicting
Accept(a) Edit(e) Diff(d) Merge (m) Skip(s) Help(?) at: at
//bob-dvcs-1709920089/FileA - copy from //stream/Source/FileB
c:\Perforce\karl\FileA - resolving move to //stream/Target/FileB
Filename resolve:
at: //stream/Target/FileB
ay: //stream/Target/FileA
Accept(a) Skip(s) Help(?) at: at
//stream/Target/FileB - moved from //stream/Target/FileA
(我也可以在这里完成
p4 resolve -as
自动执行此操作,但这样我们就无法预览各个解析操作。)
现在文件已打开,可以在
Target
流中移动:
C:\Perforce\karl>p4 opened
//stream/Target/FileA#1 - move/delete default change (text)
//stream/Target/FileB#1 - move/add default change (text)
C:\Perforce\karl>p4 resolved
c:\Perforce\karl\FileB - copy from //stream/Source/FileB#1
c:\Perforce\karl\FileB - moved from //stream/Target/FileA#1
c:\Perforce\karl\FileB - resolved move (copy from //stream/Target/FileB)
另一种选择是按变更列表合并(假设该变更列表中没有一堆我们特别想避免的其他内容):
C:\Perforce\karl>p4 revert //...
//stream/Target/FileA#1 - was move/delete, reverted
//stream/Target/FileB#none - was move/add, deleted
C:\Perforce\karl>p4 filelog //stream/Source/fileB
//stream/Source/FileB
... #1 change 4 move/add on 2024/03/08 by bob@bob-dvcs-1709920089 (text) 'moveB'
... ... moved from //stream/Source/FileA#1
//stream/Source/FileA
... #1 change 2 add on 2024/03/08 by bob@bob-dvcs-1709920089 (text) 'addA'
... ... moved into //stream/Source/FileB#1
... ... branch into //stream/Target/FileA#1
C:\Perforce\karl>p4 merge @4,4
//stream/Target/FileA#1 - integrate from //stream/Source/FileB#1 (remapped from //stream/Target/FileB)
... must resolve content from //stream/Source/FileB#1
... must resolve move to //stream/Target/FileB
Changelist 4 当然将包括移动/删除和移动/添加(因为移动保证是原子的),所以这是确保您选择两个修订的另一种方法。如果在移动之前或之后对文件进行了其他编辑,则通过更改列表进行集成(“挑选”更改列表)将特别避免合并这些编辑。