2011-09-01 14 views
6

मैंने सॉफ्टवेयर के tarball'd रिलीज को एक साथ रखा है जिसमें कई अलग-अलग परियोजनाओं से आउटपुट शामिल है। इन tarballs खुद को एक रिहाई माना जाता है। जारी टैरबॉल में बीओएम (सामग्री का बिल) शामिल है जो इसमें सभी परियोजनाओं और उनके संबंधित SHA1 (गिट) हस्ताक्षरों को कम करता है।मैं gnu बनाने के लिए एक गिट SHA1 कैसे पेश कर सकता हूं?

इन टैरबॉल को आसानी से पुनर्जीवित करने के लिए, मैंने एक मेक सिस्टम को एक साथ रखा है जो एक उपनिर्देशिका में भंडार को क्लोनिंग करने के लिए बीओएम लाइन-बाय-लाइन को पार करता है, फिर निर्दिष्ट संस्करण को देखकर निर्माण कर रहा है। कहो मेरी बीओएम में एक पंक्ति है:

prog-a b5286f27d65ef20eb4508f76de5a1c57d8b21d85 git+ssh://[email protected]/~/prog-a 

भंडार, अगर पहले से ही क्लोन नहीं, repos/prog-a में एक मेकअप (make -C repos/prog-a) रखा जाएगा, तो एक चेकआउट किया जाता है (cd repos/prog-a; git checkout b5286f27d6) और अंत में।

मुझे पता नहीं लगा कि कैसे gnu को यह तय करना है कि कोड के चेक किए गए संस्करण ने मुझे पहले से ही बाइनरी बनाया है या नहीं। वर्तमान में प्रत्येक एकल उप-परियोजना को चेकआउट और पुनर्निर्माण के लिए मजबूर किया जाता है।

मैं जीएनयू करने के लिए एक Git रेपो के SHA1 तो यह तय कर सकते हैं कि अगर परियोजना पुराना हो चुका है और (एक git checkout प्रदर्शन से) अपडेट करने की आवश्यकता कैसे पेश कर सकते हैं?

[संपादित करें] यह मेरा पैटर्न फ़ाइल है:

REPO_DIR=materials 
BOM=$(shell sed -r 's/([^ ]+).+/\1/' bom) 
BOM_DIR=$(shell sed -r 's_([^ ]+).+_$(REPO_DIR)/\1_' bom) 
BOM_BLD=$(shell sed -r 's_([^ ]+).+_$(REPO_DIR)/\1/\1_' bom) 

.PHONY: clean dist-clean 

all: $(BOM) 

clean: 
    @rm $(BOM) $(BOM_BLD) -rf 

dist-clean: clean 
    @rm $(REPO_DIR) 

.SECONDEXPANSION: 

$(BOM): % : $(REPO_DIR)/$$*/$$* 
    @echo " CP $< [email protected]" 
    @cp $< [email protected] 

$(BOM_BLD): % : $$(*D) 
    @echo " GIT CHECKOUT" 
    @cd $<; git checkout -q $(shell sed -rn '/$(shell echo [email protected] | sed -r 's_.+/__')/ s/.+ (.+) .+ .+ .+/\1/p' bom) 
    @echo " MAKE [email protected]" 
    @make -w -C $< $(@F) 

$(BOM_DIR): | materials 
    @echo " GIT CLONE [email protected]" 
    @cd $(REPO_DIR); git clone $(shell sed -rn '/$(shell echo [email protected] | sed -r 's_.+/__')/ s/.+ (.+) .+ .+/\1/p' bom) 

materials: 
    @echo " MKDIR [email protected]" 
    @mkdir [email protected] 
+0

यदि चेकआउट केवल उन फ़ाइलों को प्रतिस्थापित करता है जिन्हें प्रतिस्थापित करने की आवश्यकता है, तो आप बिना शर्त के चेकआउट कर सकते हैं। क्या आप कह रहे हैं कि इसकी आवश्यकता से अधिक जगह बदलती है? – ikegami

+0

नहीं, चेकआउट ठीक काम करता है, जैसा उप-प्रोजेक्ट करता है। मैं जो चाहता हूं वह शीर्ष स्तर है, यह देखते हुए कि उप-प्रोजेक्ट कौन सा चेक आउट संस्करण है, और यह निर्धारित करें कि यह बीओएम लाइन द्वारा आवश्यक/निर्दिष्ट है या नहीं। – Jamie

+1

बस चेकआउट करें। 'मेक' निर्धारित करेगा कि फ़ाइल टाइमस्टैम्प पर आधारित कुछ भी करने की आवश्यकता है या नहीं। – ikegami

उत्तर

0

मैं बिना शर्त चेकआउट कर समाप्त हो गया और पता लगाएं कि क्या कामकाज में चीजों में हेरफेर करने के लिए किया था बस समय पर हिट ले लिया है बम आइटम की निर्देशिका।

1

यह मेरा पैटर्न किया जाएगा:,

TARGETS=prog-a prog-b prog-c 

all: $(TARGETS) 

prog-a: SHA1=123fa 
prog-b: SHA1=234ab 
prog-c: SHA1=345bc 

$(TARGETS): 
    make -C "[email protected]" -e PARAM=$(SHA1) 

अपने subdir makefile में कुछ इस तरह कल्पना:

all: 
    git checkout $(PARAM) -- ./ 
    # ... other build rules 

गधा उपनिवेशों में उमिंग मेकफ़ाइल; आप निश्चित रूप से जो कुछ भी चाहते हैं वह कर नियम में कर सकते हैं।

और भी अधिक गतिशील बनाने लिपियों के लिए, कम से कम .SECONDEXPANSION, .PHONY पर एक नज़र, .PRECIOUS

+0

अद्यतन: गिट चेकआउट कहां फिट होगा इसका उदाहरण दिखाया गया है; आप निश्चित रूप से सभी/कुछ तर्क को अपरिवर्तनीय मेकफ़ाइल में उठा सकते हैं। – sehe

+0

जवाब देने के लिए समय निकालने के लिए धन्यवाद, मैं पहले से ऐसा कुछ कर रहा हूं (मेरा आगामी संपादन देखें)। मेरा सवाल अभी भी है 'मैं चेकआउट करने के लिए पैटर्न नियम के साथ आगे बढ़ने का फैसला कैसे कर सकता हूं?' – Jamie