बिना पुश-अप के स्वचालित रूप से अपस्ट्रीम सेट करने के लिए गिट पुश को कैसे कॉन्फ़िगर करें?


100

git push originजब मैं पहली बार स्थानीय स्तर पर बनाई गई शाखा को आगे बढ़ाता हूं तो मैं स्वचालित रूप से अपस्ट्रीम संदर्भ सेट करना चाहता हूं ।

मुझे पता है git push -u, लेकिन मैं इस बारे में सोचना नहीं चाहता कि मैंने -uपहले कभी इस्तेमाल किया है या नहीं, अपस्ट्रीम संदर्भ सेट करें। दूसरे शब्दों में, मैं उस शाखा के किसी भी धक्का पर git pushस्वचालित रूप से प्रभाव डालना चाहता हूं git push -uजिसमें पहले से कोई अपस्ट्रीम नहीं है।

क्या यह संभव है? यदि इसके लिए एक उपनाम या उपयोगिता स्क्रिप्ट की आवश्यकता है, तो यह ठीक है।


2
क्या आपने चेक किया है कि क्या git-config (1) में विकल्पों push.defaultऔर branch.<name>.mergeविकल्पों का उपयोग करना संभव है ?

5
मैंने push.defaultनिर्धारित किया है current- कि कैसे मैं सिर्फ git push originएक refspec या अपस्ट्रीम के बिना कह सकता हूं । लेकिन यह स्वचालित रूप से अपस्ट्रीम को सेट करने में मदद नहीं करता है।
जॉन

जवाबों:


61

आप इसका git configउपयोग करके कॉन्फ़िगर कर सकते हैं git config --global push.default current

डॉक्स: https://git-scm.com/docs/git-config/#Documentation/git-config.txt-pushdefault


8
मेरे पास वह सेट है - यह कि मैं सिर्फ git push originएक refspec या अपस्ट्रीम के बिना कैसे कह सकता हूं । लेकिन यह स्वचालित रूप से अपस्ट्रीम को सेट करने में मदद नहीं करता है।
जॉन

मेरे लिए काम करता है: +1:
टिम स्ट्रीजहोर्स्ट

हाँ, के रूप में @ जॉन कहते हैं, यह महत्वपूर्ण ध्यान रखें कि इस करता है में रखने के लिए नहीं स्थानीय शाखा दूरस्थ एक ट्रैक बनाने के; यह केवल स्थानीय नाम के समान रिमोट शाखा बनाता है।
वाल्ड्रियस

बहुत अच्छा है अगर आपको सिर्फ जरूरत है push, जैसे कि केवल एक डेवलपर अपनी शाखा पर है, जो केवल एक रेपो की एक प्रति संपादित करता है।
superarts.org

26

चूँकि मुझे नहीं लगता कि यह git config का उपयोग कर संभव है, यहाँ आप bash में क्या कर सकते हैं:

[[ $(git config "branch.$(git rev-parse --abbrev-ref HEAD).merge") = '' ]] && git push -u || git push

यदि वर्तमान शाखा में रिमोट ट्रैकिंग शाखा है, तो यह कॉल करता है git pushअन्यथा git push -u


24
अब आप कर सकते हैं git config --global push.default current
एंड्रिया बर्गांज़ो

2
@AndreaBergonzo यह मेरे लिए एकमात्र अच्छा उत्तर है, क्या आप इसे उत्तर के रूप में जोड़ सकते हैं?
pdem

6
@AndreaBergonzo, @pdem - ध्यान दें कि push.default=currentकेवल रिमोट रिपॉजिटरी में स्थानीय शाखा के समान नाम से एक शाखा बनाता है, लेकिन रिमोट को ट्रैक करने के लिए स्थानीय शाखा को सेट नहीं करता है । मुझे यकीन नहीं है कि ऐसा क्यों है, लेकिन यह ध्यान में रखने योग्य है।
वाल्ड्रियस

22

नोट: यह तथ्य कि नई डिफ़ॉल्ट पुश पॉलिसी " simple" एक शाखा पर निर्भर करती है जिसका एक अपस्ट्रीम होता है, जिसका अर्थ है:
एक अपस्ट्रीम शाखा की स्थापना एक स्वैच्छिक कदम के रूप में देखी जाती है, न कि एक स्वचालित स्वचालित

जब " git push [$there]" यह नहीं कहता है कि क्या धक्का देना है, तो हमने अब तक पारंपरिक "मिलान" शब्दार्थों का उपयोग किया है (आपकी सभी शाखाएं दूरस्थ को तब तक भेजी गईं जब तक कि वहां पहले से ही एक ही नाम की शाखाएं हैं)।

