代码之家  ›  专栏  ›  技术社区  ›  Greg Whitfield

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

  •  113
  • Greg Whitfield  · 技术社区  · 17 年前

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

    10 回复  |  直到 10 年前
        1
  •  88
  •   Syeberman    17 年前

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

    p4 changes -s submitted -m1
    

    然后同步到该更改并将其记录在修订信息中。原因如下。虽然 Perforce recommends the following 要确定与工作区同步的变更列表,请执行以下操作:

    p4 changes -m1 @clientname
    

    他们注意到一些问题:

    • 只有在您没有提交来自相关工作区的任何内容时,这才有效。
    • 客户端工作区也可能未与任何特定的变更列表同步。

    另外还有一个他们没有提到的问题:

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

    如果您必须先同步,然后再录制,则Perforce建议运行以下命令来确定您是否被上述gotchas占用;它应指示未同步或删除任何内容:

    p4 sync -n @changelist_number
    
        2
  •  28
  •   Greg Whitfield    17 年前

    我自己来回答这个问题,以符合Jeff的建议,即使用StackOverflow作为保存技术片段的位置……

    从命令行使用:

    p4 changes -m1 @<clientname>
    

    只需替换为客户机规范的名称。这将生成以下表单的输出:

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

    它很容易解析以提取变更列表编号。

        3
  •  14
  •   eel ghEEz    16 年前

    您可以尝试在“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基于 Using P4G.py From the Command Line J.T.Goldstone,柯达信息网络/ofoto,2005年4月15日。

    #! /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
    
        4
  •  8
  •   gmaghera    14 年前

    您还可以使用cstat命令:

    P4帮助CSTAT

    cstat -- Dump change/sync status for current client
    
    p4 cstat [files...]
    
    Lists changes that are needed, had or partially synced in the current
    client. The output is returned in tagged format, similar to the fstat
    command.
    
    The fields that cstat displays are:
    
        change   changelist number
        status   'have', 'need' or 'partial'
    
        5
  •  5
  •   erickson    14 年前

    对于严重的生成(正在准备测试的生成),显式指定所需的标签或变更列表编号, 同步到标签, 并将其嵌入到构建工件中。

    如果未提供变更列表(或标签),请使用 p4 counter change 获取当前更改编号并记录。但你仍然需要 使用该更改号同步所有内容。

    我认为您不能完全实现您想要的,因为一般来说,整个工作区不会同步到特定的变更列表编号。可以显式地将一些文件与旧版本同步,然后单个变更列表编号就没有意义了。这就是为什么 sync 必须确保单个变更列表编号准确表示代码版本。


    关于注释:是的,我的答案是供准备一个构建给QA的配置管理器使用的。我们的开发人员通常不会作为构建的一部分进行同步;他们会在提交之前进行构建,以便确保他们的更改不会破坏构建或测试。在这种情况下,我们不需要嵌入存储库标签。

    使用这种方法,您可以假设在提交上一个变更列表时整个工作区已同步到head,并且该变更列表包含所有打开的文件。在这些假设中很容易被误解,很难被发现,而且在损失的时间方面非常昂贵。另一方面,解决问题很容易,没有缺点。而且,由于可以显式地指定变更列表编号,所以无论您需要什么修订版,或者代码库更改的速度有多快,都无所谓。

        6
  •  4
  •   gsf    10 年前

    p4 changes -m1 @clientname 为我的客户推荐哪种方式大约需要10分钟

    这是我使用的:

    p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
    

    对于同一个客户机,需要2.1秒

        7
  •  4
  •   user31389    10 年前

    如果您使用的是P4V,则可以以图形方式执行此操作:

    • 在“仪表板”选项卡(视图->仪表板)中,选择一个文件夹,您将看到该文件夹尚未更新的更改列表列表。注意最低的数字(在最高的一行中)。
    • 确保在工作区树中选择的文件夹与以前在仪表板中选择的文件夹相同。然后转到“历史记录”选项卡(查看->历史记录),向下滚动到前面记录的数字。低于该数字的数字是当前变更列表的数字。
        8
  •  3
  •   user1442964    14 年前

    整个仓库(不仅仅是您的工作区/客户机)

    p4 counter change
    

    完成任务,只告诉最后一个变更列表。

        9
  •  2
  •   Nathan    17 年前

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

    P4同步@changelist_num P4更改-M1/…有awk'打印$2

    为您提供可以随时随地使用的变更列表编号。我目前正在寻找一种比P4更改更简单的方法-m1/…。

        10
  •  0
  •   Assaf Mendelson    13 年前

    我不确定你是否得到了你需要的答案,但我也有类似的问题。目标是在日志中编写项目的特定版本。问题是,当我们制作自己的makefile时,整个构建系统由我们的配置管理控制。这意味着所有说“同步到某个东西然后做某件事”的解决方案都不起作用,而且我不想在每次提交时手动更改版本(错误的可靠来源)。 解决方案(实际上在上面的一些答案中有所暗示)是: 在我们的makefile中,我执行p4更改-m1“./…have” 这样做的结果是更改“用户@client'msg'的日期更改编号” 我只需将消息创建成一个由记录器打印的字符串(更改编号是一个重要元素,但另一个也很有用,可以快速确定某个版本是否包含您知道自己在不进行性能检查的情况下所做的更改)。 希望这有帮助。