Git Alias ​​- कई कमांड और पैरामीटर


182

मैं एक ऐसा उपनाम बनाने की कोशिश कर रहा हूं जो कई Git कमांड और पोजिशनल मापदंडों का उपयोग करता है। प्रत्येक के लिए Stackoverflow पृष्ठ हैं, और यह दोनों को करने के लिए स्पष्ट रूप से स्पष्ट दिखाई देगा, लेकिन मुझे परेशानी हो रही है।

एक उदाहरण के रूप में, मैं शाखा फू पर स्विच करना चाहता हूं और एक स्थिति का प्रदर्शन करना चाहता हूं। तो मेरे में .gitconfig, मेरे पास है:

  [alias] 
     chs = !sh -c 'git checkout $0 && git status'

जो काम नहीं करता है। जबकि ऐसा कुछ काम करेगा।

chs = !sh -c 'git checkout $0'

echoes = !sh -c 'echo hi && echo bye'

किसी भी जानकारी की सराहना की जाएगी।


मेरा उपनाम: git config --global alias.go! 'Git कमिटमेंट -a && git pull --rebase && git push && git status'। नोट: सरल उद्धरण का उपयोग करें।
मार्कस बेकर

जवाबों:


157

यह काम करेगा (zsh और bash के साथ परीक्षण):

[alias] chs = !git checkout $1 && git status

1
नहीं, यह नहीं होगा। गिट में तब्दील git chs fooहो जाएगाgit checkout && git status foo
लिली बॉलर

24
दिलचस्प बात यह है कि वास्तव में शेल उपनामों में स्थित स्थितिगत चर अब भरते हैं। लेकिन यह अभी भी टूटा हुआ है, क्योंकि यह उन्हें तर्क के रूप में भी बताता है। echo $1 && echo done'' फू '' के तर्क के साथ आह्वान करने पर एक उपनाम , "फू" और "किया हुआ फू" दोनों का उत्पादन करेगा।
लिली बैलार्ड

7
के पहले आह्वान पर पूर्ववर्ती विस्मयादिबोधक बिंदु क्या है git?
एलिजा लिन

21
@ एलाइजालेन: एक गिट उर्फ ​​में, एक प्रमुख !साधन पूरी चीज को शेल में पास करता है। अन्यथा, यह मानता है कि आप एक और git कमांड चलाने की कोशिश कर रहे हैं और इसे gitबाइनरी के तर्क के रूप में पास करते हैं ।
लिली बॉलर

2
@ ब्रोनडाहल चतुर मैं हालांकि के ;:बजाय की सिफारिश करेंगे && :। और यह यूनिक्स पर भी ठीक काम करता है।
लिली बॉलार्ड

82

यह विंडोज़ बैच / msysgit bash को लक्षित करता है; अन्य वातावरणों पर काम नहीं कर सकते।

जैसा कि ओलिवियर वेर्डियर और लिली बैलार्ड ने कहा है

[alias] chs = !git checkout $1 && git status

लगभग काम करता है, लेकिन तर्क का एक अतिरिक्त अतिरिक्त देता है ...

git chs demo -> git checkout demo && git status demo

लेकिन अगर आप && :अपने उपनाम के अंत में जोड़ते हैं , तो स्थानिक तर्क को एक स्थान टैग में खपत किया जाता है।

इसलिए

[alias] chs = !git checkout $1 && git status && :

सही उत्पादन देता है ... git chs demo -> git checkout demo && git status


9
&& :सोना है और आदेशों जहां अतिरिक्त तर्क समस्याग्रस्त किया जाएगा के लिए इस समाधान काम में आता है।
क्ले

3
@Clay (या कोई और) - क्या कोई BASH को चुनौती दे सकता है कि && :वह क्या करता है?
जस्टिन मॉर्गन

7
@JustinMorgan && का अर्थ है यदि पिछली कमांड 0 (सफलता) बदल जाती है, तो && के बाद कमांड चलाएं। ':', बृहदान्त्र, एक शेल बिल्ड कमांड है, जो तर्कों का विस्तार करने और पुनर्निर्देशन से परे कुछ भी नहीं करता है और स्थिति 0 लौटाता है। यहाँ कुछ usages हैं: 1. a=123;$aत्रुटियां, लेकिन a=123; : $aनहीं। 2. : > hello.txtखाली करता है hello.txt। 3. if [ "$a" = "hello" ];then : ;fiठीक चलता है लेकिन ':' के बिना त्रुटियां। यह passअजगर की तरह है। 4. : this is a comment, अंतरिक्ष द्वारा पीछा किया जाने वाला बृहदान्त्र #एक टिप्पणी लाइन के रूप में काम करता है ।
एल्पीके

2
यह ऐसी हैक है ... git को कई कमांड मोड को स्वीकार करना चाहिए
kchoi

1
धन्यवाद @ElpieKay स्पष्टीकरण के लिए। एक प्रोजेक्ट के लिए मेरा स्थानीय git उर्फ ​​था co = !git checkout public/compiled && git checkout $1और जब मैं चाहता था कि git co masterमुझे संदेश मिल जाएगा error: pathspec 'master' did not match any file(s) known to git.। मुझे नहीं लगता था कि यह उत्तर मेरे लिए उपयोगी होगा क्योंकि पहली बात यह है कि यह विंडोज़ है और मैं लिनक्स पर हूँ। लेकिन आपने समझाया क्यों।
टायलर कोलियर