हम " simple" शब्दार्थ का उपयोग करेंगे जो वर्तमान शाखा को उसी नाम से शाखा में धकेलता है, केवल जब वर्तमान शाखा उस दूरस्थ शाखा के साथ एकीकृत करने के लिए सेट होती है । इसे बदलने के लिए
उपयोगकर्ता वरीयता विन्यास चर " push.default" है।


तो मैकेनिकलफिश के जवाब से निर्माण , आप एक उपनाम को परिभाषित कर सकते हैं, सही दोहरे उद्धरणों के साथ ( ") बच गए ( \"):

git config alias.pu "![[ $(git config \"branch.$(git rev-parse --abbrev-ref HEAD).merge\") = '' ]] && git push -u || git push"

git pu origin

Sc0ttyD टिप्पणियों में निम्नलिखित उपनाम प्रस्तावित करता है :

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'

कई लाइनों में:

alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && 
           git push -u origin $(git symbolic-ref --short HEAD) || 
           git push'

1
उर्फ को कैसे सेट किया जाए, यह दिखाने के लिए धन्यवाद। मैं आपके उत्तर के पहले भाग के संबंध या प्रासंगिकता पर स्पष्ट नहीं हूँ।
जॉन

2
@ मेरी बात यह है: आप एक ऐसे कदम को दरकिनार कर देंगे, जो एक इरादे वाला माना जाता है। आप उस उपनाम को सेटअप कर सकते हैं, लेकिन मैं अन्य पाठकों को स्पष्ट करना चाहता था कि यह स्पष्ट -uविकल्प क्यों मौजूद है, और कहा गया विकल्प को स्वचालित बनाने के लिए कोई कॉन्फ़िगरेशन क्यों नहीं है (इसलिए उपनाम)।
वॉन

2
मेरे पास .zshrc में zsh उपनामों की एक सूची है। मैंने निम्नलिखित उत्तर उपनाम बनाने के लिए इस उत्तर को संशोधित किया:alias gpu='[[ -z $(git config "branch.$(git symbolic-ref --short HEAD).merge") ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push'
Sc0ttyD

2
@ Sc0ttyD दिलचस्प, धन्यवाद। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी को शामिल किया है।
VonC

17

मुझे भी यही समस्या हुई है। मुझे यह उपनाम (.gitconfig) मिला है

[alias] track = "!git branch --set-upstream-to=origin/`git symbolic-ref --short HEAD`"

उपयोग: git trackएक बार नई शाखा के अनुसार (वर्तमान में चेक आउट)। फिर सामान्य रूप से धक्का दें :)


15

@VonC और @Frexuz द्वारा उत्तर उपयोगी हैं, लेकिन उनके दोनों समाधान मेरे लिए एक त्रुटि पैदा करते हैं। उनके दोनों जवाबों का उपयोग करते हुए, मैंने एक साथ कुछ किया जो मेरे लिए काम करता है:

    [alias]
    pu = ![[ $(git config "branch.$(git symbolic-ref --short HEAD).merge") = '' ]] && git push -u origin $(git symbolic-ref --short HEAD) || git push

इसके परिणामस्वरूप git push -u origin $BRANCHNAMEया तो क्रियान्वयन होता है या नहीं git push, इस पर निर्भर करता है कि इसकी अपस्ट्रीम (संपत्ति branch.$BRANCHNAME.merge) को परिभाषित किया गया है।

