সমস্ত দূরবর্তী গিট শাখা স্থানীয় শাখা হিসাবে ট্র্যাক করুন


175

স্থানীয় শাখা হিসাবে একটি একক প্রত্যন্ত শাখা ট্র্যাক করা যথেষ্ট সহজ।

$ 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

আমি গুগল করেছি এবং আরটিএম করেছি, তবে এ পর্যন্ত বন্ধ হয়ে এসেছি।


3
স্থানীয় শাখা হিসাবে একটি একক প্রত্যন্ত শাখাকে ট্র্যাক করার আরও সহজ উপায় রয়েছে:git checkout --track origin/branchname
সেররান

এটি আপনি যা চেয়েছিলেন ঠিক তা নয়, তবে আমার জন্য কাজ করে: গিট সম্পূর্ণতা পান: 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 আগে

দ্রষ্টব্য: নিম্নলিখিত কোডটি যদি গিটারের পরবর্তী সংস্করণগুলিতে ব্যবহার করা হয় (> 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

অস্পষ্ট পুনর্নবীকরণ সতর্কতাগুলি উপেক্ষা করুন, গিট স্থানীয় শাখাটিকে যেমনটি করা উচিত তেমন পছন্দ করে prefer


2
পুনর্নবীকরণ সতর্কতা সম্পর্কে মাথা আপ করার জন্য ধন্যবাদ। এটা সহায়ক ছিল।
পল

1
ধন্যবাদ অটো, আমার সন্দেহ হয়েছিল যে স্ক্রিপ্টিংই একমাত্র সমাধান হবে। আপনি একটি দুর্দান্ত সরল সরবরাহ করেছেন।
জ্যানসন

1
@ জেসন এটি এখনও এখনও একমাত্র সমাধান স্ক্রিপ্টিং?
ক্রেগক্স

1
@ কাওয়াস: আপনাকে ম্যানুয়ালি ট্র্যাকিং শাখা তৈরি করতে হবে, তবে git pullএকটি --allস্যুইচ রয়েছে যা + ট্র্যাকড সমস্ত শাখাকে একীভূত করবে।
nnot101

13
এটি আমার পক্ষে গিট ১.৯.২.২০১। তে কাজ করে নি। "গিট শাখা - ট্র্যাক << বাঞ্চ_নাম>" একটি নতুন শাখা তৈরি করে <ব্র্যাঞ্চ_নাম> যা স্থানীয় শাখা মাস্টারকে ট্র্যাক করে, আমরা যে প্রত্যন্ত শাখাটি চেয়েছিলাম তার পরিবর্তে। সুতরাং এই স্ক্রিপ্ট স্থানীয় শাখাগুলির একটি গোছা তৈরি করেছে যা সমস্ত স্থানীয় মাস্টারকে নির্দেশ করে। আমি নীচে সমাধান পোস্ট করব।
ব্ল্যান্ট

183

অটো প্রদত্ত উত্তরটি ভাল, তবে তৈরি করা সমস্ত শাখার নামের শুরু হিসাবে "উত্স /" থাকবে। আপনি যদি কেবলমাত্র শেষ অংশটি (শেষ / পরে) আপনার ফলিত শাখার নাম হতে চান তবে এটি ব্যবহার করুন:

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

অস্পষ্ট রেফস সম্পর্কে আপনাকে কোনও সতর্কতা না দেওয়ারও সুবিধা রয়েছে benefit


গিট স্থানীয় ট্র্যাকিং শাখার নামটিতে "উত্স" যুক্ত করবে না।
অ্যাডাম ডাইমিত্রুক

14
@ অ্যাডিমিট্রিক: আসলে এটি আমার জন্য OSX 10.6.4-তে গিটার ১.7.২.২ (এই মন্তব্য হিসাবে সর্বশেষ স্থিতিশীল) ব্যবহার করে বলেছিল ঠিক তেমন আচরণ করে। অটো এমনকি দ্ব্যর্থহীন পুনর্নবীকরণ সতর্কবার্তাও উল্লেখ করেছে - "স্থানীয় /" প্রতিটি স্থানীয় শাখার নাম না থাকলে সতর্কতা উপস্থিত থাকার প্রয়োজন হত না। অটো কমান্ড চালানোর পরে এখানে 'গিট ব্রাঞ্চ' আউটপুট রয়েছে: [মাস্টার, আদি / হেড, উত্স / চার্টস, উত্স / মাস্টার, উৎপত্তি / উত্পাদন, উত্স / মঞ্চ)। এবং আমার আদেশ: [চার্ট, মাস্টার, উত্পাদন, মঞ্চায়ন]।
tjmcewan


8
আমি সম্মত হই - বর্তমানে এটি "গৃহীত" উত্তরগুলির চেয়ে ভাল সমাধান।
tobias.mcnulty

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, আউটপুট ব্যবহার করে কোনও HEAD বা মাস্টার শাখা ফিল্টার করে grep -vE "HEAD|master"। কেবল শাখাগুলির বিয়োগফলের নাম পাওয়ার জন্য origin/আমরা ব্যাশের স্ট্রিং ম্যানিপুলেশন ব্যবহার করি ${var#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
গিট সংস্করণ ২.৩.২ (অ্যাপল গিট -55)
অ্যান্ড্রুড

22

আপডেট চতুর্থাংশ 1 2020: মোহসেন Abasi প্রস্তাব মন্তব্য 2014 উপর ভিত্তি করে SLM এর উত্তর , সহজতর বিকল্প:

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

এবং এটি অপ্রচলিত ব্যাকটিকগুলির পরিবর্তে ব্যবহার $()করে

আমি যেমন অন্য একটি পুরানো উত্তরে উল্লেখ করেছি , ব্যবহার git for-each-refকরা সম্ভবত দ্রুততর
এবং আমি নতুন (গিট ২.২৩++) 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প্রয়োজন নেই।


পুরানো (২০১১) মূল উত্তর:

এখানে আমি ব্যবহার করছি আমার ওয়ান-লাইনার (একটি ব্যাশ শেলের মধ্যে, এমএসজিজিট 1.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-u প্রবাহ শাখা সেট করবে , না --track:
    সুবিধাটি হ'ল যদি শাখাটি ইতিমধ্যে বিদ্যমান থাকে তবে এটি ব্যর্থ হয় না এবং এটি যে শাখার উত্স পরিবর্তন করে না, এটি কেবল branch.xxx.(remote|merge)সেটিংসটি কনফিগার করবে ।

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

এই কমান্ডটি সমস্ত দূরবর্তী উজানের শাখাগুলির জন্য স্থানীয় শাখা তৈরি করবে এবং তাদের দূরবর্তী এবং মার্জ সেটিংটি সেই দূরবর্তী শাখায় সেট করবে।


5
এটি কেবলমাত্র দূরবর্তী অঞ্চলে বিদ্যমান এবং এর সাথে সম্পর্কিত স্থানীয় শাখা নেই এমন প্রতিটি শাখার জন্য আমাকে "মারাত্মক: শাখা 'যা কিছু আছে' বিদ্যমান" দেয় gives
ক্রিস ডড

আমি মনে করি যদি কোনও শাখার নামটি অন্তর্ভুক্ত থাকে / উদাহরণস্বরূপ: বৈশিষ্ট্য / আরসি -১১-বিসিএন্ড, এই সমাধানটি কার্যকর হয় না !!!!
মোহসেন আবাসি

@ ভনসি "এসএমএল" এর উত্তরের ভিত্তিতে: $ আমি ইন $ এর জন্য গিট চেকআউট করুন - ট্র্যাক $ i; সম্পন্ন
মহসেন আবাসি

@ মোহসেনআবাসি দেখতে ভাল লাগছে। আমার উত্তরে আমি উল্লেখ না করে --set-upstream-toপরিবর্তে ব্যবহার করেছি --track
ভনসি

@ মোহসেনআবাসি আমি আরও দৃশ্যমানতার জন্য উত্তরে আপনার বিকল্পকে অন্তর্ভুক্ত করেছি। আমি দূরবর্তী শাখা তালিকাভুক্ত করার জন্য আর একটি সম্ভাব্য উপায় যুক্ত করেছি এবং এর git switchপরিবর্তে ব্যবহার করব git checkout। তবে আপনার (খুব ভাল) ধারণা রয়ে গেছে।
ভনসি

14

আপনি যে সহজেই স্ক্রিপ্ট করতে পারবেন তবে এটি কখন মূল্যবান হবে তা আমি জানি না। এই শাখাগুলি খুব দ্রুত পিছনে পড়ে যাবে এবং আপনাকে সেগুলি সর্বদা আপডেট করতে হবে।

দূরবর্তী শাখাগুলি স্বয়ংক্রিয়ভাবে আপ টু ডেট থাকবে, সুতরাং আপনি যে স্থানে এটিতে কাজ করতে চান সেই স্থানে স্থানীয় শাখা তৈরি করা সবচেয়ে সহজ।


2
এটা একটা ভাল দিক. আমি যে মূল ব্যবহারের কথা ভাবছি তা হ'ল দূরবর্তী গিট সংগ্রহস্থলের উপর ভিত্তি করে স্থানীয় একটি পরিবেশ পরিবেশ স্থাপন করা। সুতরাং আমি যখন আমার প্রাথমিক ক্লোনটি করি তখন আমি সমস্ত দূরবর্তী শাখাগুলি সেসময় যেমন ট্র্যাক করতে চাই সেগুলিও ট্র্যাক করতে চাই।
জ্যানসন

1
সহজ git upসব স্থানীয় শাখা আপডেট করে।
হুগো

দুটি রেপেজ মার্জ করার জন্য এবং রিমোটটি মুছে ফেলার জন্য
এন্ডোলিথ


9

কোনও স্ক্রিপ্টিং ছাড়াই (খালি ডিরেক্টরিতে):

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

এর পরে, সমস্ত প্রত্যন্ত শাখা স্থানীয় হিসাবে দেখা হবে।


মূল (ইন রাশিয়ান)


এটি এখন পর্যন্ত সবচেয়ে সহজ সমাধান এবং আমার জন্য ২.২১.০.
উইন্ডোজে .১ এ

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/$_"}
Nate

আমি কিছুটা git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
ভিন্নতাও

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

এটি ব্যবহার করুন এবং আপনার যেমন সতর্কতা থাকবে না: পুনর্নামকরণ 'উত্স / দেব' অস্পষ্ট


3

এখানে @tjmcewan দ্বারা উল্লেখ করা 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

@ টিজমেসওয়ানের বাশ পরীক্ষার পরে আমি দেখতে পেলাম যে সমস্ত ট্র্যাক করা শাখার নাম স্থানীয় 'বিন্যাস' / ছাড়া, আমি জানি না।
নিক Tsai

1
প্রথম কমান্ডটি এমন ব্র্যানস তৈরি করে যা "মাস্টার" ট্র্যাক করে। এটি বেশিরভাগ লোকেরা পছন্দ করতে পারে না।
আলেক্সি ওসিপভ

@ আলেক্সিওসিপভ ধন্যবাদ!
নিক

2

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

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

আপনি ইতিমধ্যে কিছু শাখা পরীক্ষা করে দেখেছেন এবং করতে চান

  • রিমোট থেকে বাকি সমস্ত শাখা পরীক্ষা করে দেখুন
  • সমস্ত স্থানীয় শাখা প্রত্যন্ত শাখাগুলি ট্র্যাক করে তা নিশ্চিত করুন

আপনি নিম্নলিখিত 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

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: 'গিট ব্রাঞ্চ-আর' (রিমোটে পরিবর্তনের উপর তথ্য আপডেট করতে 'গিট রিমোট আপডেট' এর পরে) সমস্ত দূরবর্তী শাখা তালিকাভুক্ত করে; 'egrep -vw' ফলশ্রুতিতে হেড এবং মাস্টার থাকা এন্ট্রিগুলিকে নক করতে ব্যবহৃত হয়।

লাইন 3: স্থানীয়ভাবে চেক আউট করার সময় নামযুক্ত দূরবর্তী শাখাকে ট্র্যাক করুন। স্থানীয় শাখাগুলির প্রত্যয় হ'ল 'উত্স /' এড়াতে একটি সাধারণ জাজক ব্যবহার করা হয়।


0

ব্যাশ ব্যবহার করে, আপনি যদি সমস্ত শাখা চেকআউট করতে চান:

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

এটি লক্ষণীয় গুরুত্বপূর্ণ যে আপনি যখন নতুন রিমোট-ট্র্যাকিং শাখাগুলি নামিয়ে আনছেন এমন কোনও ফলকটি করেন, তখন সেগুলির স্বয়ংক্রিয়ভাবে স্থানীয়, সম্পাদনাযোগ্য কপিগুলি আপনার কাছে নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.