确定在Perforce中同步到的最后一个变更列表

时间:2020-03-05 18:48:34  来源:igfitidea点击:

偶尔会出现一个问题,那就是确定上一次在Perforce中同步到的变更列表的最佳方法是什么。对于自动构建系统将变更列表编号注入修订信息之类的事情,通常需要这样做。

解决方案

回答

只是为了自己回答这个问题,以符合Jeff的建议,即使用Stackoverflow作为保留技术摘要的位置...。

从命令行使用:

p4 changes -m1 <@clientname>

只需将其替换为客户规范的名称即可。这将产生以下形式的输出:

Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'

可以很容易地对其进行分析以提取变更列表编号。

回答

对于认真的构建(正在准备进行测试的构建),请显式指定所需的标签或者变更列表编号,与标签同步,并将其嵌入到构建工件中。

如果未提供更改列表(或者标签),请使用" p4计数器更改"获取当前更改编号并记录下来。但是我们仍然需要使用该更改号来同步所有内容。

我认为我们无法完全实现所需的功能,因为一般而言,整个工作区不会同步到特定的变更列表编号。可以将某些文件显式同步到较早的修订版,然后只有一个变更列表编号是没有意义的。这就是为什么需要全新的" sync"以确保单个变更列表编号准确表示代码版本的原因。

关于评论:是的,我的答案供配置管理器使用,以准备进行质量检查。我们的开发人员通常不会在构建过程中进行同步;他们会在提交之前进行构建,以确保他们所做的更改不会破坏构建或者测试。在这种情况下,我们不必费心嵌入存储库标签。

使用方法,我们假设整个工作空间在上次提交变更列表时已同步到头部,并且该变更列表包含了所有打开的文件。在这些假设中容易被误解,很难被​​发现,并且在浪费的时间方面损失惨重。另一方面,解决问题很容易,没有缺点。而且由于可以明确指定变更列表编号,因此无论我们需要哪个修订版或者代码库的更改速度都没有关系。

回答

对于自动构建系统,我建议相反:首先应使用以下命令从服务器获取最新的变更列表:

p4 changes -s submitted -m1

然后同步到该更改并将其记录在修订信息中。原因如下。尽管Perforce建议使用以下方法来确定工作空间同步到的更改列表:

p4 changes -m1 @clientname

他们注意到一些陷阱:

  • 仅当我们尚未从相关工作空间提交任何内容时,此方法才有效。
  • 客户端工作空间也可能未同步到任何特定的更改列表。

还有一个他们没有提到的添加陷阱:

  • 如果同步发生的最高更改列表从工作空间中严格删除了文件,则将报告次高更改列表(除非也严格删除了文件)。

如果我们必须先同步并稍后进行记录,Perforce建议运行以下命令来确定我们是否对上面的陷阱感到困惑;它应表明没有同步或者删除任何内容:

p4 sync -n @changelist_number

回答

我们可以尝试在" p4文件"命令的输出中找到最大更改数。但是,工作目录不应包含同步后的提交。比这还好一点

p4 changes -m1 "./...#have"

由于后者似乎在服务器上运行,并且由于" MaxResults"限制,可能无法在大型源代码树上失败。

$ p4 changes -m1 "./...#have"
Request too large (over 850000); see 'p4 help maxresults'.

$ p4 -G files "./...#have" | python c:/cygwin/usr/local/bin/p4lastchange.py
Files: 266948
2427657

其中p4lastchange.py是基于J.T. Goldstone于2005年4月15日在柯达信息网/ Ofoto的"从命​​令行使用P4G.py"中的代码得出的。

#! /usr/bin/env python
import sys, os, marshal

if os.name == "nt":
    # Disable newline translation in Windows.  Other operating systems do not
    # translate file contents.
    import msvcrt
    msvcrt.setmode( sys.stdin.fileno(), os.O_BINARY )

lastcl = 0
num = 0
try:
    while 1:
        dict = marshal.load(sys.stdin)
        num = num + 1
        for key in dict.keys():
            # print "%s: %s" % (key,dict[key])
            if key == "change":
                cl = int(dict[key])
                if cl > lastcl:
                    lastcl = cl
except EOFError:
    pass
print "Files: %s" % num
print lastcl

回答

到目前为止,我发现最好的方法是将同步到要构建的任何更改列表,然后使用更改-m1 //...#必须获取当前的本地更改列表(修订版)。

p4同步@CHANGELIST_NUM
p4更改-m1 //...#have | awk'{print $ 2}'

为我们提供更改列表编号,我们可以在任何地方使用它。我目前正在寻找一种比p4更改-m1 //...#have更简单的方法。