【问题标题】:Showing Perforce changelists submitted since last sync显示自上次同步以来提交的 Perforce 变更列表
【发布时间】:2009-06-30 16:18:05
【问题描述】:

在我早上同步我的 Perforce 客户端之前,我想read the diffs and log messages 了解任何会影响我的更改列表。但不幸的是,我找不到使用p4 changes 或P4V 列出此类更改列表的简单方法。不过,我怀疑我遗漏了一些简单的东西。

有没有一种方法可以列出自上次同步客户端以来提交的所有更改列表?如果我能从以前的 depot 修订中获得完整的描述和差异,就像 p4 describe 对单个变更列表所做的那样,那就更好了。

【问题讨论】:

  • 谢谢大家,我会尝试这些,如果结果很好,我会接受一个。我希望避免使用脚本方法,但似乎基于这些答案,这就是要走的路。

标签: perforce


【解决方案1】:

简单的答案是:

p4 changes -l "...#>have"

你需要引号来避免你的 shell 做重定向。

您可以简单地迭代更改并在每个更改上调用“p4 describe”。

您可以使用“p4 diff2”获得完整的差异(假设您想要一个 unidiff):

p4 diff2 -du ...#have ...#head

但这并没有为您提供每个更改列表的差异。

【讨论】:

  • 刚刚尝试过:p4 changes -l //client_name/...'#>have' 并在视觉上与 P4V 进行了比较。有用!非常感谢。
【解决方案2】:

小心!

p4 changes "...#>have"

不列出仅包含新/添加文件的更改列表。

最好的办法是缓存最后一个同步点,比如

HEAD=`p4 counter change`
if [ -f lastbuild.txt ]
then
  OLDHEAD=`cat lastbuild.txt`
else
  OLDHEAD=`p4 changes -m1 ...#have`
  echo lastbuild.txt not found!  I will guess that your last sync was @$OLDHEAD
fi
p4 changes ...@$OLDHEAD,$HEAD > changes.txt
# -snip- review changes.txt, perhaps prompt "Continue with sync to $HEAD?"
p4 sync ...@$HEAD
echo $HEAD > lastbuild.txt

使用这种方法,如果自上次更新同步点缓存后您已提交或挑选同步任何更改列表,您将得到误报,但最好列出一个额外的更改列表以供审核,而不是错过一个,尤其是一个包含所有新代码。


不要在家里尝试这个

为了后代,我过去尝试过的其他几件事最终都失败了:

p4 changes ...#have > have.txt
p4 changes ...#head > head.txt
diff have.txt head.txt

涵盖了包含所有添加的更改列表的情况,但最终输出错误地包含了在#have 删除的文件的旧更改列表。如果您在仓库中有很多历史记录,那么性能也可能非常糟糕。

p4 sync -n ... | cut -f1 -d' ' | p4 -x- changes -m1 | sort | uniq

非常接近,但如果自上次同步以来已多次编辑文件,则无法列出较旧的更改列表。对于每个要同步的文件,它也会访问一次软件仓库,因此性能可能真的很差。

【讨论】:

  • 哇。 perforce 是生活在黑暗时代还是什么?
  • 我不会走那么远。只是#have被定义为“在这个客户端上同步的所有修订的集合”并且新文件不在那个集合中。
【解决方案3】:

P4V 的较新版本(从 2009.2 开始,可能是 2009.1)具有称为仪表板的东西,其中包含多个“任务”。其中之一是尚未同步到您的工作区的变更列表。

在菜单栏中转到查看 -> 仪表板。 DashBoard 选项卡栏右侧有一个齿轮图标,可让您配置选项。其中之一是“我的工作区中的文件不是最新版本”。未同步的文件由更改列表组织。

【讨论】:

  • 这正是我想在命令行使用 p4 模拟的内容,即我尚未更新到我的工作区的已提交更改列表的列表。 p4 update -n 给了我文件,而我想要更改列表。就像 p4 更新一样,我不应该指定任何仓库路径或类似恕我直言。如何做到这一点? @Timbo 的 p4 更新 -n |剪切-f1 -d' ' | p4 -x- 更改 -m1 |排序 | uniq 命令有效,但正如他所说,可能会很慢。还有其他解决方案吗?
【解决方案4】:

this question 的答案有帮助吗?

据我所知,您必须存储上次同步的日期/时间,然后解析p4 changes -t 的输出,以便在您的日期之后显示这些更改列表。

【讨论】:

    【解决方案5】:

    随着时间的推移,您最终可能会围绕您对 Perforce 的使用构建大量的小 sn-ps 代码。将它们全部捆绑到一个包装脚本中可能是个好主意,该脚本会为您调用 p4 并将命令传递给它,无论是否有额外的自定义步骤。

    如果您使用这种带有规则的包装器(即不直接调用 p4),让它存储您同步到的最后一个更改是微不足道的。

    【讨论】:

    • 在我以前的工作中,构建团队为我们编写了一个 p4 包装器,但我认为没有必要将它带到我的新工作中。也许我应该...
    【解决方案6】:

    在 DOS 批处理文件中,您可以执行以下操作:

    FOR /F "tokens=2 delims= " %%a IN ('p4 changes -m1') DO (SET TO_CHANGELIST=%%a)
    FOR /F "tokens=2 delims= " %%a IN ('p4 changes -m1 -c <client_name>')
           DO (SET FROM_CHANGELIST=%%a)
    
    p4 changes -s submitted @%TO_CHANGELIST%,@%FROM_CHANGELIST%
    

    它将为您提供所有 p4 更改列表的列表,这些更改列表介于您的客户端上最后一次同步的更改列表和最近提交的更改列表之间。

    如果您想获取更改列表描述和差异,可以将最后一行替换为以下内容:

    FOR /F "tokens=2 delims= " %%a 
         IN ('p4 changes -s submitted @%TO_CHANGELIST%,@%FROM_CHANGELIST%') 
         DO (p4 describe %%a)
    

    我建议您将此数据通过管道传输到一个文件中,以便于查看。

    【讨论】:

    • 它不起作用。从我所见,看起来 %FROM_CHANGELIST% 没有设置为我同步客户端的最后一个更改列表,但最后一个 submitted 来自或 pending 在我的客户端,这是完全不同的。重新阅读 p4 更改联机帮助页表明此观察是正确的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2015-04-22
    • 2017-03-05
    • 1970-01-01
    相关资源
    最近更新 更多