【问题标题】:Currently checked out version of a directory/file in perforce当前在 perforce 中检出目录/文件的版本
【发布时间】:2011-04-04 02:05:13
【问题描述】:

我正在尝试为 perforce 中保存的项目自动化一些构建。我想提取当前的变更列表编号作为标记构建版本的一种方式。

这个命令:

p4 changes -s submitted  ...  | head -1

非常接近于做我需要的事情,除非我没有从 perforce 签出最新版本。上面的命令(似乎)显示所有更改列表,而不仅仅是我签出的那些。

有没有办法获取最近同步到的更改列表的更改列表编号?

注意:我来自 CVS / git 背景,所以我的术语可能不正确。

【问题讨论】:

    标签: scripting automation perforce


    【解决方案1】:

    尝试运行“p4 cstat ...”。这将告诉您,对于影响“...”中的文件集的每个更改列表,您是否拥有该更改列表、需要它​​还是部分同步了它。

    【讨论】:

      【解决方案2】:

      我同意“p4 cstat”方法。

      我像这样使用它:p4 cstat| p4-版本.awk 这是以下脚本:

       #! /usr/bin/awk -f
      
       # The input format is:
       # ... change 654056
       # ... status have|need|partial
      
      
       # So what we do:
       # find the first "need" or "partial"
      
       # and we might add +N as the number of other changes we have
      
       # Major is never 0. Hence End is set only once, to a non-zero.
      
       # Note: it's assumed that 0 is not a valid P4 changelist.
       # so  0+1-1 means: no entire changelist (i.e. the initial one)
       # has been (entirely) synced.
      
       # major is the last p4 CL processed
       # end   is the last CL, up to which _fully_ synced.
       # plus/minus  additional/missing CLs.
      
       BEGIN {end=0; contiguous=1; plus=0; minus=0}
      
       /^... change ([0-9])+/ {
               change=$3;
       };
      
      
       # we have 2 states: 1/ until now all have -- contiguous=1
       #                   2/ already something not "have"
      
       # (end=0) state 1
      
       /^... status have/ {
               if (!contiguous)
                        plus++;
               else
                 end=change;
       };
      
      
       /^... status (partial|need)/ {
               minus++;
               if (contiguous) {
                       contiguous = 0;
               };
       }
      
      
       END {
               if (!contiguous)
                       printf "%d+%d-%d\n", end, plus, minus;
               else
                       printf "%d\n", end;
       }
      

      【讨论】:

      • 对输出有疑问:你有 "printf "%d+%d\n", end, plus;",加号是什么?否则,很棒的东西!感谢分享。
      • 我更新了代码 --- version+plus-minus 表示您从开始到“version”同步,另外还有其他“plus”变更集同步,“minus”没有(完全)同步——因此失踪了。
      【解决方案3】:

      虽然我不确定它是否适用于这个问题,但我想展示一种解决方案,让您可以将最新的更改列表更新到您已同步的没有间隙的更改列表(即您可以在客户端上同步新的更改列表而忽略一些较旧的,例如,如果您自己提交了更改,而之前没有同步其他人提交的一些更改)。

      使用以下命令,您可以列出所有未同步到客户端的更改:

      p4 changes ..."#>have" 
      

      如果您提取该列表的最后一个更改列表并减去 1,您将获得更改列表编号,您已将所有内容同步到该编号,没有间隙:

      echo $((`p4 changes ..."#>have" | tail -1 | awk '{print $2}'`-1))
      

      【讨论】:

        【解决方案4】:

        要在您的客户端上查找最新的更改列表,请使用以下命令:

        p4 changes -m 1 @name_of_your_client_here
        

        客户端名称可以起到标签的作用。

        【讨论】:

        • 您可能没有比已同步到客户端的最新更改列表更早的同步更改列表。例如,如果您提交了新的更改,但之前没有同步您的客户端。你应该在你的方法中提到这一点。
        • 嗯,是的。我说了这么多,但这不是问题。
        【解决方案5】:

        我认为以下内容可以满足您的要求:

        p4 fstat -T headChange ... | cut -d' ' -f3 | sort -nr | head -1
        

        p4 fstat 非常棒,因为它不仅需要一个过滤器(通过-F 选项),还需要一个字段选择参数(使用-T 选项)。

        【讨论】:

        • 这似乎提供了与提交的 p4 更改 -s 相同的版本,即:可用的最新版本,而不是当前签出的版本。
        • 我一定是看错了这个问题,我到办公室后必须检查一下。 p4 help fstat 列出了可用的属性。
        【解决方案6】:

        您想要的是文件的“haveRev”:

        rev = `p4 fstat -T haveRev <filename>|cut -d' ' -f3`
        

        然后你可以像这样查找changenumber:

        p4 filelog <filename>|grep $rev|cut -d' ' -f4
        

        请注意,我使用了签出树的特定文件。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-25
          • 2012-08-11
          • 2022-11-01
          • 1970-01-01
          • 2013-03-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多