在perforce中集成移动的文件

在perforce中集成移动的文件,perforce,perforce-integrate,Perforce,Perforce Integrate,假设我创建了一个分支来执行我们的代码库。以下是分支规范: //depot/code/main/... //depot/code/branch/... 然后,在分支中,假设我使用 p4 integrate //depot/code/branch/a.txt //depot/code/branch/b.txt p4 delete //depot/code/branch/a.txt 现在,让我们假设对main中的a.txt进行了一些更改,我希望将其集成到分支中的b.txt中 当我尝试使用原始分支规

假设我创建了一个分支来执行我们的代码库。以下是分支规范:

//depot/code/main/... //depot/code/branch/...
然后,在分支中,假设我使用

p4 integrate //depot/code/branch/a.txt //depot/code/branch/b.txt
p4 delete //depot/code/branch/a.txt
现在,让我们假设对main中的a.txt进行了一些更改,我希望将其集成到分支中的b.txt中

当我尝试使用原始分支规范进行集成时,它不会将main中对a.txt所做的更改反映到b.txt中-有没有办法让main中所做的更改显示在重命名的文件中

分支规范相当大(数百次更改),分支中有相当多的文件被重命名,因此我希望有一种自动化的方法来实现这一点。如果我能在这里澄清任何事情,请告诉我——有一个白板会有所帮助;)

谢谢!
山姆

我不这么认为。由于没有直接的
p4重命名
,因此必须进行集成和删除-一旦完成,来自另一分支的集成将不再转到正确的文件。至少这是我的经验。

Performce 2009.1有适当的重命名,这可能有助于实现这一点-可能,并且在任何情况下,仅适用于将来的重命名。具体见:

#177023 * **
    The new 'p4 move' command allows for better support for
    renaming files.  A file must be already opened for 'edit'
    or 'add' in order to be moved.  Moved files can be synced,
    resolved and diffed against the repository just like files
    opened for 'edit'.  See 'p4 help move' for more info.

您可以将重命名添加到分支规范中。这样,至少集成将是自动的,即使分支规范将变得更长、更复杂。

我所知道的让Perforce为您处理此问题的唯一方法是使用分支规范将原始文件中的旧文件映射到分支中的新文件。也许在最近的Perforce版本中,新的move命令已经改变了这一点,但这不是我所经历过的。

您可以使用p4 fstat的输出为处理移动文件编写分支规范的创建脚本

将以下内容作为起点:

ROOT_PATH="//depot/books/..."
FIRST_CHANGE=91212

p4 fstat -Os -T headChange -F "headAction=move/* headChange>$FIRST_CHANGE" $ROOT_PATH|grep headChange | sort -u|while read DUMMY1 DUMMY2 change; do p4 describe $change; done|grep "moved from"|sed 's/\.\.\./\t/g; s/\#[0-9]*//g; s/ moved from//g;'
这将在//depot/books/…中找到所有文件。。。在变更91212或更高版本中移动的

对我们来说,这个的输出看起来像

//depot/books/bar.txt//depot/books/foo.txt


使用它来制作分支规范。

您可以添加“-3”开关以使用新的集成引擎,该引擎将检测以前使用“p4移动”移动的目标文件,并自动将其自身“重定目标”以进行后续操作 那些是移动操作

p4 integrate -3 //depot/code/main/... //depot/code/branch/...
将//depot/code/main/a.txt中的更改集成到//depot/code/branch/b.txt


这是当前2010.2版本中的“Unoc”功能,但将是即将到来的2011.1版本中的默认行为。

谢谢-更新以显示实际发出的命令-实际上我使用了p4v。我相信2009.1添加了正确的重命名-据我所知,这对历史没有帮助,p4 move的唯一好处是,您可以在单个原子变更列表中干净地移动和编辑文件,并且在签入该变更列表之前,进一步的同步将把更改从源传播到目标。签入后,它的行为与分支、编辑和删除操作相同,只是它们是不可分割的。它无助于集成从一个分支到另一个分支的移动。在其他源代码管理系统中,这并不是所谓的“第一类重命名”。我认为您可能是对的-看起来是这样的-尽管,数据库中记录了元数据,Performce将来可能会添加适当的处理?以前无法区分分支和重命名。不,即使使用适当的
p4移动
,集成也不会像它应该的那样工作。但是当您递归地重命名整个目录时,这是否有效?我需要为所有文件逐个创建分支规范吗?似乎在目录上创建分支规范不起作用。@Calmarius,如果重命名目录和目录中的文件,则两者都需要。如果只更改了目录,您可以只更改目录。如果名称以一致的方式更改,则可以使用通配符简化规范。