कमांड लाइन पर इस उपनाम को दर्ज करने से भागने के कोड की आवश्यकता होगी, इसलिए सही फ़ाइल ( $HOME/.gitconfig(वैश्विक), .git/config(स्थानीय), या /etc/gitconfig(सिस्टम) में सम्मिलित करने के लिए संपादक का उपयोग करना सबसे आसान है


3
यह सबसे सीधा और पूर्ण उत्तर है। फ़ाइल के लिए शिकार किए बिना डिफ़ॉल्ट संपादक को खोलने के लिए, आप कर सकते हैंgit config --global -e
एडम टॉली

5

संक्षिप्त जवाब

यदि आप वास्तव में स्पष्ट होना पसंद करते हैं और -uआवश्यक होने पर विकल्प का उपयोग करते हैं , लेकिन अभी संपूर्ण लिखना नहीं चाहते हैं:

git push -u origin foo

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

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

और बस टाइप करें:

git push-u

लंबा जवाब

आमतौर पर, -u(शॉर्टहैंड के लिए --set-upstream) की आवश्यकता तब होती है जब हमने सिर्फ एक नई स्थानीय शाखा और प्रतिबद्ध बनाया है, और हम इसे ऊपर की ओर धकेलना चाहते हैं। रिमोट रिपॉजिटरी की नई शाखा अभी तक नहीं है, इसलिए हमें कमिट को पुश करने से पहले रिमोट ब्रांच बनाने और ट्रैक करने के लिए गिट को बताने की जरूरत है। यह केवल शाखा पर पहले धक्का के लिए आवश्यक है। यहाँ एक विशिष्ट परिदृश्य है:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push -u origin foo      # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

व्यक्तिगत रूप से, मुझे git push -uदूरस्थ शाखा बनाते समय स्पष्ट होने की आवश्यकता है : यह एक बहुत ही महत्वपूर्ण ऑपरेशन है, दुनिया के लिए एक नई शाखा साझा करना।

हालाँकि, मुझे नफरत है कि हमें स्पष्ट रूप से लिखना होगा git push -u origin foo। न केवल यह टाइप करने के लिए एक दर्द है, लेकिन इससे भी महत्वपूर्ण बात यह है कि यह काफी त्रुटिपूर्ण है! शाखा नाम लिखते समय गलती करना आसान है, और नई दूरस्थ शाखा में आपकी स्थानीय शाखा के समान नाम नहीं होगा! ज्यादातर मामलों में, वास्तव में, आप चाहते हैं कि अपस्ट्रीम रिपॉजिटरी हो origin, और अपस्ट्रीम शाखा का आपकी स्थानीय शाखा के समान नाम हो।

इसलिए, मैं अपने में निम्नलिखित उपनाम का उपयोग कर रहा हूं .gitconfig, जो मार्क द्वारा प्रदान किए गए उत्कृष्ट उत्तर का सबसेट है :

[alias]
    push-u = !git push -u origin $(git symbolic-ref --short HEAD)

अब, हम निम्नलिखित कर सकते हैं, जो अभी भी स्पष्ट है, लेकिन कम त्रुटि-प्रवण:

git checkout -b foo         # Create local branch
git commit -m "Foo"         # Create local commit
git push-u                  # Create and track remote branch, and push commit
git commit -m "Bar"         # Create local commit
git push                    # Push commit

4

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

function con { git checkout -b $1 && git push --set-upstream origin $1; }

$ 1 पहली दलील का प्रतिनिधित्व करता है जिसे आप पास करते हैं conइसलिए ऐसा करने जैसा है:

git checkout -b my-new-branch && git push -u my-new-branch

... ऐसा करने से:

con my-new-branch

2

सीधे शब्दों में:

$ alias gush="git push -u origin HEAD"

2
प्रश्न का शीर्षक: "बिना पुश-अप के स्वचालित रूप से सेट अप करने के लिए गिट पुश कैसे कॉन्फ़िगर करें?" विवरण: "मुझे पता है git push -u, लेकिन ..."। तो यह सवाल का जवाब नहीं है।
जॉन

2
@ जॉन ने एक साधारण उपनाम का सुझाव देने के लिए मेरे उत्तर को अपडेट किया।
djanowski

2
@ जॉन अब इस सवाल का जवाब देता है?
djanowski

1
@ ILI4SK4RIM धन्यवाद, यह पागल है कि मेरा जवाब सबसे सरल है, फिर भी यह -1 ツ_ (¯) _ / ¯
djanowski


1

यदि आप कम संभव कुंजियों के साथ बिल्ट-इन गिट विशेषताओं का उपयोग करना चाहते हैं, तो बस टाइप करें:

$ git push -u o tab H tab

और स्वत: पूर्ण आप दे देंगे $ git push -u origin HEAD

OSX पर ऑटोकॉमप्लेट को सक्षम करने के लिए इस सामग्री के साथ एक ~/.git-completition.bashफ़ाइल सेट करें और अपनी ~/.bash_profileफ़ाइल में निम्न पंक्तियाँ जोड़ें और अपने टर्मिनल को पुनरारंभ करें:

# git branch autocomplete
if [ -f ~/.git-completion.bash ]; then
  . ~/.git-completion.bash
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

यह बिल्ट-इन टर्मिनलों को भी प्रभावित करता है, जैसे कि vscode आदि में।


स्वत: पूर्ण कर? git में स्वतः पूर्ण नहीं है। आपके शेल (बैश? Zsh?) में स्वतः पूर्ण नियमों का एक सेट है। क्या आप इस बारे में जानकारी प्रदान कर सकते हैं कि आप किस नियम का उपयोग कर रहे हैं और उन्हें कहाँ से प्राप्त करना है?
vy32

ओह, विलेख धन्यवाद में। मैंने अपना उत्तर अपनी स्वतः पूर्ण सेटिंग्स के साथ पूरा कर लिया है।
गज़द्गोर्गो जूल

आपकी फ़ाइल की सामग्री को जाने बिना ~ / .IT- पूरा करना.बैश, आपका जवाब परिचालन योग्य नहीं है।
vy32

1
अच्छी बात। मैंने अपने स्रोत का पता लगाया git-completition.bashऔर अपने उत्तर में जोड़ा।
गज़द्गोर्गो जूल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.