कैसे एक git उपनाम के अंदर सीधे bash स्क्रिप्ट को एम्बेड करें


82

क्या मैं निम्नलिखित बैश शेल कोड एम्बेड कर सकता हूं:

for name in $(git diff --name-only $1); do git difftool $1 $name & done

सीधे एक उपनाम के निर्माण में:

git config --global alias.diffall ***my-bash-code-here***

यह एसओ पर मेरे पिछले प्रश्न / उत्तर से आगे बढ़ता है , जहां मैंने कोड को एक .sh फ़ाइल में डाला और फिर फ़ाइल के लिए उपनाम:

git config --global alias.diffall '!sh diffall.sh'

लेकिन सादगी के लिए कभी न खत्म होने वाली खोज में, फ़ाइल को छोड़ देना और कोड को सीधे उपनाम में शामिल करने का एक तरीका होगा? मैं प्रारूप का पता नहीं लगा सकता ...

जवाबों:


95
git config --global alias.diffall '!sh diffall.sh'

यह एक तरह से बेमानी है। अगर आप अपने $ PATH में 'diffall.sh' को किसी भी तरह से जोड़ने जा रहे हैं, तो इसे 'git-diffall' के रूप में क्यों न सहेजें, और अपने आप को उपनाम घोषित करने से बचाएं। हां, "git diffall" इसे चलाएगा।


1
उस। महान है। मुझे शुरू में चिंता थी कि मैं गलती से कुछ चलाऊंगा, क्योंकि मैंने कुछ शेल स्क्रिप्ट लिखी है git stuff करने के लिए, और उन्हें उपसर्ग 'git-' दिया, लेकिन मेरा शेल (zsh) उन्हें स्वतः पूर्ण नहीं करता है, इसलिए मैं करूँगा उन्हें स्पष्ट रूप से टाइप करना होगा। और अगर मैं स्वत: पूर्ण व्यवहार चाहता हूं, तो मैं अपने स्वयं के सबकोमैंड के लिए एक उपनाम उपनाम की घोषणा कर सकता हूं, जो एक आवश्यकता भी है कि मैं स्क्रिप्ट से उपकमांड तक लिंक स्पष्ट कर दूं।
जॉन कार्टर

1
हाँ, और यह एक द्विआधारी है जिसे आपको केवल बैंग की आवश्यकता है:! binary

1
मेरे लिए काम नहीं करता है, एक उपनाम !sh git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')परिणाम के अंदर का उपयोग कर /usr/lib/git-core/git: /usr/lib/git-core/git: cannot execute binary fileshशुरुआत में इसके साथ और बिना दोनों की कोशिश की ।
हाय-एंजेल

36

Git उर्फ ​​के अंदर कमांड चलाने के लिए, और विशेष रूप से उन कमांड के लिए तर्क पारित करने के लिए, आपको संभवतः एक अस्थायी फ़ंक्शन बनाना होगा, जिसे आप तुरंत लागू करते हैं:

$ vim ~/.gitconfig
...
[alias]
    # compare:
    foo = "! echo begin arg=$1/$2/end"
    foo2 = "!f() { echo "begin arg=$1/$2/end"; }; f"

इस उदाहरण में, फ़ंक्शन संभवतः वह है जो आपको चाहिए (और यह भी अधिक लचीला है कि आप एक "स्टेटमेंट" में क्या कर सकते हैं); और आप शायद यह बता सकते हैं कि दोनों विकल्पों के लिए, git कमांड के लिए शेष आर्गन्स बस उर्फ ​​के लिए args के रूप में पारित किए जाते हैं, भले ही यह "इको" या "एफ" हो; फ़ंक्शन को लागू करने से केवल आर्ग की खपत होती है, यह अनदेखी करते हुए कि स्पष्ट रूप से उपयोग नहीं किया जाता है:

$ git foo a b c
begin arg=a/b/end a b c

$ git foo2 a b c
begin arg=a/b/end

एक अन्य उदाहरण (सभी उपनामों की सूची देता है, मिलान पैटर्न के आधार पर) (ध्यान दें: आप एक ही फ़ंक्शन नाम "f ()" को .gitconfig में पुन: उपयोग कर सकते हैं:

[alias]
    alias = "!f() { git config --get-regexp "^alias.${1}$" ; }; f"

पहला सिर्फ "फू $" के लिए उपनाम देता है, दूसरा "फू *।" के लिए।

$ git alias foo
alias.foo ! echo begin arg=$1/$2/end

$ git alias 'foo.*'
alias.foo ! echo begin arg=$1/$2/end
alias.foo2 !f() { echo begin arg=$1/$2/end; }; f

(नायब: वास्तविक परिणाम शेल के आधार पर भिन्न हो सकते हैं; मैं लिनक्स, यूनिक्स और साइगविन (विंडोज) पर बैश के साथ इसका उपयोग कर रहा हूं।)


git.wiki.kernel.org/index.php/Aliases#What.27s_new.3F अंतर्निहित रूप से उपयोग करने की अनुशंसा करता है sh -c, इस तरह से आपको चिंता करने की ज़रूरत नहीं है कि उपयोगकर्ता का लॉगिन शेल क्या है।
क्लैक

मैंने जो फ़ंक्शन सिंटैक्स प्रदान किया है वह जानबूझकर कुछ गोले (श / क्श / बाश / ज़श) भर में पोर्टेबल है, और एक उपप्रकार को लॉन्च करने की तुलना में तेज़ होगा। मैं तब भी फ़ंक्शन सिंटैक्स का उपयोग करने की सलाह दूंगा, जब तक कि किसी विशिष्ट प्लेटफ़ॉर्म पर कोई विशिष्ट पोर्टेबिलिटी समस्या न हो।
माइकल

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

यह एक अच्छा लेख है जो यह बताता है कि आप क्या कर रहे हैं: atlassian.com/blog/git/advanced-git-aliases
गेब्रियल स्टेपल्स

नोट: मैंने इस उत्तर के संबंध में एक अनुवर्ती प्रश्न पोस्ट किया है: stackoverflow.com/questions/52123145/… । "आंतरिक git statusउपनाम आदेशों को कैसे बदलें, जैसे कि कस्टम उपनाम के साथ"
गेब्रियल स्टेपल्स

24

मैं दस्तावेज़ीकरण में नहीं मिला, लेकिन यदि आप पथ में "git- <name>" स्क्रिप्ट बनाते हैं, तो आप इसे अपने रेपो में "git नाम" के साथ कह सकते हैं।

देख:

$ cd ~/bin
$ echo "echo I love this log:
>pwd
>git log --graph  --summary --decorate --all" > git-logg
$ chmod +x git-logg
$ cd /path/to/your/repo
$ git logg
I love this log:
/path/to/your/repo
* commit 3c94be44e4119228cc681fc7e11e553c4e77ad04 (whatever-branch)
| Author: myself <my@Laptop.(none)>
| Date:   Fri Apr 1 16:47:20 2011 +0200
| 
|     would have been better not to do it at all
| 
...
$

तो, आप इस तरह (बल्कि अस्पष्ट) के साथ किसी भी अन्य उपनाम लिख सकते हैं।

इससे भी अधिक आप एक फ़ंक्शन को परिभाषित करने वाले नए कमांड में स्वतः पूर्णता जोड़ सकते हैं। यहाँ जानकारी

$ _git_logg ()
{
  # you can return anything here for the autocompletion for example all the branches
  __gitcomp_nl "$(__git_refs)" 
}

+1, सोचा कि यह केवल git libexec फ़ोल्डर से काम करेगा। इस टिप को साझा करने के लिए धन्यवाद
ओलिवियर रिफेलो

14

इन 2 लाइन को अपनी .it / config फाइल में जोड़कर ट्रिक करना चाहिए।

[alias]
    diffall = '!for name in $(git diff --name-only $1); do git difftool $1 $name & done'

संपादित करें: संभवतः गिट-कॉन्फिगर संस्करण भी काम करता है, लेकिन मैं प्रबंधन की आसानी के लिए अपने एलियास को कॉन्फिग फ़ाइल में रखना पसंद करता हूं।

गिट विकी पर एक अच्छा पृष्ठ है जो उपनामों को बहुत स्पष्ट रूप से समझाता है: http://git.or.cz/gitwiki/Aliases विशेष रूप से, 'उन्नत उपनामों के साथ तर्क पढ़ें'


git config --global आपके उपनामों को $ HOME / .ITconfig पर संग्रहीत करेगा, जहाँ (IMO) उन्हें प्रबंधित करना और भी आसान है; लगभग किसी भी एलियास को रिपॉजिटरी विशिष्ट होने की आवश्यकता नहीं है। (रेपो विशिष्ट / रेपो /
.गित

धन्यवाद डेविड, लेकिन यह सिर्फ मेरे लिए काम नहीं करेगा - वह या आपके द्वारा शामिल किए गए महान लिंक में कोई भी विविधता। शायद मुझे उल्लेख करना चाहिए था कि मैं विंडोज वातावरण में चल रहा हूं? धन्यवाद कैसर, सहमत, यह मेरे लिए 'वैश्विक' है।
सेबा इलिंगवर्थ

इन दिनों, git.wiki.kernel.org/index.php/Aliases#Advanced दिखने में अच्छी जगह है। (git या cz लिंक वहां पुनर्निर्देशित करता है, लेकिन विशेष रूप से इस खंड में तर्कों के साथ जटिल चीजें चलाने का उल्लेख है)
Clacke

-4

(ProGit प्रलेखन से: http://progit.org/book/ch7-3.html )

क्या आपने .git / हुक में स्क्रिप्ट जोड़ने का प्रयास किया है?

उदाहरण के लिए, यदि आप एक स्क्रिप्ट बनाते हैं। .it / हुक / पोस्ट-चेकआउट:

#!/bin/bash

echo "This is run after a 'git checkout'"

और फिर कमांड चलाएं:

$ git checkout master
Switched to branch 'master'
This is run after a 'git checkout'

3
कॉन्फ़िगरेशन, एक्सटेंशन और उपनाम के साथ हुक का क्या करना है?
4:39 पर स्टीव बुज़ोनस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.