การกำหนดรายการการเปลี่ยนแปลงล่าสุดที่ซิงค์กับใน Perforce


117

คำถามที่เกิดขึ้นเป็นครั้งคราวคือวิธีที่ดีที่สุดในการระบุรายการการเปลี่ยนแปลงที่คุณซิงค์ครั้งล่าสุดใน Perforce สิ่งนี้มักจำเป็นสำหรับสิ่งต่างๆเช่นการฉีดหมายเลขรายการเปลี่ยนแปลงลงในข้อมูลการแก้ไขโดยระบบสร้างอัตโนมัติ


p4 changes | head -1ดูเหมือนง่ายกว่าวิธีแก้ปัญหาเหล่านี้ส่วนใหญ่
Sridhar Sarnobat

คำตอบ:


91

ฉันขอแนะนำสิ่งที่ตรงกันข้ามสำหรับระบบสร้างอัตโนมัติ: ก่อนอื่นคุณควรได้รับรายการการเปลี่ยนแปลงล่าสุดจากเซิร์ฟเวอร์โดยใช้:

p4 changes -s submitted -m1

จากนั้นซิงค์กับการเปลี่ยนแปลงนั้นและบันทึกในข้อมูลการแก้ไข เหตุผลมีดังนี้ แม้ว่าPerforceจะแนะนำสิ่งต่อไปนี้เพื่อกำหนดรายการการเปลี่ยนแปลงที่จะซิงค์พื้นที่ทำงาน:

p4 changes -m1 @clientname

พวกเขาสังเกตเห็น gotchas บางส่วน:

  • วิธีนี้ใช้ได้เฉพาะเมื่อคุณไม่ได้ส่งอะไรจากพื้นที่ทำงานที่เป็นปัญหา
  • นอกจากนี้ยังเป็นไปได้ว่าพื้นที่ทำงานของไคลเอ็นต์ไม่ได้ซิงค์กับรายการการเปลี่ยนแปลงใด ๆ

และมี gotcha เพิ่มเติมที่พวกเขาไม่ได้พูดถึง:

  • หากรายการการเปลี่ยนแปลงสูงสุดที่เกิดการซิงค์ถูกลบไฟล์อย่างเคร่งครัดจากพื้นที่ทำงานระบบจะรายงานรายการการเปลี่ยนแปลงสูงสุดลำดับถัดไป (เว้นแต่จะลบไฟล์อย่างเคร่งครัดด้วยเช่นกัน)

หากคุณต้องซิงค์ก่อนและบันทึกในภายหลัง Perforce ขอแนะนำให้เรียกใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่าคุณได้รับ gotchas ข้างต้นเล็กน้อยหรือไม่ ควรระบุว่าไม่มีการซิงค์หรือลบ:

p4 sync -n @changelist_number

เหตุใดจึง "ใช้งานได้ก็ต่อเมื่อคุณไม่ได้ส่งอะไรจากพื้นที่ทำงานที่เป็นปัญหา"
gdw2

หากคุณส่งการเปลี่ยนแปลง 'p4 changes -s ส่ง -m1' จะส่งคืนหมายเลขรายการเปลี่ยนแปลงของคุณ ตัวอย่างเช่นสมมติว่าคุณซิงค์กับรายการการเปลี่ยนแปลง 5 รอสองสามชั่วโมงแล้วส่งรายการการเปลี่ยนแปลง 10 คำสั่งการเปลี่ยนแปลงข้างต้นจะส่งคืน 10
Rinn

ลิงค์ตายแล้วใช่ไหมบทความนี้ answers.perforce.com/articles/KB/3458/
user31389

โปรดทราบว่าคุณสามารถใช้#haveแทน@clientnameซึ่งช่วยให้คุณไม่ต้องค้นหาชื่อพื้นที่ทำงานของไคลเอ็นต์ของคุณ
โยโย่

29

เพียงเพื่อตอบคำถามนี้ด้วยตัวเองตามคำแนะนำของ Jeff ในการใช้ Stackoverflow เป็นสถานที่เก็บตัวอย่างข้อมูลทางเทคนิค ....

