स्थानीय शाखाओं के रूप में सभी दूरस्थ गिट शाखाओं को ट्रैक करें


175

एक एकल शाखा को स्थानीय शाखा के रूप में ट्रैक करना सीधा पर्याप्त है।

$ git checkout --track -b ${branch_name} origin/${branch_name}

सभी स्थानीय शाखाओं को रिमोट तक पहुंचाना, आवश्यकतानुसार नई रिमोट शाखाओं का निर्माण करना भी आसान है।

$ git push --all origin

मैं उल्टा करना चाहता हूं। यदि मेरे पास एकल स्रोत पर दूरस्थ शाखाओं की X संख्या है:

$ git branch -r 
branch1
branch2
branch3
.
.
.

क्या मैं उन सभी दूरस्थ शाखाओं के लिए स्थानीय ट्रैकिंग शाखाएँ बना सकता हूँ, जिन्हें बिना किसी की आवश्यकता के मैन्युअल रूप से बनाया जा सकता है? कुछ ऐसा कहें:

$ git checkout --track -b --all origin

मैंने googled और RTM किया है, लेकिन इस प्रकार अब तक चारपाई आ चुकी है।


3
स्थानीय शाखा के रूप में एकल दूरस्थ शाखा को ट्रैक करने का और भी सरल तरीका है:git checkout --track origin/branchname
सेरन

यह वही नहीं है जो आपने मांगा था, लेकिन मेरे लिए काम करता है: git पूर्णताएं प्राप्त करें: github.com/git/git/blob/master/contrib/completion/… । फिर टाइप करें git pull origin और हिट करें tab, दूरस्थ शाखाओं की सूची प्राप्त करने के लिए। फिर टाइपिंग और हिट जारी रखें return
मैक्स हाइबर

जवाबों:


111

बैश का उपयोग करना:

