Perforce में सिंक किए गए अंतिम चेंजलिस्ट का निर्धारण करना


117

एक सवाल जो कभी-कभार उठता है वह है कि चेंजलिस्ट को निर्धारित करने का सबसे अच्छा तरीका क्या है जिसे आपने अंतिम बार पेरफोर्स में सिंक किया था। स्वचालित निर्माण प्रणाली द्वारा संशोधन जानकारी में चैंजिस्ट नंबर को इंजेक्ट करने जैसी चीजों के लिए अक्सर इसकी आवश्यकता होती है।


p4 changes | head -1इनमें से अधिकांश समाधानों की तुलना में आसान लगता है।
श्रीधर सरनोबत

जवाबों:


91

मैं स्वचालित बिल्ड सिस्टम के लिए विपरीत की सलाह देता हूं: आपको पहले सर्वर से नवीनतम चेंजेलिस्ट का उपयोग करना चाहिए:

p4 changes -s submitted -m1

फिर उस परिवर्तन के साथ सिंक करें और इसे संशोधन जानकारी में रिकॉर्ड करें। कारण निम्नानुसार है। हालाँकि , कार्यक्षेत्र को समकालित करने के लिए चेंजलिस्ट को निर्धारित करने के लिए Perforce निम्नलिखित की सिफारिश करता है:

p4 changes -m1 @clientname

उन्होंने कुछ गोटे नोट किए:

  • यह केवल तभी काम करता है जब आपने प्रश्न में कार्यक्षेत्र से कुछ भी जमा नहीं किया हो।
  • यह भी संभव है कि एक क्लाइंट वर्कस्पेस किसी विशिष्ट चेंजेलिस्ट के लिए सिंक नहीं किया गया हो।

और वहाँ एक अतिरिक्त gotcha वे उल्लेख नहीं है:

  • यदि उच्चतम चैंजिस्ट जो सिंक कार्यक्षेत्र से सख्ती से हटाई गई फ़ाइलों को हटाता है, तो अगले-उच्चतम चेंजेलिस्ट को रिपोर्ट किया जाएगा (जब तक कि, यह भी, सख्ती से हटा दी गई फाइलें)।

यदि आपको पहले सिंक करना होगा और बाद में रिकॉर्ड करना होगा, तो यह निर्धारित करने के लिए कि आपको उपरोक्त गोचरों द्वारा बिट किया गया है, Perforce निम्नलिखित कमांड को चलाने की सिफारिश करता है; यह इंगित करना चाहिए कि कुछ भी सिंक या हटाया नहीं गया था:

p4 sync -n @changelist_number

ऐसा क्यों है कि "यह केवल तभी काम करता है यदि आपने प्रश्न में कार्यक्षेत्र से कुछ भी जमा नहीं किया है।"
gdw2

यदि आप कोई परिवर्तन सबमिट करते हैं, तो 'p4 परिवर्तन -s सबमिट -m1' आपके चेंजलीग नंबर को लौटा देगा। उदाहरण के लिए, मान लीजिए कि आप चैंजिस्ट 5 से सिंक करते हैं, कुछ घंटों का इंतजार करते हैं और फिर चेंजलिस्ट 10 जमा करते हैं। ऊपर दिए गए कमांड्स 10. लौटेंगे।
रिन

लिंक मर चुका है, क्या यह लेख था? answers.perforce.com/articles/KB/3458/
user31389

ध्यान दें कि आप #haveइसके बजाय उपयोग कर सकते हैं @clientname, जो आपको अपने क्लाइंट कार्यक्षेत्र नाम को देखने से बचाता है।
योय

29

सिर्फ तकनीकी स्निपेट रखने के लिए एक जगह के रूप में स्टैकओवरफ्लो का उपयोग करने के जेफ के सुझाव को ध्यान में रखते हुए इसका जवाब देने के लिए ...।

कमांड लाइन के उपयोग से:

p4 changes -m1 @<clientname>

और बस अपने क्लाइंट कल्पना के नाम के साथ बदलें। इससे फॉर्म का उत्पादन होगा:

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

जिसे चैंजिस्ट नंबर निकालने के लिए आसानी से पार्स किया जाता है।


मुझे मिल रहा है: अनुरोध बहुत बड़ा (1500000 से अधिक); देखें 'पी 4 मदद मैक्सिमम'।
user674669