73

आप एक शेल फ़ंक्शन को परिभाषित कर सकते हैं।

[alias] chs = "!f(){ git checkout \"$1\" && git status; };f"

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

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

2
वाह ... दुर्भाग्य से, यह एक संस्करण की समस्या थी। मैं 1.7.3 Git का उपयोग कर रहा था, और इनमें से किसी भी तरीके ने काम नहीं किया। मैंने 1.7.6 और वॉइला को अपडेट किया, सब कुछ काम किया। धन्यवाद दोस्तों!
स्टेला

5
अगर विंडोज का उपयोग करते हुए मुझे लगता है कि आपको शेल फ़ंक्शन की परिभाषा को डबल-कोट्स के साथ "
घेरना है

4
ओलिवियर का जवाब मेरे लिए मापदंडों (OSX) का उपयोग करने से काम नहीं करता था। यह पूरी तरह से काम किया।
ओहद श्नाइडर

25

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

safereset = "!f() { \
                trap 'echo ERROR: Operation failed; return' ERR; \
                echo Making sure there are no changes...; \
                last_status=$(git status --porcelain);\
                if [[ $last_status != \"\" ]]; then\
                    echo There are dirty files:;\
                    echo \"$last_status\";\
                    echo;\
                    echo -n \"Enter Y if you would like to DISCARD these changes or W to commit them as WIP: \";\
                    read dirty_operation;\
                    if [ \"$dirty_operation\" == \"Y\" ]; then \
                        echo Resetting...;\
                        git reset --hard;\
                    elif [ \"$dirty_operation\" == \"W\" ]; then\
                        echo Comitting WIP...;\
                        git commit -a --message='WIP' > /dev/null && echo WIP Comitted;\
                    else\
                        echo Operation cancelled;\
                        exit 1;\
                    fi;\
                fi;\
            }; \
            f"

मैंने एक पोस्ट लिखी है और यहाँ कुछ और उदाहरण हैं


2
एक आदेश यह !f() { : resetरीसेट रीसेट github.com/git/git/blob/master/contrib/completion/…
एक उपयोगकर्ता

अच्छा काम! वह लेख किस लाइसेंस के तहत प्रकाशित होता है? अगर मैं रूसी में स्टैकऑवरफ्लो के लिए इसके कुछ हिस्सों का अनुवाद करूं तो क्या आप बुरा मानेंगे?
निक वोल्किन

@NickVolynkin देर से जवाब के बारे में क्षमा करें। धन्यवाद और निश्चित रूप से, आगे बढ़ें :)
विटाली बीटी

22
[alias]
chs = !git branch && git status

8
किसलिए है !?
ऑटोनॉमस

1
मैं डॉक्टर के लिए खोज नहीं कर सका, !लेकिन जहां तक ​​मैं डिफ़ॉल्ट रूप से गिट देख सकता हूं, यह मान लेगा कि उपनाम एक git कमांड है इसलिए t = statusकाम करेगा। हालाँकि यदि आप कोशिश करते हैं तो t = git statusयह काम नहीं करेगा (कहेगा "git" कमांड नहीं मिली है)। ताकि जहां यह !आता है, वह इसे कमांड चलाने के लिए कहता है जैसे कि यह एक शेल था, और आम तौर पर आपको इसकी आवश्यकता होती है जब आपके पास प्रति उपनाम कई गिट कमांड होते हैं, तो आप t = !git status && git logउदाहरण के लिए हो सकते हैं और यह काम करेगा।
लौरेंत

यहाँ एक StackOverflow सवाल है जो Git उपनामों में विस्मय बोधक बिंदु (!) से संबंधित है : stackoverflow.com/questions/21083933/…
याकूब लॉकड

6

इसको आजमाओ:

[alias]
    chs = "!sh -c 'git checkout \"$0\" && git status'"

इसे इस तरह से कॉल करें: git chs master


6

\प्रत्येक पंक्ति के अंत में जोड़कर मल्टीलाइन गिट उर्फ ​​होना संभव है ।

[alias] 
   chs = "!git checkout $1 \ 
          ; git status     \
         "

2
धन्यवाद! मुझे वास्तव में "!git fetch --prune --all; git pull --rebase upstream master; git push origin master"अपने उपनाम के लिए उपयोग करने में कोई समस्या नहीं थी ।
1939 में दरोगाओं का

3

यहां समस्या यह है कि पोजिशनल पैरामीटर दो बार शेल कमांड को भेजे जा रहे हैं। यह देखने के लिए कि मेरा क्या मतलब है, यह कोशिश करें:

[alias]
  test = !git echo $*

फिर, करते हैं git test this is my testing string। आपको निम्नलिखित आउटपुट (अंतिम दो पंक्तियों को यहाँ स्पष्टता के लिए संपादित करना चाहिए) का अवलोकन करना चाहिए:

03:41:24 (release) ~/Projects/iOS$ git test this is my testing string
this is my testing string this is my testing string
^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^
          #1                         #2

इस के आसपास काम करने का एक तरीका होगा

[alias]
  chs = !git checkout $1 && git status && git echo x >/dev/null

यह अतिरिक्त स्थितीय पैरामीटर का उपभोग करेगा क्योंकि यह उस अंतिम इको कमांड पर लागू हो जाता है और परिणामों पर कोई प्रभाव नहीं पड़ता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.