जीआईटी 1.9.1 के बाद
for i in `git branch -a | grep remote | grep -v HEAD | grep -v master`; do git branch --track ${i#remotes/origin/} $i; done

क्रेडिट: वैल ब्लंट, एलियास, और ह्यूगो

जीआईटी 1.9.1 से पहले

नोट: निम्न कोड यदि git (> v1.9.1) के बाद के संस्करणों में उपयोग किया जाता है

  1. (बग) सभी ने मास्टर ट्रैक करने के लिए शाखाएँ बनाईं
  2. (झुंझलाहट) सभी बनाए गए स्थानीय शाखा नामों के साथ उपसर्ग करना है origin/
for remote in `git branch -r `; do git branch --track $remote; done

शाखाओं को अपडेट करें, यह मानते हुए कि आपकी स्थानीय ट्रैकिंग शाखाओं में कोई परिवर्तन नहीं हैं:

for remote in `git branch -r `; do git checkout $remote ; git pull; done

अस्पष्ट रीपेमेंट चेतावनी को अनदेखा करें, ऐसा लगता है कि स्थानीय शाखा को पसंद करना चाहिए।


2
Refname चेतावनियों के बारे में हेड-अप के लिए धन्यवाद। यह मददगार था।
पॉल

1
धन्यवाद ओटो, मुझे संदेह था कि स्क्रिप्टिंग एकमात्र समाधान होगा। आपने बहुत सरल प्रदान किया है।
जानसन

1
@ जेसन क्या यह आज भी एकमात्र समाधान की पटकथा है?
cregox

1
@ कावा: आपको तब तक मैन्युअल रूप से ट्रैकिंग शाखाएँ बनानी होती हैं, लेकिन उनमें git pullएक --allस्विच होता है, जो सभी ट्रैक की गई शाखाओं को + मर्ज कर देगा।
n

13
यह मेरे लिए Git 1.9.1 पर काम नहीं किया। "गिट शाखा - ट्रैक <banch_name>" एक नई शाखा बनाता है <Branch_name> जो स्थानीय शाखा मास्टर को ट्रैक करता है, इसके बजाय हम चाहते थे कि दूरस्थ शाखा। इसलिए इस लिपि ने स्थानीय शाखाओं की ओर इशारा करते हुए स्थानीय शाखाओं का एक समूह बनाया। मैं नीचे समाधान पोस्ट करूँगा।
वैल ब्लंट

183

ओटो द्वारा दिया गया उत्तर अच्छा है, लेकिन सभी निर्मित शाखाओं में नाम की शुरुआत के रूप में "मूल /" होगा। यदि आप केवल अंतिम भाग (अंतिम /) के बाद अपने परिणामी शाखा नाम चाहते हैं, तो इसका उपयोग करें:

for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done

यह आपको अस्पष्ट रिफ के बारे में कोई चेतावनी नहीं देने का भी लाभ है।


Git स्थानीय ट्रैकिंग शाखा के नाम में "मूल" नहीं जोड़ेगी।
एडम डाइमिट्रुक

14
@adymitruk: वास्तव में यह ठीक वैसा ही व्यवहार करता है जैसा मैंने OSX 10.6.4 पर कहा था, git 1.7.2.2 (इस टिप्पणी के रूप में नवीनतम स्थिर) का उपयोग करके। ओटो यहां तक ​​कि अस्पष्ट रिफनाम चेतावनियों का भी उल्लेख करता है - यदि "मूल /" प्रत्येक स्थानीय शाखा के नाम का हिस्सा नहीं था, तो चेतावनी को अस्तित्व में नहीं होना चाहिए। ओट्टो की कमान चलाने के बाद यहां 'गिट शाखा' का उत्पादन किया गया है: [मास्टर, मूल / हेड, मूल / चार्ट, मूल / मास्टर, मूल / उत्पादन, मूल / मंचन]। और मेरी आज्ञा: [चार्ट, मास्टर, उत्पादन, मंचन]।
tjmcewan

1
+ संपादित करें: पाया गया लेखgmane.org/gmane.comp.version-control.git/112575 बताते हैं कि क्यों।
फिलिप ओकले

8
मैं सहमत हूं - वर्तमान में "स्वीकृत" उत्तर की तुलना में यह एक बेहतर समाधान है।
Tobias.mcn संकाय

2
इसके बजाय grep -v master, कैसे के बारे में grep -v /HEAD? यह डिफ़ॉल्ट शाखा को फ़िल्टर करने के लिए लगता है, अनुकूलन की आवश्यकता के बिना
डैशबोर

22

अधिकांश उत्तर यहां आउटपुट के पार्सिंग को जटिल बनाने से अधिक हैं git branch -r। आप forदूरस्थ की तरह सभी शाखाओं के खिलाफ ट्रैकिंग शाखाएं बनाने के लिए निम्न लूप का उपयोग कर सकते हैं ।

उदाहरण

कहते हैं कि मेरी ये दूरस्थ शाखाएँ हैं।

$ git branch -r
  origin/HEAD -> origin/master
  origin/development
  origin/integration
  origin/master
  origin/production
  origin/staging

पुष्टि करें कि हम पहले से ही स्थानीय रूप से मास्टर के अलावा कुछ भी ट्रैक नहीं कर रहे हैं:

$ git branch -l    # or using just git branch
* master

ट्रैकिंग शाखाएँ बनाने के लिए आप इस एक लाइनर का उपयोग कर सकते हैं:

$ for i in $(git branch -r | grep -vE "HEAD|master"); do 
    git branch --track ${i#*/} $i; done
Branch development set up to track remote branch development from origin.
Branch integration set up to track remote branch integration from origin.
Branch production set up to track remote branch production from origin.
Branch staging set up to track remote branch staging from origin.

अब पुष्टि करें:

$ git branch
  development
  integration
* master
  production
  staging

उन्हें हटाने के लिए:

$ git br -D production development integration staging 
Deleted branch production (was xxxxx).
Deleted branch development (was xxxxx).
Deleted branch integration (was xxxxx).
Deleted branch staging (was xxxxx).

यदि आप -vvस्विच का उपयोग करते हैं तो आप git branchपुष्टि कर सकते हैं:

$ git br -vv
  development xxxxx [origin/development] commit log msg ....
  integration xxxxx [origin/integration] commit log msg ....
* master      xxxxx [origin/master] commit log msg ....
  production  xxxxx [origin/production] commit log msg ....
  staging     xxxxx [origin/staging] commit log msg ....

लूप के लिए ब्रेकडाउन

लूप मूल रूप से कमांड git branch -rका उपयोग करता है, आउटपुट का उपयोग करके किसी भी हेड या मास्टर शाखाओं को फ़िल्टर करता है grep -vE "HEAD|master"। बस शाखाओं के नाम प्राप्त करने के लिए, विकल्प origin/हम बश के स्ट्रिंग हेरफेर का उपयोग करते हैं ${var#stringtoremove}। यह स्ट्रिंग, "stringtoremove" को चर से हटा देगा $var। हमारे मामले में हम स्ट्रिंग origin/को वेरिएबल से हटा रहे हैं $i

नोट: वैकल्पिक रूप से आप ऐसा करने के git checkout --track ...लिए उपयोग कर सकते हैं :

$ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do 
    git checkout --track $i; done

लेकिन मैं इस पद्धति के लिए विशेष रूप से परवाह नहीं करता, क्योंकि यह आपको शाखाओं के बीच स्विच कर रहा है क्योंकि यह एक चेकआउट करता है। जब यह किया था कि यह बनाया है कि आप पिछले शाखा पर छोड़ देंगे।

संदर्भ


1
पूरी तरह से git संस्करण 2.3.2 (Apple Git-55) के साथ काम करता है
एंड्रयूड

22

अद्यतन Q1 2020: मोहसिन अब्बासी ने टिप्पणी में प्रस्तावित किया , 2014 के एसएलएम के उत्तर के आधार पर , सरल विकल्प:

for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); 

और यह $()अप्रचलित backticks के बजाय उपयोग करता है ।

जैसा कि मैंने एक और पुराने उत्तर में उल्लेख किया है , का उपयोग git for-each-refकरना शायद तेज है
और मैं नए (Git 2.23+) git switchकमांड का उपयोग करूंगा , जो भ्रामकgit checkout को बदल देता है

for i in $(git for-each-ref --format=%(refname:short) \
  --no-merged=origin/HEAD refs/remotes/origin); do \
    git switch --track $i; \
done

इस तरह, कोई grepजरूरत नहीं है।


पुराना (2011) मूल उत्तर:

यहाँ मेरा एक-लाइनर है जो मैं उपयोग करता हूँ (बैश शेल में, msysgit1.7.4 के साथ परीक्षण किया गया)

कॉपी-पेस्ट के लिए:

remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname; done

अधिक पठनीयता के लिए:

remote=origin ; // put here the name of the remote you want
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do 
    git branch --set-upstream-to $remote/$brname $brname; 
done
  • यह केवल आपके द्वारा remoteवेरिएबल में निर्दिष्ट रिमोट से अपस्ट्रीम शाखाओं का चयन करेगा (यह origin'या ' हो सकता है कि आपने अपने वर्तमान Git रेपो के किसी रीमोट के लिए जो भी नाम निर्धारित किया है)।
  • यह शाखा का नाम निकालेगा: अभिव्यक्ति के origin/a/Branch/Name => a/Branch/Nameमाध्यम से awk
  • यह (या ) , के माध्यम से--set-upstream-to-u अपस्ट्रीम शाखा को सेट करेगा --track:
    लाभ यह है कि, यदि शाखा पहले से मौजूद है, तो यह विफल नहीं होगा और यह उस शाखा के मूल को नहीं बदलेगा, यह केवल branch.xxx.(remote|merge)सेटिंग को कॉन्फ़िगर करेगा ।

    branch.aBranchName.remote=origin
    branch.aBranchName.merge=refs/heads/a/Branch/Name
    

वह कमांड सभी दूरस्थ अपस्ट्रीम शाखाओं के लिए स्थानीय शाखाएं बनाएगा, और उनकी रिमोट और मर्ज सेटिंग को उस दूरस्थ शाखा में सेट करेगा।


5
यह मुझे हर उस शाखा के लिए "घातक: शाखा 'जो कुछ भी मौजूद नहीं है" देता है जो केवल रिमोट पर मौजूद है और जिसके पास स्थानीय शाखा नहीं है।
क्रिस डोड

मुझे लगता है कि अगर एक शाखा का नाम शामिल है / उदाहरण के लिए: सुविधा / आरसी -41-बीकेंड, यह समाधान काम नहीं करता है !!!!
मोहसिन अबासी

@VonC "स्लम" के उत्तर के आधार पर: $ i में $ के लिए (git Branch -r | grep -vE "HEAD | मास्टर" | sed 's / ^ [] \ + //'); git चेकआउट - ट्रैक $ i; किया
मोहसिन अबासी

@MohsenAbasi अच्छी लगती है। अपने जवाब में, मैंने हालांकि का उपयोग --set-upstream-toकरने का उल्लेख किया --track
VonC

@MohsenAbasi मैंने अधिक दृश्यता के जवाब में आपके विकल्प को शामिल किया है। मैंने दूरस्थ शाखाओं को सूचीबद्ध करने और git switchइसके बजाय उपयोग करने के लिए एक और संभावित तरीका जोड़ा है git checkout। लेकिन आपका (बहुत अच्छा) विचार बना हुआ है।
वॉन

14

आप आसानी से पर्याप्त स्क्रिप्ट कर सकते हैं, लेकिन मुझे नहीं पता कि यह कब मूल्यवान होगा। वे शाखाएं बहुत जल्दी पीछे हो जाएंगी, और आपको हर समय उन्हें अपडेट करना होगा।

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


2
ये एक अच्छा बिंदु है। मैं जो मुख्य उपयोग का मामला सोच रहा हूं, वह एक दूरस्थ जीआईटी रिपॉजिटरी पर आधारित एक स्थानीय देव वातावरण स्थापित कर रहा है। इसलिए जब मैं अपना प्रारंभिक क्लोन करता हूं, तो मैं सभी दूरस्थ शाखाओं को भी ट्रैक करना चाहता हूं क्योंकि वे उस समय हैं।
जानसन

1
आसान git upसभी स्थानीय शाखाओं को अपडेट करता है।
ह्यूगो



9

बिना किसी स्क्रिप्टिंग के (खाली निर्देशिका में):

$ git clone --bare repo_url .git
$ git config core.bare false
$ git checkout

उसके बाद, सभी दूरस्थ शाखाओं को स्थानीय के रूप में देखा जाएगा।


मूल (रूसी में)


यह अब तक का सबसे सरल समाधान और पर 2.21.0.windows.1 मेरे लिए काम किया है
Rotsiser MHO

7

यदि आप पॉवरशेल का उपयोग करना चाहते हैं और आपके रिमोट को मूल कहा जाता है। फिर यह काम करता है।

git fetch    
git branch -r  | %{$_ -replace "  origin/"} | %{git branch --track $_ "origin/$_"}

यह सुपर सहायक था, मैंने इसे अपने git svn clone'dरेपो के साथ काम करने के लिए थोड़ी भिन्नता का उपयोग करते हुए समाप्त किया :git branch -r | %{$_ -replace " origin/"} | %{git checkout -b $_ "origin/$_"}
नैट

मैंने थोड़ी भिन्नता भी बनाई क्योंकि मेरी स्थानीय शाखाएँ पहले से मौजूद हैं:git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
ch271828n

3
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do  git branch --track ${branch##*/} $branch; done

इसका उपयोग करें और आपके पास ऐसी चेतावनी नहीं होगी जैसे: refname 'मूल / देव' अस्पष्ट है


3

यहाँ BASH कमांड का मेरा समाधान @tjmcewan द्वारा संदर्भित है:

for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done

मेरा लक्ष्य इस समस्या को हल करना है कि सभी बनाई गई शाखाओं में नाम की शुरुआत के रूप में "मूल /" होगा, क्योंकि मैंने परीक्षण किया कि $ दूरस्थ चर अभी भी "मूल /" शामिल हैं:

for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done

जब मैंने @tjmcewan के BASH का परीक्षण किया, तब मैंने पाया कि सभी ट्रैक की गई शाखाएँ स्थानीय पर 'मूल /' के बिना नाम के हैं, मुझे नहीं पता कि क्यों।
निक त्साई

1
पहली कमांड "मास्टर" को ट्रैक करने वाली शाखाएं बनाती है। अधिकांश लोगों को यह सामान नहीं चाहिए।
अलेक्सी ओसिपोव

@AlexeiOsipov धन्यवाद!
Nick Tsai

2

तज्मसेवन के उत्तर के समान ही करें लेकिन विंडोज पर, इसे बैच फ़ाइल से कॉल करें :

for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r

या यह कमांड लाइन से :

for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r

1

2.23 बजे से:

for branch in `git branch -r | grep origin/`; do git switch -t -C ${branch#origin/} $branch; git pull; done

-Cके लिए झंडा git switchबनाता है या फिर सेट करता है अगर यह पहले से मौजूद है।

गिट स्विच प्रलेखन


0

मामले में आप पहले से ही कुछ शाखाओं की जाँच कर चुके हैं और चाहते हैं

  • रिमोट से सभी शेष शाखाओं की जाँच करें
  • सुनिश्चित करें कि सभी स्थानीय शाखाएँ दूरस्थ शाखाओं को ट्रैक करती हैं

आप निम्नलिखित बैश और zsh- संगत स्क्रिप्ट का उपयोग कर सकते हैं:

git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done

0
for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"`
do 
    git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; 
done

स्पष्टीकरण:

पंक्ति 1: 'git Branch -r' (इसके बाद 'git रिमोट अपडेट' के द्वारा सूचना को रिमोट पर परिवर्तन को अद्यतन करने के लिए) सभी दूरस्थ शाखाओं को सूचीबद्ध करता है; w egrep -vw ’का उपयोग परिणाम में HEAD और मास्टर वाली प्रविष्टियाँ दस्तक देने के लिए किया जाता है।

पंक्ति 3: स्थानीय रूप से जाँच करते समय नामित दूरस्थ शाखा को ट्रैक करें। स्थानीय शाखाओं के लिए प्रत्यय 'उत्पत्ति /' से बचने के लिए एक साधारण जाग का उपयोग किया जाता है।


0

बैश का उपयोग करना, यदि आप सभी शाखाओं की जांच करना चाहते हैं:

for remote in `git branch -r`; do git checkout $(echo $remote | cut -d'/' -f 2); done

यह ध्यान रखना महत्वपूर्ण है कि जब आप एक ऐसी भ्रूण करते हैं जो नई दूरस्थ-ट्रैकिंग शाखाएं लाती है, तो आपके पास स्वचालित रूप से स्थानीय, संपादन योग्य प्रतियां नहीं होती हैं।

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