दिलचस्प पोस्ट
मेमोरी संरेखण का उद्देश्य क्या सी भाषा का उपयोग कर निर्देशिका को बदलने का कोई तरीका है? HTTP http: // +: 8000 / HelloWCF / यूआरएल को पंजीकृत नहीं कर सका आपकी प्रक्रिया के पास इस नेमस्पेस का एक्सेस अधिकार नहीं है ADO.NET DataTable को एक HTML तालिका पोस्ट करें हाशटेबल पर डिक्शनरी क्यों पसंद है? क्या हम एक ब्राउज़र सत्र में वेबपेजों में जावास्क्रिप्ट चर का संदर्भ दे सकते हैं? यह निर्धारित करने के लिए कि क्या दशमलव / डबल पूर्णांक है? एस्पनेट वेब एपीआई के लिए जेडब्ल्यूटी प्रमाणीकरण रिमोट रिपॉज़िटरी में परिवर्तनों को धक्का करते समय यह Git चेतावनी संदेश क्या है? रैंडम सभी पर मुश्किल से यादृच्छिक है? जावा: असली दुनिया में डबल की बजाए हमें बिगडेकल का उपयोग क्यों करना चाहिए? या तो एएनएसआई सी या आईएसओ सी क्या है -5% 10 क्या होना चाहिए? Android में ListView क्लिक कैसे प्रबंधित करें CakePHP 3.0 -> खोज हालत के बीच HTML शरीर में शैली और स्क्रिप्ट टैग … क्यों नहीं?

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

एक स्थानीय शाखा के रूप में एक ही दूरदराज शाखा को ट्रैक करना काफी आसान है।

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

रिमोट तक सभी स्थानीय शाखाओं को धकेलना, जरूरत के मुताबिक नई दूरदराज की शाखाएं बनाना भी आसान है।

 $ git push --all origin 

मैं रिवर्स करना चाहता हूं अगर मेरे पास एक स्रोत पर दूरस्थ शाखाओं की एक्स संख्या है:

 $ git branch -r branch1 branch2 branch3 . . . 

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

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

मैं googled और RTMs है, लेकिन अब तक बाँध ऊपर आता है।

वेब के समाधान से एकत्रित समाधान "सभी दूरस्थ जीआईटी शाखाओं को स्थानीय शाखाओं के रूप में ट्रैक करें"

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

 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 

अस्पष्ट refname चेतावनियों पर ध्यान न दें, git स्थानीय शाखा को इसे पसंद करना चाहिए

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

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

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

यहां मेरा एक-लाइनर है जो मैं उपयोग करता हूँ (एक बैश शेल में, 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 ' हो सकता है या जो भी नाम आप अपने वर्तमान गीतम रेपो के रिमोटों में से एक के लिए निर्धारित किया है)।
  • यह शाखा के नाम को निकालेगा: origin/a/Branch/Name => a/Branch/Name माध्यम से awk अभिव्यक्ति।
  • यह अपस्ट्रीम की शाखा को --set-upstream-to (या --track ) के माध्यम से सेट करेगी, नहीं --track :
    इसका फायदा यह है कि, अगर शाखा पहले से ही मौजूद है, तो यह असफल नहीं होगी और यह उस शाखा की उत्पत्ति को परिवर्तित नहीं करेगा, यह केवल शाखा को branch.xxx.(remote|merge) सेटिंग।

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

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

यहां अधिकांश उत्तर git branch -r के आउटपुट के पार्सिंग को उलझा रहे हैं। आप नीचे दिए for लूप के लिए दूरस्थ शाखाओं की सभी शाखाओं के साथ ट्रैकिंग शाखाएं बनाने के 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). 

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

 $ 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" का उपयोग करके आउटपुट में किसी भी HEAD या grep -vE "HEAD|master" कर रहा है। बस शाखाओं के नाम को प्राप्त करने के लिए origin/ सबस्ट्रिंग हम बैश की स्ट्रिंग मैनिपुलेशन ${var#stringtoremove} । यह स्ट्रिंग को हटा देगा, "stringtoremove" चर $var हमारे मामले में हम स्ट्रिंग origin/ वेरिएबल $i से निकाल रहे हैं

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

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

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

संदर्भ

  • 10.1। मैनिंग टू स्ट्रिंग्स – एडवांस्ड बैश स्क्रिप्टिंग गाइड
  • 3.5 गीट ब्रांचिंग – रिमोट शाखाएं

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

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

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

इसका प्रयोग करें और आपके पास इस तरह की चेतावनी नहीं होगी: refname 'origin / dev' अस्पष्ट है

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

 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 

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

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

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


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

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

 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 

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

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

यदि आपके पास पहले से ही कुछ शाखाएं चेक आउट की गई हैं और चाहते हैं तो

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

आप निम्न bash- और 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 
 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' (रिमोट में परिवर्तनों की जानकारी को अपडेट करने के लिए 'गिट रिमोट अपडेट' के बाद) सभी दूरस्थ शाखाओं को सूचीबद्ध करता है; 'egrep -vw' का प्रयोग परिणाम में सिर और मास्टर वाले प्रविष्टियों को दबाने के लिए किया जाता है।

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