จากบรรทัดคำสั่งใช้:

p4 changes -m1 @<clientname>

และแทนที่ด้วยชื่อข้อมูลจำเพาะลูกค้าของคุณ สิ่งนี้จะสร้างผลลัพธ์ของรูปแบบ:

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

ซึ่งแยกวิเคราะห์ได้ง่ายเพื่อแยกหมายเลขรายการการเปลี่ยนแปลง


ฉันได้รับ: คำขอใหญ่เกินไป (มากกว่า 1,500000); ดู 'p4 help maxresults'
user674669

@ user674669: ใช้ตัวเลือก -m1 ซึ่งส่งคืนเฉพาะรายการเปลี่ยนแปลงสุดท้าย (1) เท่านั้น
panako

ข้อมูลนี้จะให้ข้อมูลของรายการการเปลี่ยนแปลงที่ส่งล่าสุดไม่ใช่รายการการเปลี่ยนแปลงที่ซิงค์ล่าสุดซึ่งเป็นสิ่งที่ฝ่ายปฏิบัติการต้องการทราบ
Andreas

@marsh ฉันคิดว่ามันเป็นชื่อพื้นที่ทำงานของไคลเอ็นต์ซึ่งเป็นค่าเริ่มต้นของชื่อคอมพิวเตอร์หากไม่ได้ตั้งค่าไว้ ดูที่นี่: P4CLIENT
Andreas Haferburg

15

คุณอาจลองค้นหาจำนวนการเปลี่ยนแปลงสูงสุดในผลลัพธ์ของคำสั่ง "ไฟล์ 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 ใช้รหัสจากการนำเสนอโดยใช้ P4G.py จาก Command Lineโดย JTGoldstone, Kodak Information Network / Ofoto, 15 เมษายน 2548

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

10

หากคุณใช้ P4V คุณสามารถทำสิ่งนี้ในรูปแบบกราฟิก:

  • ในแท็บแดชบอร์ด (มุมมอง -> แดชบอร์ด) เลือกโฟลเดอร์และคุณจะเห็นรายการการเปลี่ยนแปลงที่โฟลเดอร์นั้นยังไม่ได้รับการอัปเดต จดตัวเลขต่ำสุด (ในแถวสูงสุด)
  • ตรวจสอบให้แน่ใจว่าใน Workspace Tree คุณได้เลือกโฟลเดอร์เดียวกันกับที่เคยอยู่ใน Dashboard จากนั้นไปที่แท็บประวัติ (View-> History) และเลื่อนลงไปที่หมายเลขที่ระบุไว้ก่อนหน้านี้ ตัวเลขที่อยู่ด้านล่างของหมายเลขนั้นคือหมายเลขรายการการเปลี่ยนแปลงปัจจุบันของคุณ

9

p4 changes -m1 @clientname ซึ่งเป็นวิธี "แนะนำ" สำหรับลูกค้าของฉันใช้เวลาประมาณ 10 นาที

นี่คือสิ่งที่ฉันใช้:

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

สำหรับไคลเอนต์เดียวกันใช้เวลา 2.1 วินาที


ชื่อลูกค้าคืออะไร? ฉันจะหาข้อมูลนี้ได้อย่างไร?
บึง

1
ชื่อไคลเอ็นต์ @marsh (หรือเวิร์กสเปซ) เป็นชื่อของอ็อบเจ็กต์ perforce ที่เก็บการแมปจากเซิร์ฟเวอร์ depo ไปยังระบบไฟล์ภายในของคุณ
gsf

2
การโหวตคำตอบนี้เนื่องจากจะตอบคำถามจริงแทนที่จะพูดว่า“ อย่าทำอย่างนั้น” (ซึ่งเป็นประเด็นที่ถูกต้อง แต่ไม่ตอบคำถาม)
sam hocevar

1
p4 changes -m1 @clientnameวิ่งไม่รู้จบ ... ได้p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'ผลจริง! ขอบคุณ!
simomo

@gsf - ขอบคุณเพิ่งลองใช้กับกล่อง Linux ของฉันและมันใช้งานได้!

