确定在Perforce中同步的最后一个更改列表
偶尔出现的问题是确定上次在Perforce中同步的更改列表的最佳方式。 对于像自动构build系统将更改列表编号注入修订信息这样的东西,通常需要这样做。
对于自动构build系统,我build议采用相反的做法:首先使用以下命令从服务器获取最新的更改列表:
p4 changes -s submitted -m1
然后同步到该更改并将其logging在修订信息中。 原因如下。 虽然Perforcebuild议以下内容来确定工作区同步到的变更列表:
p4 changes -m1 @clientname
他们注意到一些陷阱:
- 这只适用于你没有提交任何问题的工作区。
- 客户端工作区也可能没有同步到任何特定的更改列表。
还有一个他们没有提到的问题:
- 如果同步发生在工作区中的严重删除文件同步的最高更改列表,则会报告次最高更改列表(除非也严格删除文件)。
如果您必须先同步并稍后logging,则Perforcebuild议运行以下命令以确定您是否遇到了上述问题; 它应该表明没有同步或删除:
p4 sync -n @changelist_number
只是为了回答这个问题,与Jeff的build议是使用Stackoverflow作为保留技术代码片段的地方….
从命令行使用:
p4 changes -m1 @<clientname>
只需replace您的客户端规范的名称。 这将产生以下forms的输出:
Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'
这很容易parsing,以提取更改列表号码。
您可以尝试在“p4 files”命令的输出中find最大更改编号。 不过,工作目录不应包含后同步提交。 这只比一点点好
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基于使用P4G.py的代码基于2005年4月15日的JTGoldstone,柯达信息networking/ Ofoto 的命令行演示。
#! /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
你也可以使用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'
对于严重的构build(正在准备testing的构build),请明确指定所需的标签或更改列表编号, 同步到标签,并将其embedded到构build工件中。
如果没有给出p4 counter change
列表(或标签),则使用p4 counter change
来获取当前更改编号并logging。 但是您仍然需要使用该更改号码来同步所有内容。
我不认为你可以实现你想要的,因为一般来说,整个工作区没有同步到一个特定的更改列表号。 可以显式地将一些文件同步到较旧版本,然后单个更改列表号码是没有意义的。 这就是为什么需要全新的sync
来确保单个更改列表号码准确表示代码版本的原因。
关于评论:是的,我的答案旨在供configurationpipe理人员准备构build质量保证。 我们的开发人员通常不会同步作为构build的一部分; 他们在提交之前进行构build,以确保他们的变更不会破坏构build或testing。 在这种情况下,我们不打扰embedded存储库标签。
使用你的方法,你假定你的整个工作空间在你提交最后一个更改列表的时候被同步化,并且这个更改列表包含了所有打开的文件。 在这些假设中很容易被误解,很难被发现,而且在失去时间方面是非常昂贵的。 另一方面,解决这个问题很简单,没有缺点。 而且,因为可以明确指定更改列表号,所以无论您需要什么修订版或代码库更改速度如何。
对于整个仓库(不只是你的工作区/客户端)
p4 counter change
做这个工作,只是告诉最后的变更清单。
到目前为止,我发现的最好的办法是将你的同步到你想build立的任何变更列表,然后使用更改-m1 //…#have来获得当前的本地变更列表(修订版)。
p4 sync @CHANGELIST_NUM p4更改-m1 //…#have | awk'{print $ 2}'
为您提供您可以随时随地使用的更改列表号码。 我目前正在寻找比p4更简单的方式更改-m1 //…#have。
p4 changes -m1 @clientname
这是“推荐”的方式为我的客户端做了约10分钟
这是我使用的:
p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
对于同一个客户端需要2.1秒
如果你使用的是P4V,你可以用graphics的方式做到这一点:
- 在仪表板选项卡(查看 – >仪表板)中select一个文件夹,您将看到该文件夹尚未更新的更改列表。 请注意最低的数字(最高一行)。
- 确保在工作区树中select了与前面在仪表板中相同的文件夹。 然后进入“历史logging”选项卡(“查看” – >“历史logging”)并向下滚动到前面提到的数字。 该号码下面的数字是您当前更改列表的号码。
我不知道你是否得到了你需要的答案,但是我也有类似的问题。 目标是在我们的logging器中写下该项目的特定版本。 问题是,当我们正在做我们自己的makefile的时候,整个构build系统是由我们的configurationpipe理来控制的。 这意味着所有的“同步到某个东西然后执行某些事情”的解决scheme实际上并不工作,我不想在我们提交的时候手动更改版本(确定错误来源)。 解决scheme(这实际上暗示在上面的一些答案)是这样的:在我们的生成文件中,我做p4更改-m1“./…#have”结果是更改change_numberdate由user @ client' msg'我只是简单地将消息创build成由logging器打印的string(更改编号是重要的元素,但另一个也可用于快速确定某个版本是否包含您自己所做的更改,而无需执行检查)。 希望这可以帮助。