2008-09-05 52 views

回答

83

我建議相反的自動構建系統:你應該首先使用從服務器獲取最新的變更列表:

p4 changes -s submitted -m1 

然後同步到這種變化,並在修訂信息記錄。原因如下。雖然Perforce recommends the following以確定該工作區同步變更列表:

p4 changes -m1 @clientname 

他們注意到一些陷阱:

  • 如果你還沒有從有問題的工作區提交任何這隻作品。
  • 也可能客戶端工作區未同步到任何特定的更改列表。

,並有一個額外的疑難雜症,他們不提:

  • 如果最高變更表所述同步發生從工作區嚴格刪除的文件,下一個最高的變更列表將報告(除非它也嚴格刪除文件)。

如果您必須先同步並稍後記錄,則Perforce建議運行以下命令以確定您是否已被上述陷阱所困擾;應該說明什麼是同步或刪除:

p4 sync -n @changelist_number 
+1

感謝您的額外信息。 – 2008-11-03 14:49:15

25

只是爲了這個回答自己在使用#1,以保持技術片斷的地方傑夫的建議維持....

在命令行中使用:

p4 changes -m1 @<clientname> 

而剛剛與更換您的客戶端規格的名稱。這將產生以下形式的輸出:

Change 12345 on 2008/08/21 by [email protected] '....top line of description...' 

可輕鬆解析這些數據以提取更改列表號。

+0

我得到:請求過大(超過1500000);請參閱'p4 help maxresults'。 – user674669 2016-07-28 23:08:39

+0

@ user674669:使用只返回最後(1)更改列表的選項-m1 – panako 2016-11-25 09:15:47

+1

客戶名稱是什麼?我有服務器端口工作區?用戶名??? – marsh 2017-06-01 19:16:29

5

對於認真構建(正在準備測試的構建版本),請明確指定所需的標籤或更改列表編號,同步到標籤,並將其嵌入到構建工件中。

如果未給出更改列表(或標籤),請使用p4 counter change獲取當前更改編號並記錄。但你仍然需要使用該更改號碼同步所有內容。

我不認爲你可以實現你想要的,因爲一般來說,整個工作區沒有同步到特定的更改列表號。可以顯式地將某些文件同步到較舊的版本,然後單個更改列表號碼就沒有意義。這就是爲什麼需要新的sync以確保單個更改列表號碼準確表示代碼版本。


關於評論:是的,我的答案旨在供配置管理人員準備構建以提供QA。我們的開發人員通常不會同步作爲構建的一部分;他們在提交—之前進行構建,以確保他們的更改不會破壞構建或測試。在這種情況下,我們不打算嵌入存儲庫標籤。

用你的方法,你假設你的整個工作空間已經同步到你最後一次提交變更列表的時候,並且這個變更列表包含了你所有打開的文件。在這些假設中很容易被誤解,很難察覺,而且在時間浪費方面非常昂貴。另一方面,解決問題很簡單,沒有缺點。而且因爲可以明確指定更改列表號,所以您需要的修訂版或代碼庫更改速度有多快並不重要。

+0

埃裏克森 - 很好的建議,但我認爲它涵蓋了一些與我提供的答案略有不同的情況。如果您只有頭部修訂版本,並且服務器不夠忙,那麼某人(可能在另一個項目上工作)不會在同步和調用p4計數器之間進行提交,那麼當然可以使用計數器。所以我認爲你的建議可能是最好的,當構建系統正在做一個明確的拉動然後構建。我的答案涵蓋了同步可能與構建時間分開的情況。取決於我認爲的情況,兩者都有效。 – 2008-09-05 22:58:25

12

您可以嘗試在「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呈現由JTGoldstone,柯達信息網/爲Ofoto,4月15日的代碼,2005年

#! /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 
2

到目前爲止,我已經找到了最好的是將你的同步到你想要建立的變更列表,然後使用變更-m1 //...#來獲取當前的本地變更列表(修訂版)。

p4 sync @CHANGELIST_NUM p4 changes -m1 //...#have | awk'{print $ 2}'

爲您提供可在任何地方使用的更改列表號。我目前正在尋找比p4更改-m1 //... #have更簡單的方法。

6

你也可以使用靜剛度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' 
3

對於整個軟件倉庫(而不僅僅是你的工作空間/客戶端)

p4 counter change 

做工作,只是告訴最後的更改列表。

0

我不確定你是否得到了你需要的答案,但我有類似的問題。目標是在我們的記錄器中寫入項目的特定版本。問題是,當我們製作自己的makefile時,整個構建系統由我們的配置管理來控制。這意味着所有說「同步到某個東西然後執行某些事情」的解決方案並不真正起作用,並且我不想在我們提交時肯定會手動更改版本(確定錯誤來源)。 解決方案(實際上暗示上面的一些答案)是這樣的: 在我們的makefile中,我做了p4變更-m1「。/ ...#have「 這樣做的結果是由user @ client'msg'更改change_number日期 我只是將消息創建爲記錄器打印的字符串(更改編號是重要元素,但其他編碼對於迅速判定某一版本包含的變化,你知道你不打算Perforce的檢查)做你自己。 希望這有助於。

2

p4 changes -m1 @clientname這是「建議」的方式來做到這一點對我的客戶需要10分鐘左右

這是我用的:

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

相同的客戶端需要2.1秒

2

如果您正在使用P4V可以圖形做到這一點:

  • 在儀表板標籤(查看 - >控制面板),選擇一個文件夾,你會看到列表該文件夾尚未更新的更改列表。請注意最低的數字(最高一行)。
  • 確保在工作區樹中選擇了與先前在儀表板中相同的文件夾。然後轉到歷史記錄選項卡(查看 - >歷史記錄)並向下滾動到前面提到的數字。低於該數字的數字是您當前更改列表的編號。
相關問題