8

คุณยังสามารถใช้คำสั่ง 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

สำหรับบิลด์ที่จริงจัง (ซึ่งกำลังเตรียมสำหรับการทดสอบ) ให้ระบุป้ายกำกับหรือหมายเลขรายการการเปลี่ยนแปลงที่ต้องการอย่างชัดเจนซิงค์กับเลเบลและฝังไว้ในสิ่งประดิษฐ์ของบิลด์

หากไม่ได้ระบุp4 counter changeรายการการเปลี่ยนแปลง(หรือป้ายกำกับ) ให้ใช้เพื่อรับหมายเลขการเปลี่ยนแปลงปัจจุบันและบันทึก แต่คุณยังต้องซิงค์ทุกอย่างโดยใช้หมายเลขการเปลี่ยนแปลงนั้น

ฉันไม่คิดว่าคุณจะบรรลุสิ่งที่ต้องการได้อย่างแน่นอนเพราะโดยทั่วไปแล้วพื้นที่ทำงานทั้งหมดจะไม่ซิงค์กับหมายเลขรายการเปลี่ยนแปลงใด ๆ เราสามารถซิงค์ไฟล์บางไฟล์กับการแก้ไขที่เก่ากว่าได้อย่างชัดเจนจากนั้นหมายเลขรายการการเปลี่ยนแปลงเดียวก็ไม่มีความหมาย นั่นเป็นเหตุผลว่าทำไมจึงต้องมีการใหม่syncเพื่อให้แน่ใจว่าหมายเลขรายการการเปลี่ยนแปลงเดียวแสดงถึงเวอร์ชันของรหัสได้อย่างถูกต้อง


เกี่ยวกับความคิดเห็น: ใช่คำตอบของฉันมีไว้สำหรับใช้โดยผู้จัดการการกำหนดค่าที่เตรียมบิลด์เพื่อมอบให้กับ QA โดยปกตินักพัฒนาของเราจะไม่ซิงค์เป็นส่วนหนึ่งของบิลด์ พวกเขาสร้างงานสร้างก่อนที่จะส่งเพื่อให้แน่ใจได้ว่าการเปลี่ยนแปลงจะไม่ทำลายโครงสร้างหรือการทดสอบ ในบริบทนั้นเราไม่ต้องกังวลกับการฝังป้ายกำกับที่เก็บ

ด้วยวิธีการของคุณคุณกำลังตั้งสมมติฐานว่าพื้นที่ทำงานทั้งหมดของคุณถูกซิงค์กับส่วนหัวในเวลาที่คุณส่งรายการการเปลี่ยนแปลงครั้งล่าสุดและรายการการเปลี่ยนแปลงนั้นรวมไฟล์ที่เปิดอยู่ทั้งหมดของคุณ มันง่ายเกินไปที่จะเข้าใจผิดในสมมติฐานเหล่านั้นตรวจจับได้ยากและมีราคาแพงมากในแง่ของเวลาที่เสียไป ในทางกลับกันการแก้ปัญหาทำได้ง่ายโดยไม่มีข้อบกพร่อง และเนื่องจากสามารถระบุหมายเลขรายการการเปลี่ยนแปลงได้อย่างชัดเจนจึงไม่สำคัญว่าคุณต้องการการแก้ไขใดหรือโค้ดเบสจะเปลี่ยนแปลงเร็วเพียงใด


Erickson - คำแนะนำที่ดี แต่ฉันคิดว่ามันครอบคลุมสถานการณ์ที่แตกต่างจากคำตอบที่ฉันให้ไว้เล็กน้อย แน่นอนว่าตัวนับจะใช้งานได้หากคุณมีแนวโน้มที่จะมีการแก้ไขเฉพาะส่วนหัวเท่านั้นและเซิร์ฟเวอร์ไม่ว่างเพียงพอดังนั้นบางคนที่ทำงานในโปรเจ็กต์อื่นจะไม่ทำการส่งระหว่างการซิงค์และการโทรตัวนับ p4 ดังนั้นฉันคิดว่าคำแนะนำของคุณน่าจะดีที่สุดเมื่อระบบบิลด์ทำการดึงที่แตกต่างจากนั้นสร้าง คำตอบของฉันครอบคลุมถึงกรณีที่อาจแยกการซิงค์ออกจากบิลด์ได้ทันเวลา ทั้งสองอย่างถูกต้องขึ้นอยู่กับสถานการณ์ที่ฉันคิด
Greg Whitfield

