2012-02-28 16 views
8

युक्त जब मैं एक उपनामजोड़ें Git उर्फ ​​अर्धविराम

[alias] 
    my-alias = submodule foreach 'git foo ; git bar' 

Git (संस्करण 1.7.1) बनाने की कोशिश त्रुटि

[email protected]:/path/repo.git$ git my-alias 
error: unclosed quote 
fatal: Bad alias.my-alias string 

ऐसा लगता है कि .gitconfig अजीब पार्स नियम का उपयोग करता निसृत, ताकि ; को उद्धरण के अंदर भी एक पंक्ति टिप्पणी शुरू करने के रूप में माना जाता है।

मैं इस उपनाम को कैसे निर्दिष्ट करूं?

उत्तर

8

लपेटें दोहरे उद्धरण में पूरे उर्फ ​​आदेश:

my-alias = "submodule foreach 'git foo ; git bar'" 

दोहरे उद्धरण चिह्नों .gitconfig पार्सर अर्धविराम पारित करने के लिए होता है। submodule foreach पर तर्क को सीमित करने के लिए एकल उद्धरणों की अभी भी आवश्यकता है; उनके बिना, यह

submodule foreach 'git foo' 
git bar 

ताकि git bar केवल एक बार अंत में मार डाला जाता है, पार्स हो जाता है।

2

आपको सिंगलक्वॉट्स (') के बजाय डबलक्वॉट्स (") का उपयोग करने की आवश्यकता है।

[alias] 
    foo = "submodule foreach 'echo foo; echo bar'" 
    bar = submodule foreach 'echo foo; echo bar' 

$ git foo 
foo 
bar 
$ git bar 
fatal: Bad alias.bar string: unclosed quote 
+0

यह काफी काम नहीं करता है; 'इको बार' केवल अंत में एक बार निष्पादित हो जाता है। –

+0

इसके बजाय पूरे उपनाम मान को लपेटने के लिए डबलक्वॉट्स का उपयोग करने का प्रयास करें। – Amber

0

मैं

[alias] 
    sm-clean-all = "submodule foreach --recursive 'git clean -fXd'" 
3

सुनिश्चित नहीं हैं कि इस अर्धविराम से संबंधित है, लेकिन यहाँ जाता है - यहाँ Git अन्य नाम के लिए एक और परीक्षण है, bash का उपयोग कर:

[alias] 
     testbash = "!bash -c \"ix=1; echo a\\$ix\"" 

परीक्षण:

$ git testbash 
a1 

बचने का कोई अन्य रूप मुझे या तो सादा पुराना "घातक: खराब कॉन्फ़िगरेशन फ़ाइल लाइन" देता है, या "उन्मूलन d उद्धृत स्ट्रिंग "या" अप्रत्याशित EOF "(यह भी shell - Calling bash from sh (dash) with commands read from args, and "Unterminated quoted string"/"unexpected EOF" - Unix & Linux Stack Exchange देखें)

बहु के लिए

इसके अलावा:

[alias] 
    testbashm1 = "!bash -c \"ix=1; echo a\\$ix; \ 
echo b\\$ix \"" 
    testbashm2 = "!bash -c 'ix=1; echo a$ix; \ 
echo b$ix '" 

... और पंक्ति के अंत तक \n\ जोड़ने के लिए, आप इनलाइन bash टिप्पणियों का उपयोग करना चाहते हैं (#):

[alias] 
    testbashm3 = "!bash -c 'ix=1; echo a$ix; \n\ 
    #echo b$ix ; \n\ 
    echo \"c$ix\" ; '" 
0

बस डबल उद्धरण, जैसे में आदेश लपेट:

foo  = !"echo foo; echo bar" 

find के लिए अर्धविराम को शामिल करने के लिए उसे डबल-भागने, जैसे: अपने आदेश के साथ

pull-all = !"find . -name .git -type d -print -execdir git pull origin \\;" 

ही:

my-alias = "submodule foreach 'git foo; git bar'" 

समस्या निवारण के लिए, डिबग करने के लिए GIT_TRACE=1 के साथ अपने आदेश उपसर्ग आपके उपनाम, उदाहरण के लिए

$ GIT_TRACE=1 git my-alias 
18:16:07.904421 git.c:282    trace: alias expansion: my-alias => 'submodule' 'foreach' 'git foo; git bar' 
18:16:07.904437 git.c:557    trace: exec: 'git-submodule' 'foreach' 'git foo; git bar' 
18:16:07.904443 run-command.c:347  trace: run_command: 'git-submodule' 'foreach' 'git foo; git bar' 
0

पूर्ण लचीलापन के लिए, को परिभाषित करने और फोन एक समारोह:

[alias] 
    conf = ! "        \ 
     f() {        \ 
      git config \"[email protected]\" --get-regexp . \ 
      | sort;       \ 
     };         \ 
     f" 

इस उपनाम के रूप में git conf, git conf --local या git conf --global, और अतिरिक्त विकल्प उचित जगह में डाला जाता है कहा जा सकता है।

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