version control - मौसमी उपक्षेत्रों: आकस्मिक पुनरावर्ती प्रतिबद्धता रोकें और धक्का




version-control mercurial (4)

एक धारणा उन URLs का उपयोग करना है, जिनके लिए आपने अपनी .hgsub फ़ाइलों में केवल पढ़ने के लिए प्रवेश किया है। तब जब आप वास्तव में सबरेपो में धक्का करना चाहते हैं, तो आप इसमें सीडी बस सकते हैं और एक hg push THE_READ_WRITE_URL

मैं उन टीमों पर काम करता हूं जहां हमारे पास कई उप-कोशिकाओं के साथ एक मर्क्यूरिअल भंडार में एक कोड है:

main/
main/subrepo1/
main/subrepo1/subrepo2/

मर्क्यूरीयल का डिफ़ॉल्ट व्यवहार यह है कि जब "मुख्य" में एक hg commit किया जाता है, तो subrepositories "subrepo1" और "subrepo2" में कोई भी बकाया परिवर्तन भी प्रतिबद्ध होंगे। इसी तरह, जब "मुख्य" को धक्का दिया जाता है, "उपप्रो 1" और "सबरेपो 2" में कोई भी आउटगोइंग भी धक्का दिया जाएगा।

हम पाते हैं कि लोग अक्सर अनजाने में अपनी उपसभापतियों में परिवर्तन और बदलाव करते हैं (क्योंकि वे भूल गए कि उन्होंने परिवर्तन किए थे, और डिफ़ॉल्ट रूप से hg status पुनरावर्ती परिवर्तन नहीं दिखाती है)। हम यह भी पाते हैं कि ऐसी वैश्विक प्रतिबद्धताएं / धक्का हमारी टीम में लगभग हमेशा आकस्मिक हैं।

मौसमी 1.7 ने हाल ही में hg status -S और hg outgoing -S साथ परिस्थिति में सुधार किया, जो उप-रिपोजिटरी में परिवर्तन दिखाते हैं; लेकिन फिर भी, इसके लिए लोगों को ध्यान देना चाहिए।

क्या सुर्खियों में एक रास्ता है जिससे hg commit और hg push बंद कर दिया जाए यदि उप-प्रस्तुतीकरण में परिवर्तन / प्रतिबद्धताएं हों जो अन्यथा प्रतिबद्ध / धक्का देगी?


एक संभव समाधान, वॉनसी का "प्री-कमम" विचार

दो स्क्रिप्ट सेटअप करें; पहला check_subrepo_commit.sh :

#!/bin/bash

# If the environment variable "SUBREPO" is set, allow changes.
[ "x$SUBREPO" != "x" ] && exit 0

# Otherwise, ensure that subrepositories have not changed.
LOCAL_CHANGES=`hg status -a -m`
GLOBAL_CHANGES=`hg status -S -a -m`
if [ "x${LOCAL_CHANGES}" != "x$GLOBAL_CHANGES" ]; then
    echo "Subrepository changes exist!"
    exit 1
fi
exit 0

दूसरा, check_subrepo_push.sh :

#!/bin/bash

# If the environment variable "SUBREPO" is set, allow changes.
[ "x$SUBREPO" != "x" ] && exit 0

# Otherwise, ensure that subrepositories have not changed.
LOCAL_CHANGES=`hg outgoing | grep '^changeset:'`
GLOBAL_CHANGES=`hg outgoing -S | grep '^changeset:'`
if [ "x${LOCAL_CHANGES}" != "x$GLOBAL_CHANGES" ]; then
    echo "Global changes exist!"
    exit 1
fi
exit 0

अपने .hgrc में निम्न जोड़ें:

[hooks]
pre-commit.subrepo = check_subrepo_commit.sh
pre-push.subrepo = check_subrepo_push.sh

डिफ़ॉल्ट रूप से, उप-रिपोजिटरीज़ में बकाया परिवर्तन होने पर hg push और hg commit करना बंद हो जाएगा। ऐसा आदेश चलाना:

SUBREPO=1 hg commit

चेक को ओवरराइड करेगा, जिससे आपको वैश्विक प्रतिबद्ध / पुश करने की इजाजत मिलेगी यदि आप वास्तव में चाहते हैं


मर्कुरियल 2.0 स्वचालित रूप से आपको उप-कोशिकाओं को करने से रोकता है, जब तक कि आप मैन्युअल रूप से --subrepos (या, वैकल्पिक रूप से, -S ) commit करने के commit निर्दिष्ट करते commit

उदाहरण के लिए, आप एक प्रदर्शन करने का प्रयास करते हैं, जब एक सब-स्पेसिटरी में लंबित परिवर्तन होते हैं, आपको निम्न संदेश मिलता है:

# hg commit -m 'change main repo'
abort: uncommitted changes in subrepo hello
(use --subrepos for recursive commit)

आप कमांड को --subrepos जोड़कर सफलतापूर्वक प्रतिबद्ध कर सकते हैं:

# hg commit --subrepos -m 'commit subrepos'
committing subrepository hello

कुछ चीजें अभी भी सावधान रहेंगी: यदि आप संशोधन को बदलते हैं, तो वर्तमान में एक सब-स्पेसिटरी है, परन्तु उप-थैब्सटी की सामग्री नहीं, Mercurial --subrepos flag बिना बिना संस्करण में बदलाव को खुशी से करेगा। इसके अलावा, पुनरावर्ती धक्का अभी भी बिना चेतावनी के प्रदर्शन कर रहे हैं


pre-commit हुक ( precommit नहीं ) हो सकता है, आपके लिए hg status -S कर सकता है, और प्रतिबद्ध को ब्लॉक कर सकता है अगर यह कोई परिवर्तन का पता लगाता है?





mercurial-subrepos