3

สำหรับคลังข้อมูลทั้งหมด (ไม่ใช่เฉพาะพื้นที่ทำงาน / ไคลเอนต์ของคุณ)

p4 counter change

ทำงานได้ดีเพียงแค่บอกรายการการเปลี่ยนแปลงล่าสุด


2
โปรดทราบว่ารายการนี้จะรายงานจำนวนรายการการเปลี่ยนแปลงของคลังล่าสุดรวมถึงรายการการเปลี่ยนแปลงที่รอดำเนินการ (เช่นยังไม่ได้ส่ง) ดังนั้นผู้ใช้ที่เริ่มงานใหม่ในไคลเอนต์จะส่งผลต่อจำนวนนี้ สิ่งนี้จะแตกต่างจากรายการการเปลี่ยนแปลงล่าสุดที่ซิงค์กับพื้นที่ทำงานในเครื่อง
jasonmray

2

สิ่งที่ดีที่สุดที่ฉันพบในตอนนี้คือทำการซิงค์กับรายการการเปลี่ยนแปลงใด ๆ ที่คุณต้องการสร้างจากนั้นใช้การเปลี่ยนแปลง -m1 //...#have เพื่อรับรายการการเปลี่ยนแปลงในเครื่องปัจจุบัน (การแก้ไข)

p4 sync @CHANGELIST_NUM p4 การเปลี่ยนแปลง -m1 //...#have | awk "{พิมพ์ $ 2}"

ให้หมายเลขรายการการเปลี่ยนแปลงที่คุณสามารถใช้ได้ทุกที่ที่คุณต้องการ ฉันกำลังมองหาวิธีที่ง่ายกว่าการเปลี่ยนแปลง p4 -m1 //...#have


0

ฉันไม่แน่ใจว่าคุณมีคำตอบที่ต้องการหรือไม่ แต่ฉันมีปัญหาคล้ายกัน เป้าหมายคือการเขียนเวอร์ชันเฉพาะของโครงการไว้ในคนตัดไม้ของเรา ปัญหาคือในขณะที่เราสร้าง makefile ของเราเองระบบ build โดยรวมจะถูกควบคุมโดยการจัดการการกำหนดค่าของเรา ซึ่งหมายความว่าโซลูชันทั้งหมดที่ระบุว่า "ซิงค์กับบางสิ่งบางอย่างแล้วทำบางอย่าง" ใช้ไม่ได้จริงและฉันไม่ต้องการเปลี่ยนเวอร์ชันด้วยตนเองเมื่อใดก็ตามที่เรายอมรับ (แหล่งที่มาที่แน่นอนสำหรับข้อผิดพลาด) วิธีแก้ปัญหา (ซึ่งจริงๆแล้วมีคำแนะนำในคำตอบด้านบน) คือใน makefile ของเราฉันทำการเปลี่ยนแปลง p4 -m1 "./...#have" ผลลัพธ์ของสิ่งนี้คือ Change change_number ในวันที่โดย user @ client ' ผงชูรส' ฉันเพียงแค่สร้างข้อความเป็นสตริงที่คนตัดไม้พิมพ์ (หมายเลขการเปลี่ยนแปลงเป็นองค์ประกอบที่สำคัญ แต่อีกอย่างก็มีประโยชน์ในการตัดสินใจอย่างรวดเร็วว่าเวอร์ชันใดเวอร์ชันหนึ่งมีการเปลี่ยนแปลงที่คุณรู้ว่าคุณทำขึ้นเองโดยไม่ต้องบังคับให้ตรวจสอบ) หวังว่านี่จะช่วยได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.