2012-12-05 43 views
6

मैं अपने लिए नई परियोजनाओं को स्थापित करने के लिए स्वचालित रूप से एक स्क्रिप्ट लिख रहा हूं।गिट कमांड से आउटपुट कैप्चर करें?

इसमें एक गिथब रिपोजिटरी खींचना शामिल है।

मुझे क्या करना चाहते हैं, मेरी स्क्रिप्ट से कुछ उत्पादन तो फोन git clone $repo

मैं जबकि यह चल रहा है आदेश से उत्पादन दिखाना चाहते हैं, लेकिन तब जब यह करता है, तो समाप्त हो गया है यह सफलतापूर्वक चला की जगह है यह आउटपुट (केवल गिट कमांड आउटपुट को नोट करें, मैं अभी भी आउटपुट चाहता हूं कि वहां से पहले) repository successfully cloned के साथ और यदि विफल हो तो वहां आउटपुट छोड़ दें, और repository cloning failed प्रिंट करें।

मैं यह कैसे कर सकता हूं?

नीचे मेरी वर्तमान (बल्कि सरल) स्क्रिप्ट है।

#! /bin/bash 

# -p project name 

templateurl="[email protected]:xxx/xxx-site-template.git" 

while getopts ":p:" opt; do #eventually I'll add more options here 

case $opt in 
    p) 
    project=$OPTARG 
    ;; 
    \?) 
    echo "Invalid option: -$OPTARG" >&2 
    exit 1 
    ;; 
    :) 
    echo "Option -$OPTARG requires an argument." >&2 
    exit 1 
    ;; 
esac 
done 

if [ -z "$project" ]; then 
    echo "Project name required" 
    exit 1 
fi 

clear 
echo "|==========================|" 
echo "| New xxx Project Creator |" 
echo "|==========================|" 
echo "Project: $project" 

if [ -d "$project" ]; then 
    echo "Directory $project already exists!" 
    exit 1 
fi 


mkdir $project 
if [ ! -d "$project" ]; then 
    echo "Failed to create project directory!" 
    exit 1 
fi 

echo "Cloning xxx Template repository" 
git clone $templateurl $project 

उत्तर

10

git clone एक निकास कोड प्रदान करता है जिसे आप $ के साथ पढ़ सकते हैं? निम्नानुसार:

git clone [email protected]:repo 
echo $? 

यदि सब कुछ ठीक काम करता है तो यह 0 प्रिंट करेगा। उदाहरण के लिए फ़ोल्डर एक Git भंडार नहीं है, तो आप बाहर निकलने कोड मिल जाएगा 128.

आप देख सकते हैं कि क्लोन के रूप में इस काम किया:

git clone [email protected]:repo localrepo --quiet 
success=$? 
if [[ $success -eq 0 ]]; 
then 
    echo "Repository successfully cloned." 
else 
    echo "Something went wrong!" 
fi 

--quiet Git से किसी भी उत्पादन, जब तक दबाने होगा कोई त्रुटि नहीं है। इसलिए यदि आप केवल अन्य शाखा को हटाते हैं तो आपको सकारात्मक आउटपुट या गिट द्वारा उत्पादित त्रुटि मिल जाएगी।

+0

मैंने स्क्रिप्ट के निचले भाग को 'गिट क्लोन $ टेम्पलेट $ 1 प्रोजेक्ट --quiet सफलता = $ होने के लिए बदल दिया है? अगर [[सफलता -eq 0]]; फिर गूंज "रिपोजिटरी सफलतापूर्वक क्लोन किया गया।" fi' लेकिन मुझे त्रुटि मिल रही है '[[: अगर कथन के साथ लाइन पर नहीं मिला'। भी, मुझे लगता है कि मेरा प्रश्न थोड़ा गलत है, मैं अभी भी सामान्य आउटपुट प्रदर्शित करना चाहता हूं क्योंकि कमांड चल रहा है ताकि उपयोगकर्ता को क्या हो रहा है पर कुछ फीडबैक प्राप्त हो। लेकिन कमांड समाप्त हो जाने के बाद मैं उस आउटपुट को दूर करना चाहता हूं। – Hailwood

+0

अगर कथन में $ लापता है: '[[$ सफलता ...;' यदि आप पहले से मुद्रित आउटपुट को हटाना चाहते हैं तो आपको कैरिज रिटर्न (\ r) से निपटना होगा और फिर पुराने आउटपुट को ओवरराइट करना होगा। मुझे लगता है कि पहले से मुद्रित आउटपुट हटाना संभव नहीं है। – sge

+0

एक और संभावना एएनएसआई-एस्केप-कोड का उपयोग करेगा http://ascii-table.com/ansi-escape-sequences.php। उदाहरण के लिए 'echo -e "\ 033 [2K" 'सक्रिय रेखा को हटा देता है।कर्सर की स्थिति को सेट करने और लाइनों को हटाने का संयोजन सफलता का कारण बन सकता है। – sge

4
git clone [email protected]:repo localrepo > git.log 2>&1 
if [[ $? eq 0 ]]; 
then 
    echo Repository successfully cloned. 
else 
    cat git.log 
    echo Repository cloning failed. 
fi 

rm git.log 

स्पष्टीकरण:

git clone [email protected]:repo localrepo > git.log 2>&1 पुनर्निर्देश stdout और stderr धाराओं git.log करने के लिए। > git.log stdout को git.log पर रीडायरेक्ट करता है 2>&1 stdout (इस प्रकार, git.log) के समान स्थान पर stderr को रीडायरेक्ट करता है।

$? eq 0 क्लोन सफल होने पर गिट के रीकोड को चेक करता है जो 0 होना चाहिए।

cat git.log git.log फ़ाइल की सामग्री आउटपुट करता है।

+0

' GITOUTPUT = \ 'गिट क्लोन उपयोगकर्ता @ सर्वर: repo localrepo \ n' दुर्भाग्यवश, गिट के आउटपुट को दबाने नहीं देगा। यहां तक ​​कि 'गिट क्लोन ...>/dev/null' किसी भी आउटपुट को दबा नहीं देता है। – sge

+1

यह तब stderr को लिखना चाहिए। मैं एक अलग जवाब पोस्ट करूंगा। – antik

+1

गिट चेकआउट भी stderr पर जाता है (लेकिन गिट पुल stdout पर जाता है?)। यह मुझे बचाया! – rob5408