2012-12-05 9 views
11

मैं एक खोल स्क्रिप्ट है कि निम्न करता लिखना कोशिश कर रहा हूँ: किसी भी परिवर्तन को खींचने के लिए के लिएपरिवर्तन के लिए गिट की जांच करने के लिए शैल स्क्रिप्ट और बदली गई फ़ाइलों के माध्यम से लूप?

  1. चेकों दूरस्थ Git भंडार।
  2. यदि रिमोट गिट रिपॉजिटरी में बदलाव हैं तो उन परिवर्तनों को खींचें।
  3. नई फ़ाइलों के माध्यम से लूप या संशोधित किया गया है।

मेरे शोध के माध्यम से मुझे इन चीजों को करने के लिए कुछ आवश्यक आदेश मिल गए हैं, लेकिन मैं उन्हें शैल स्क्रिप्ट में एक साथ काम करने में सक्षम नहीं हूं।

#!/bin/sh 

#Check if there are any changed files 
git --git-dir="/dir/.git" fetch origin 

if git --git-dir="/dir/.git" log HEAD..origin/master --oneline 
then 

#Output the modified files from the last pull 
     git --git-dir="/dir/.git" diff --name-status ORIG_HEAD.. 

fi 

चीजें हैं जो मैं इस स्क्रिप्ट में आदेश के साथ काम कर प्राप्त करने में सक्षम नहीं किया गया है:

  1. यहाँ आदेशों मेरे पास से कुछ के साथ एक स्क्रिप्ट है अगर यह बयान है कि क्या परिवर्तन हैं या हमेशा सत्य नहीं है। मैंने कोशिश की है कि अन्य गिट कमांड के साथ बयान और वे हमेशा सत्य भी हैं। ऐसा लगता है कि गिट सामान्य शेल कमांड की तरह काम नहीं करता है जहां आपको 0 या 1 प्रतिक्रिया मिलती है। अगर मैं किसी कथन में सही प्रतिक्रिया वापस करने के लिए इस या अन्य गिट कमांड की तरह गिट कमांड कैसे प्राप्त कर सकता हूं?

  2. बदले गए फ़ाइलों को एक सरणी में देखने के लिए मैं कमांड आउटपुट को कैसे आवंटित कर सकता हूं ताकि मैं इनके माध्यम से लूप कर सकूं?

यदि मेरी स्क्रिप्ट में कमांड वास्तव में इस मामले में काम नहीं करेंगे तो ऐसा करने का बेहतर तरीका क्या है?

संपादित करें: जब मैं फ़ाइलों के माध्यम से लूप करने से पहले रिमोट रिपोजिटरी से परिवर्तनों को खींचने के लिए आवश्यक फ़ाइलों के माध्यम से लूप करता हूं तो क्षमा करें और अधिक स्पष्ट होना चाहिए ताकि जब मैं इन फ़ाइलों के साथ काम करता हूं तो मेरे पास नवीनतम परिवर्तन होते हैं।

उत्तर

9

अपने पहले प्रश्न के लिए जब आप अपने से बाहर निकलें कोड आप इसे किसी भी तरह से उत्पादन मुद्रित करने के लिए नहीं चाहते हैं के लिए यह प्रयोग कर रहे हैं, तो आप git diff --quiet (या git diff --exit-code, लेकिन आम तौर पर उपयोग कर सकते हैं के लिए, और git diff --quiet का तात्पर्य --exit-code) यह निर्धारित करने के लिए कि क्या कोई परिवर्तन किया गया है। यदि परिवर्तन होते हैं तो यह आपको 1 मान देगा, और यदि 0 नहीं है तो वह आपको देगा।तो अगर आपको लगता है कि तभी परिवर्तन कर रहे हैं चलेंगे कोड करना चाहते हैं:

if ! git --git-dir="/dir/.git" diff --quiet 
then 
    # do stuff... 
fi 

अपने दूसरे प्रश्न के लिए, मैं git diff-tree से एक while read ... पाश लाइनों को पढ़ने के लिए सलाह देते हैं:

git --git-dir="/dir/.git" diff-tree ORIG_HEAD.. | \ 
    while read srcmode dstmode srcsha dstsha status srcfile dstfile 
    do 
     # do something with $srcfile and $dstfile 
    done 

ध्यान दें कि $srcmode में शुरुआत में अतिरिक्त : होगा, और $dstfile का नाम केवल तभी होगा जब फ़ाइल का नाम बदल दिया गया हो। यदि आप नामों के बारे में चिंता नहीं करना चाहते हैं, तो --no-renames में पास करें, और नाम देखने के बजाय आप केवल जोड़ और हटाएंगे।

3

आप सही हैं, git सामान्य रूप से गैर त्रुटि स्थिति से बाहर नहीं निकलता है जब तक कि कोई त्रुटि न हो। सबसे आसान तरीका मैं अप्रतिबद्ध परिवर्तन का पता लगाने के लिए मिल गया है कुछ इस तरह है:

let changes=0 
while read status filename; do 
    let changes=1 
    # do something with this filename/status 
done < <(git status --porcelain) 
if ((! changes)); then 
    echo "No changes." 
fi 

सामान्य तौर पर, आप कोड से Git ड्राइव करने के लिए प्रयास करने के लिए जा रहे हैं, तो आप उन subcommands जो इसे समर्थन पर --porcelain का उपयोग करना चाहिए, इसे एक और स्वचालन-अनुकूल फैशन में कार्य करने के लिए। आप अपने स्वयं के खोल आदेशों के निर्माण के बिना अन्य भाषाओं के लिए पुस्तकालयों की जांच भी कर सकते हैं; उदाहरण के लिए, रूबी में grit है।

अब, आपके मामले में, आप यह जानना चाहते हैं कि अपस्ट्रीम क्या बदल गया है। इसके लिए, आप शायद git diff-tree का उपयोग करना चाहते हैं। इसके बाद के संस्करण की तरह ही तर्क:

git fetch # not pull 
while read filename; do 
    # do something with filename 
done < <(git diff-tree --name-only origin/master master) # or whatever branch you're using 
+0

हाय मार्क। आपके जवाब के लिए धन्यवाद। मैंने आपकी स्क्रिप्ट चलाने की कोशिश की लेकिन मुझे निम्न त्रुटि मिल रही है: अप्रत्याशित टोकन '<'' किया <<(गिट स्थिति --porcelain)' के पास वाक्यविन्यास त्रुटि। कोई विचार क्या सही वाक्यविन्यास होना चाहिए? – startupsmith

+0

क्या आप वाकई बैश का उपयोग कर रहे हैं? –

+0

हाय मार्क। आप सही हैं मैं बैश का उपयोग नहीं कर रहा था ... यह अब काम करता है। मुझे इसे और देखने की ज़रूरत है, लेकिन मैं यह स्क्रिप्ट देख सकता हूं कि रिमोट रिपोजिटरी से खींचने से पहले बदली गई फ़ाइलों के माध्यम से यह स्क्रिप्ट लूप करेगा? – startupsmith

1

आप फ़ाइलों के सभी फाइलनामों को सूचीबद्ध करने के लिए बस git diff --name-only का उपयोग कर सकते हैं।

उदाहरण के लिए, यहां संपादित की गई सभी PHP फ़ाइलों को सूचीबद्ध करने और सिंटैक्स का परीक्षण करने के लिए यहां एक साधारण स्क्रिप्ट है।

#!/bin/bash 
files=`git diff --name-only | grep -E '.php$' ` 
for file in $files; do 
    php -l $file 
done 
संबंधित मुद्दे

 संबंधित मुद्दे