@ user674669: विकल्प का उपयोग करें -m1 जो केवल अंतिम (1) परिवर्तन सूची
लौटाता है

यह अंतिम प्रस्तुत किए गए चैंजिस्ट की जानकारी देता है , न कि अंतिम सिंक किए गए चैंजिस्ट को, जो वह जानना चाहता है।
एंड्रियास

@ मुझे लगता है कि यह वास्तव में क्लाइंट कार्यक्षेत्र का नाम है, जो सेट नहीं होने पर कंप्यूटर के नाम को डिफॉल्ट करता है। यहाँ देखें: P4CLIENT
एंड्रियास हैफेरबर्ग

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 JTGoldstone, कोडक सूचना नेटवर्क / टोटो, 15 अप्रैल, 2005 द्वारा कमांड लाइन प्रस्तुति से P4G.py का उपयोग करते हुए कोड पर आधारित है ।

#! /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 का उपयोग कर रहे हैं, तो आप इसे ग्राफिकल रूप से कर सकते हैं:

  • डैशबोर्ड टैब में (देखें-> डैशबोर्ड) एक फ़ोल्डर का चयन करें और आपको चेंजलिस्ट की एक सूची दिखाई देगी जो फ़ोल्डर अभी तक अपडेट नहीं है। सबसे कम संख्या (उच्चतम पंक्ति में) पर ध्यान दें।
  • सुनिश्चित करें कि कार्यक्षेत्र ट्री में आपने डैशबोर्ड में पहले जैसा फ़ोल्डर चुना है। फिर इतिहास टैब पर जाएं (देखें-> इतिहास) और पहले बताई गई संख्या तक स्क्रॉल करें। उस संख्या के ठीक नीचे की संख्या आपके वर्तमान चैंजिस्ट की संख्या है।

9

p4 changes -m1 @clientname मेरे ग्राहक के लिए इसे करने के लिए "अनुशंसित" तरीका है जिसमें लगभग 10 मिनट लगते हैं

यही है वह जो मेरे द्वारा उपयोग किया जाता है:

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

एक ही क्लाइंट के लिए 2.1 सेकंड लगते हैं


क्लाइंट का नाम क्या है? मुझे यह जानकारी कैसे मिल सकती है?
मार्स

1
@marsh क्लाइंट (या वर्कस्पेस) नाम एक पेरफ़ोर्स ऑब्जेक्ट का नाम है जो सर्वर डिपो से आपके लोकल फाइल सिस्टम में मैपिंग को होल्ड करता है
gsf

2
इस उत्तर को देखते हुए, क्योंकि यह "ऐसा नहीं करते" कहने के बजाय वास्तविक प्रश्न का उत्तर देता है (जो कि एक मान्य बिंदु है, लेकिन प्रश्न का उत्तर नहीं देता है)।
सैम होसेवर

1
p4 changes -m1 @clientnameअंतहीन चला ... p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'वास्तव में काम करता है! धन्यवाद!
सिमोमो

@gsf - धन्यवाद, बस अपने लिनक्स बॉक्स पर यह कोशिश की और यह काम किया!

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 को देने के लिए एक बिल्ड तैयार करना है। हमारे डेवलपर्स आम तौर पर एक निर्माण के हिस्से के रूप में सिंक नहीं करते हैं; वे जमा करने से पहले एक निर्माण करते हैं - ताकि वे यह सुनिश्चित कर सकें कि उनके परिवर्तन बिल्ड या परीक्षणों को नहीं तोड़ते हैं। उस संदर्भ में, हम एक रिपॉजिटरी लेबल को एम्बेड करने के लिए परेशान नहीं करते हैं।

अपने दृष्टिकोण के साथ, आप यह धारणा बना रहे हैं कि आपके पूरे कार्यक्षेत्र को आपके अंतिम चेंजलिस्ट प्रस्तुत करने के समय सिर पर सिंक किया गया था, और उस चैंजिस्ट में आपकी सभी खुली फाइलें शामिल थीं। खोए हुए समय के हिसाब से उन धारणाओं में गलत होना, पता लगाना मुश्किल और भयानक रूप से महंगा होना बहुत आसान है। दूसरी ओर, समस्या को हल करना आसान है, जिसमें कोई कमियां नहीं हैं। और क्योंकि चैंजिस्ट संख्या स्पष्ट रूप से निर्दिष्ट की जा सकती है, इससे कोई फर्क नहीं पड़ता कि आपको किस संशोधन की आवश्यकता है या कोडबेस कितनी जल्दी बदल रहा है।


