2017-07-15 7 views
11

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

1.6.0 1.6.1-eap1 
.... a---b---c--- master 
     \  \ 
     d-------e--- idea-2017.1 
     \  \ 
     f-------g--- idea-2016.3 
      \  \ 
      ...  ... etc etc 

a एक स्थिर रिलीज है, और 1.6.0 साथ टैग किया गया। c एक ईएपी (बीटा) रिलीज है, और 1.6.1-eap1 के साथ टैग किया गया है। यह योजना इन दो मामलों के लिए ठीक काम करती है।

कभी-कभी मैं एक देव निर्माण बनाना चाहता हूं जो रिलीज चैनल में नहीं जाता है, लेकिन उपयोगकर्ता उपयोगकर्ता मैन्युअल रूप से डाउनलोड कर सकते हैं और उन्हें पसंद कर सकते हैं। मैं प्रत्येक मंच के लिए एक देव निर्माण का निर्माण करना चाहता हूं, क्योंकि देव उपयोगकर्ता किसी भी इंटेलिजे संस्करण का उपयोग कर सकते हैं। सबसे अच्छा तरीका मैं सोच सकता हूं कि देव निर्माण के लिए एक शाखा बनाना है, कहें, टैग (a प्रतिबद्ध करें), और फिर d, f से संबंधित शाखाएं और इसी तरह से मैं देव शाखा को मर्ज कर सकता हूं और बना सकता हूं देव बनाता है।

मान लिया जाये कि मैं बना सकते हैं और इन शाखाओं बनाए रखने के लिए एक स्क्रिप्ट लिखना चाहते हैं, मैं कैसे पा सकते हैं करता है d, f और इतने पर टैग 1.6.0 से से देव निर्माण शाखाओं बनाने के लिए?

+0

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

+0

निश्चित रूप से, यह संभव है, लेकिन समस्या एक जैसी है - टैग '1.6.1-eap1' दिया गया है, मैं 'e',' g' आदि कैसे ढूंढूं। असल में मैं इसे बनाने में सक्षम होना चाहता हूं किसी भी टैग किए गए संशोधन से शाखाएं, जो विलय करने की गारंटी है, प्रत्येक संस्करण शाखा में विलय कर रही है। – Colin

उत्तर

1

समस्या के लिए समाधान आदेश का उपयोग करने के लिए होगा "idea-2016.3 जो idea-2017 में नहीं था, और idea-2017 जो master में नहीं था में जल्द से जल्द से a आंग g जल्द से जल्द प्रतिबद्ध के बीच में मिल" इतिहास में तुम्हारा के लिए एक ही:

cf32d9f idea-2017 e 
88f264c idea-2016.3 g 
5bc9fa1 idea-2017 d 
3f460fe idea-2016.3 f 
224cac8 master c 
67620cd master b 

तो पाते हैं नवीनतम लाइन idea-2016.3 के साथ चिह्नित और नवीनतम एक ०१२३२०७४६३ के साथ चिह्नित, यह आपकी प्रतिबद्धता होगी।

ध्यान दें कि उत्पादन वांछनीय नहीं अगर वहाँ उदाहरण f के लिए में संस्करण मतभेद जो बाद में f' में तय किया गया था की वजह से कुछ अवरोधक मुद्दा था हो सकता है। तो मैं अभी भी स्पष्ट टैगिंग पर विचार करूंगा।

+0

धन्यवाद, मुझे अपने शुरुआती संस्करण से बेहतर पसंद है। मैं अंतिम प्रतिबद्धता प्राप्त करने के लिए अजीब उपयोग कर रहा हूं: 'awk' $ 2 == "विचार-2017.1" {प्रतिबद्ध = 1} अंत {प्रिंट $ प्रतिबद्ध} '' – Colin

0

शायद शैल स्क्रिप्ट में समर्थित संस्करणों/शाखा नामों की सूची बनाए रखने का सबसे आसान तरीका है?

यदि आप किसी अन्य परिवर्तन जोड़ने के कारण मैं इस सोच रहा हूँ है:

1.6.0  eap1 eap2 
.... a---b---c---h--- master 
     \  \ \ 
     d-------e---i--- idea-2017.1 
     \  \ \ 
     f-------g---j--- idea-2016.3 
      \  \ \ 
      ...  ... etc etc 

आपको लगता है कि परिवर्तन (h) अपने चित्र में दिखाया गया शाखाओं के सिर में विलय चाहते हैं, यानी he को विलय कर दिया है और g। शाखा 2017.1e पर इंगित कर रही होगी जो कि विलय करने का सही प्रतिबद्ध है।

आप एक आम पूर्वज या कुछ खोजने के लिए वापस चलने के साथ कुछ कर सकते हैं लेकिन मुझे लगता है कि यह अनावश्यक रूप से जटिल है और वास्तव में आपको कुछ भी नहीं खरीदता है।

प्लस यदि आप केवल शाखाओं की एक सूची रखते हैं तो आप अपेक्षाकृत आसानी से पुराने संस्करणों का समर्थन करना बंद कर सकते हैं।

+0

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

3

यहाँ मैं क्या कर समाप्त हो गया है:

#!/bin/sh 

set -e # Automatically abort if any simple command fails 

die() { 
    echo >&2 "[email protected]" 
    exit 1 
} 

[ "$#" -eq 2 ] || die "Usage: $0 <branch name> <tag>" 

tag_commit=$(git rev-list --abbrev-commit -n 1 $2) 
[ "${tag_commit}" = "" ] && die "No commit found for $2" 

child_commit() { 
    git log --graph --pretty=format:"%h %p" --decorate -20 --first-parent $1 | grep $2 | cut -c 3-10 
} 

branch_2017_1=$(child_commit idea-2017.1 $tag_commit) 
[ "${branch_2017_1}" = "" ] && die "No commit found for idea-2017.1" 

branch_2016_3=$(child_commit idea-2016.3 $branch_2017_1) 
[ "${branch_2016_3}" = "" ] && die "No commit found for idea-2016.3" 

branch_2016_2=$(child_commit idea-2016.2 $branch_2016_3) 
[ "${branch_2016_2}" = "" ] && die "No commit found for idea-2016.2" 

branch_2016_1=$(child_commit idea-2016.1 $branch_2016_2) 
[ "${branch_2016_1}" = "" ] && die "No commit found for idea-2016.1" 

git branch "$1" $tag_commit 
git branch "$1-2017.1" $branch_2017_1 
git branch "$1-2016.3" $branch_2016_3 
git branch "$1-2016.2" $branch_2016_2 
git branch "$1-2016.1" $branch_2016_1 

अब मैं बस अपना विलय को अपडेट कर देंगे और तैयारी स्क्रिप्ट जारी एक शाखा श्रृंखला नाम स्वीकार वैकल्पिक करने के लिए, और मुझे लगता है कि मैं अच्छा हो जाएगा।

गुप्त सॉस child_commit फ़ंक्शन में है, जिसे here से पकड़ा गया है।

git log --oneline --source --ancestry-path master idea-2017 idea-2016.3 --not 1.6.0 

उत्पादन होता है: