คำถามที่เกิดขึ้นเป็นครั้งคราวคือวิธีที่ดีที่สุดในการระบุรายการการเปลี่ยนแปลงที่คุณซิงค์ครั้งล่าสุดใน Perforce สิ่งนี้มักจำเป็นสำหรับสิ่งต่างๆเช่นการฉีดหมายเลขรายการเปลี่ยนแปลงลงในข้อมูลการแก้ไขโดยระบบสร้างอัตโนมัติ
คำถามที่เกิดขึ้นเป็นครั้งคราวคือวิธีที่ดีที่สุดในการระบุรายการการเปลี่ยนแปลงที่คุณซิงค์ครั้งล่าสุดใน Perforce สิ่งนี้มักจำเป็นสำหรับสิ่งต่างๆเช่นการฉีดหมายเลขรายการเปลี่ยนแปลงลงในข้อมูลการแก้ไขโดยระบบสร้างอัตโนมัติ
คำตอบ:
ฉันขอแนะนำสิ่งที่ตรงกันข้ามสำหรับระบบสร้างอัตโนมัติ: ก่อนอื่นคุณควรได้รับรายการการเปลี่ยนแปลงล่าสุดจากเซิร์ฟเวอร์โดยใช้:
p4 changes -s submitted -m1
จากนั้นซิงค์กับการเปลี่ยนแปลงนั้นและบันทึกในข้อมูลการแก้ไข เหตุผลมีดังนี้ แม้ว่าPerforceจะแนะนำสิ่งต่อไปนี้เพื่อกำหนดรายการการเปลี่ยนแปลงที่จะซิงค์พื้นที่ทำงาน:
p4 changes -m1 @clientname
พวกเขาสังเกตเห็น gotchas บางส่วน:
และมี gotcha เพิ่มเติมที่พวกเขาไม่ได้พูดถึง:
หากคุณต้องซิงค์ก่อนและบันทึกในภายหลัง Perforce ขอแนะนำให้เรียกใช้คำสั่งต่อไปนี้เพื่อตรวจสอบว่าคุณได้รับ gotchas ข้างต้นเล็กน้อยหรือไม่ ควรระบุว่าไม่มีการซิงค์หรือลบ:
p4 sync -n @changelist_number
#have
แทน@clientname
ซึ่งช่วยให้คุณไม่ต้องค้นหาชื่อพื้นที่ทำงานของไคลเอ็นต์ของคุณ
เพียงเพื่อตอบคำถามนี้ด้วยตัวเองตามคำแนะนำของ Jeff ในการใช้ Stackoverflow เป็นสถานที่เก็บตัวอย่างข้อมูลทางเทคนิค ....
จากบรรทัดคำสั่งใช้:
p4 changes -m1 @<clientname>
และแทนที่ด้วยชื่อข้อมูลจำเพาะลูกค้าของคุณ สิ่งนี้จะสร้างผลลัพธ์ของรูปแบบ:
Change 12345 on 2008/08/21 by joebloggs@mainline-client '....top line of description...'
ซึ่งแยกวิเคราะห์ได้ง่ายเพื่อแยกหมายเลขรายการการเปลี่ยนแปลง
คุณอาจลองค้นหาจำนวนการเปลี่ยนแปลงสูงสุดในผลลัพธ์ของคำสั่ง "ไฟล์ 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
หากคุณใช้ P4V คุณสามารถทำสิ่งนี้ในรูปแบบกราฟิก:
p4 changes -m1 @clientname
ซึ่งเป็นวิธี "แนะนำ" สำหรับลูกค้าของฉันใช้เวลาประมาณ 10 นาที
นี่คือสิ่งที่ฉันใช้:
p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
สำหรับไคลเอนต์เดียวกันใช้เวลา 2.1 วินาที
p4 changes -m1 @clientname
วิ่งไม่รู้จบ ... ได้p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
ผลจริง! ขอบคุณ!
คุณยังสามารถใช้คำสั่ง 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'
สำหรับบิลด์ที่จริงจัง (ซึ่งกำลังเตรียมสำหรับการทดสอบ) ให้ระบุป้ายกำกับหรือหมายเลขรายการการเปลี่ยนแปลงที่ต้องการอย่างชัดเจนซิงค์กับเลเบลและฝังไว้ในสิ่งประดิษฐ์ของบิลด์
หากไม่ได้ระบุp4 counter change
รายการการเปลี่ยนแปลง(หรือป้ายกำกับ) ให้ใช้เพื่อรับหมายเลขการเปลี่ยนแปลงปัจจุบันและบันทึก แต่คุณยังต้องซิงค์ทุกอย่างโดยใช้หมายเลขการเปลี่ยนแปลงนั้น
ฉันไม่คิดว่าคุณจะบรรลุสิ่งที่ต้องการได้อย่างแน่นอนเพราะโดยทั่วไปแล้วพื้นที่ทำงานทั้งหมดจะไม่ซิงค์กับหมายเลขรายการเปลี่ยนแปลงใด ๆ เราสามารถซิงค์ไฟล์บางไฟล์กับการแก้ไขที่เก่ากว่าได้อย่างชัดเจนจากนั้นหมายเลขรายการการเปลี่ยนแปลงเดียวก็ไม่มีความหมาย นั่นเป็นเหตุผลว่าทำไมจึงต้องมีการใหม่sync
เพื่อให้แน่ใจว่าหมายเลขรายการการเปลี่ยนแปลงเดียวแสดงถึงเวอร์ชันของรหัสได้อย่างถูกต้อง
เกี่ยวกับความคิดเห็น: ใช่คำตอบของฉันมีไว้สำหรับใช้โดยผู้จัดการการกำหนดค่าที่เตรียมบิลด์เพื่อมอบให้กับ QA โดยปกตินักพัฒนาของเราจะไม่ซิงค์เป็นส่วนหนึ่งของบิลด์ พวกเขาสร้างงานสร้างก่อนที่จะส่งเพื่อให้แน่ใจได้ว่าการเปลี่ยนแปลงจะไม่ทำลายโครงสร้างหรือการทดสอบ ในบริบทนั้นเราไม่ต้องกังวลกับการฝังป้ายกำกับที่เก็บ
ด้วยวิธีการของคุณคุณกำลังตั้งสมมติฐานว่าพื้นที่ทำงานทั้งหมดของคุณถูกซิงค์กับส่วนหัวในเวลาที่คุณส่งรายการการเปลี่ยนแปลงครั้งล่าสุดและรายการการเปลี่ยนแปลงนั้นรวมไฟล์ที่เปิดอยู่ทั้งหมดของคุณ มันง่ายเกินไปที่จะเข้าใจผิดในสมมติฐานเหล่านั้นตรวจจับได้ยากและมีราคาแพงมากในแง่ของเวลาที่เสียไป ในทางกลับกันการแก้ปัญหาทำได้ง่ายโดยไม่มีข้อบกพร่อง และเนื่องจากสามารถระบุหมายเลขรายการการเปลี่ยนแปลงได้อย่างชัดเจนจึงไม่สำคัญว่าคุณต้องการการแก้ไขใดหรือโค้ดเบสจะเปลี่ยนแปลงเร็วเพียงใด
สำหรับคลังข้อมูลทั้งหมด (ไม่ใช่เฉพาะพื้นที่ทำงาน / ไคลเอนต์ของคุณ)
p4 counter change
ทำงานได้ดีเพียงแค่บอกรายการการเปลี่ยนแปลงล่าสุด
สิ่งที่ดีที่สุดที่ฉันพบในตอนนี้คือทำการซิงค์กับรายการการเปลี่ยนแปลงใด ๆ ที่คุณต้องการสร้างจากนั้นใช้การเปลี่ยนแปลง -m1 //...#have เพื่อรับรายการการเปลี่ยนแปลงในเครื่องปัจจุบัน (การแก้ไข)
p4 sync @CHANGELIST_NUM p4 การเปลี่ยนแปลง -m1 //...#have | awk "{พิมพ์ $ 2}"
ให้หมายเลขรายการการเปลี่ยนแปลงที่คุณสามารถใช้ได้ทุกที่ที่คุณต้องการ ฉันกำลังมองหาวิธีที่ง่ายกว่าการเปลี่ยนแปลง p4 -m1 //...#have
ฉันไม่แน่ใจว่าคุณมีคำตอบที่ต้องการหรือไม่ แต่ฉันมีปัญหาคล้ายกัน เป้าหมายคือการเขียนเวอร์ชันเฉพาะของโครงการไว้ในคนตัดไม้ของเรา ปัญหาคือในขณะที่เราสร้าง makefile ของเราเองระบบ build โดยรวมจะถูกควบคุมโดยการจัดการการกำหนดค่าของเรา ซึ่งหมายความว่าโซลูชันทั้งหมดที่ระบุว่า "ซิงค์กับบางสิ่งบางอย่างแล้วทำบางอย่าง" ใช้ไม่ได้จริงและฉันไม่ต้องการเปลี่ยนเวอร์ชันด้วยตนเองเมื่อใดก็ตามที่เรายอมรับ (แหล่งที่มาที่แน่นอนสำหรับข้อผิดพลาด) วิธีแก้ปัญหา (ซึ่งจริงๆแล้วมีคำแนะนำในคำตอบด้านบน) คือใน makefile ของเราฉันทำการเปลี่ยนแปลง p4 -m1 "./...#have" ผลลัพธ์ของสิ่งนี้คือ Change change_number ในวันที่โดย user @ client ' ผงชูรส' ฉันเพียงแค่สร้างข้อความเป็นสตริงที่คนตัดไม้พิมพ์ (หมายเลขการเปลี่ยนแปลงเป็นองค์ประกอบที่สำคัญ แต่อีกอย่างก็มีประโยชน์ในการตัดสินใจอย่างรวดเร็วว่าเวอร์ชันใดเวอร์ชันหนึ่งมีการเปลี่ยนแปลงที่คุณรู้ว่าคุณทำขึ้นเองโดยไม่ต้องบังคับให้ตรวจสอบ) หวังว่านี่จะช่วยได้
p4 changes | head -1
ดูเหมือนง่ายกว่าวิธีแก้ปัญหาเหล่านี้ส่วนใหญ่