एरिकसन - अच्छा सुझाव है, लेकिन मुझे लगता है कि यह मेरे द्वारा प्रदान किए गए उत्तर की तुलना में परिस्थितियों का थोड़ा अलग सेट है। निश्चित रूप से काउंटर काम करेगा यदि आप केवल हेड रिवीजन की संभावना रखते हैं, और सर्वर इतना व्यस्त नहीं है कि कोई व्यक्ति, शायद किसी अन्य प्रोजेक्ट पर काम कर रहा है, तो p4 काउंटर को सिंक और कॉल करने के बीच एक सबमिट नहीं करेगा। तो मुझे लगता है कि आपका सुझाव शायद सबसे अच्छा है जब बिल्ड सिस्टम एक अलग पुल बना रहा है तो निर्माण करें। मेरा उत्तर उन मामलों को शामिल करता है जहां सिंक निर्माण से समय में अलग हो सकता है। मेरे विचार से दोनों ही मान्य हैं।
ग्रेग व्हिटफील्ड

3

पूरे डिपो के लिए (न केवल आपके कार्यक्षेत्र / ग्राहक)

p4 counter change

नौकरी करता है, बस आखिरी चेंजलिस्ट बता रहा है।


2
ध्यान दें कि यह नवीनतम डिपो चेंजेलिस्ट की संख्या की रिपोर्ट करता है, INCLUDING लंबित है (यानी अभी तक प्रस्तुत नहीं किया गया है) तो कोई भी उपयोगकर्ता जो अपने क्लाइंट में कुछ नया काम शुरू कर रहा है, इस नंबर को प्रभावित करेगा। यह स्थानीय कार्यक्षेत्र में सिंक किए गए अंतिम चेंजलिस्ट से अलग होगा।
jasonmray

2

मैंने अब तक जो सबसे अच्छा पाया है, वह है कि आप जो भी चैंजिस्ट बनाना चाहते हैं उसका सिंक करें और फिर परिवर्तन का उपयोग करें -m1 //... वर्तमान स्थानीय चेंजलिस्ट (रिवीजन) प्राप्त करने के लिए।

p4 सिंक @CHANGELIST_NUM p4 परिवर्तन -m1 //...#have | awk '{प्रिंट $ 2}'

आपको चैंजिस्ट नंबर देता है जिसे आप जहां चाहें उपयोग कर सकते हैं। मैं वर्तमान में p4 परिवर्तन की तुलना में एक सरल तरीका खोज रहा हूँ -m1 //...#have।


0

मुझे यकीन नहीं है कि अगर आपको आवश्यक जवाब मिला, लेकिन मुझे इसी तरह की समस्या थी। लक्ष्य हमारे लकड़हारा परियोजना के विशिष्ट संस्करण में लिखना था। समस्या यह थी कि जब हम अपना स्वयं का मेकफाइल बना रहे थे, समग्र निर्माण प्रणाली को हमारे विन्यास प्रबंधन द्वारा नियंत्रित किया जाता है। इसका मतलब यह है कि सभी समाधान जो कहते हैं "कुछ करने के लिए सिंक करें तो कुछ करें" वास्तव में काम नहीं करता है और जब भी हम प्रतिबद्ध होते हैं (मैं त्रुटियों के लिए एक निश्चित स्रोत) मैन्युअल रूप से संस्करण को बदलना नहीं चाहता था। समाधान (जो वास्तव में ऊपर दिए गए कुछ उत्तरों में संकेत दिया गया है) यह है: हमारे मेकफाइल में, मैं p4 परिवर्तन करता हूं -m1 "./...#have" इसका परिणाम उपयोगकर्ता द्वारा 'ग्राहक द्वारा तारीख में परिवर्तन change_number' है। संदेश ' मैं बस संदेश को एक स्ट्रिंग में बनाता हूं जो लकड़हारा द्वारा छपा होता है (परिवर्तन संख्या महत्वपूर्ण तत्व है लेकिन दूसरा यह भी जल्दी से तय करने के लिए उपयोगी है कि क्या एक निश्चित संस्करण में वे परिवर्तन हैं जो आप जानते हैं कि आप अपने आप को जांचने के लिए बिना लागू किए गए हैं)। उम्मीद है की यह मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.