new - delete branch git




كيفية استنساخ جميع الفروع البعيدة في جيت؟ (20)

استخدم الأوامر التي يمكنك تذكرها

أنا باستخدام Bitbucket ، خدمة استضافة Repository من Atlassian. لذلك أحاول اتباع مستنداتهم. وهذا يعمل بشكل مثالي بالنسبة لي. مع الأوامر التالية سهلة وقصيرة يمكنك التحقق من فرعك البعيد.

في البداية استنساخ المستودع الخاص بك ، ثم التغيير إلى مجلد الوجهة. وأخيرًا وليس آخرًا الجلب والخروج:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

هذا هو. هنا مثال أكثر واقعية من العالم:

git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

ستجد معلومات تفصيلية عن الأوامر في المستندات: Clone Command ، Fetch Command ، Checkout Command

لدي master وفرع development ، سواء دفعت إلى GitHub . لقد clone d ، pull ed ، fetch ed ، لكنني ما زلت غير قادر على الحصول على أي شيء آخر غير الفرع master .

أنا متأكد من أني أفتقد شيئًا واضحًا ، لكني قرأت الدليل ولا أشعر بأي فرح على الإطلاق.


لماذا ترى فقط "سيد"

git clone بتنزيل كافة الفروع البعيدة عن بعد ولكن لا يزال يعتبرها "بعيدة" ، على الرغم من وجود الملفات في المستودع الجديد. هناك استثناء واحد لهذا ، وهو أن عملية الاستنساخ تنشئ فرع محلي يسمى "ماستر" من الفرع البعيد يسمى "ماستر". بشكل افتراضي ، يعرض git branch فقط الفروع المحلية ، وهذا هو السبب في أنك ترى فقط "master".

git branch -a يظهر جميع الفروع ، بما في ذلك الفروع النائية .

كيفية الحصول على الفروع المحلية

إذا كنت تريد بالفعل العمل على فرع ، فربما تريد إصدارًا "محليًا" منه. ببساطة إنشاء فروع محلية من الفروع البعيدة (دون التحقق منها ومن ثم تغيير محتويات دليل عملك) ، يمكنك القيام بذلك على النحو التالي :

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

في هذا المثال ، branchone هو اسم الفرع المحلي الذي تقوم بإنشائه بناءً على origin/branchone ؛ إذا أردت بدلاً من ذلك إنشاء فروع محلية بأسماء مختلفة ، فيمكنك القيام بذلك:

git branch localbranchname origin/branchone

بمجرد إنشاء فرع محلي ، يمكنك رؤيته git branch (تذكر ، لا تحتاج -a لرؤية الفروع المحلية).


إذا كان لديك العديد من الفروع البعيدة التي تريد إحضارها في وقت واحد ، فقم بما يلي:

$ git pull --all

الآن يمكنك التحقق من أي فرع ما تحتاج إليه ، دون الوصول إلى مستودع بعيد.


استخدام الخيار --mirror يبدو أن نسخ فروع التتبع remote بشكل صحيح. ومع ذلك ، تقوم بإعداد المستودع كمستودع فارغ ، لذلك يجب عليك إعادة تشغيله إلى مستودع عادي بعد ذلك.

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

المرجع: Git الأسئلة الشائعة: كيف يمكنني استنساخ مستودع مع جميع الفروع المتتبعة عن بعد؟


استخدم الأسماء المستعارة. على الرغم من عدم وجود أية بطاقات واجهة مستخدم Git الأصلية ، يمكنك تحديد بنفسك

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

ثم استخدمه

git clone-branches

بالنظر إلى أحد الإجابات على السؤال ، لاحظت أنه من الممكن تقصيره:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

ولكن حذار ، إذا تم تسمية أحد الفروع عن بعد على سبيل المثال admin_master فلن يتم تنزيله!

بفضل bigfish للفكرة الأصلية


جميع الإجابات التي رأيتها هنا صالحة ولكن هناك طريقة أنظف بكثير لاستنساخ مستودع وسحب جميع الفروع في وقت واحد.

عندما تستنسخ مستودعًا ، يتم تنزيل جميع معلومات الفروع فعليًا ولكن يتم إخفاء الفروع. مع الأمر

$ git branch -a

يمكنك عرض جميع فروع المستودع ، ومع الأمر

$ git checkout -b branchname origin/branchname

يمكنك بعد ذلك تنزيلها يدويًا واحدة تلو الأخرى.

ومع ذلك ، عندما تريد استنساخ الريبو مع الكثير من الفروع ، فإن جميع الطرق الموضحة أعلاه هي طويلة ومملة بالنسبة لطريقة أنظف وأسرع بكثير سوف أعرضها ، رغم أنها معقدة بعض الشيء. تحتاج إلى ثلاث خطوات لإنجاز ذلك:

  1. الخطوة الأولى

إنشاء مجلد فارغ جديد على جهازك واستنساخ نسخة متطابقة من مجلد .git من المستودع:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

المستودع المحلي داخل المجلد my_repo_folder لا يزال فارغًا ، يوجد فقط مجلد .git مخفي الآن يمكنك رؤيته باستخدام أمر "ls -alt" من المحطة الطرفية.

  1. الخطوة الثانية

تبديل هذا المخزون من مستودع تخزين فارغ (فارغ) إلى مستودع تخزين منتظم بتحويل القيمة المنطقية "عارية" من تكوينات git إلى false:

$ git config --bool core.bare false
  1. خطوة ثالثة

الاستيلاء على كل شيء داخل المجلد الحالي وإنشاء جميع الفروع على الجهاز المحلي ، وبالتالي جعل هذا الريبو العادي.

$ git reset --hard

حتى الآن يمكنك فقط كتابة الأمر "git branch" ويمكنك أن ترى أن جميع الفروع يتم تنزيلها.

هذه هي الطريقة السريعة التي يمكنك من خلالها استنساخ مستودع git مع جميع الفروع في وقت واحد ، ولكنها ليست شيئا تريد أن تفعله لكل مشروع واحد بهذه الطريقة.


ساعدني هذا النص Bash :

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

سيؤدي إلى إنشاء فروع تتبع لجميع الفروع البعيدة ، باستثناء الماجستير (التي ربما حصلت عليها من أمر النسخ الأصلي). أعتقد أنك قد لا تزال بحاجة إلى إجراء

git fetch --all
git pull --all

لكى تتأكد.

بطانة واحدة : git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs كالعادة: اختبار في الإعداد قبل نسخ rm -rf universe كما نعرفه

قروض لواحد بطانة الذهاب إلى المستخدم cfi


فقط افعل هذا:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

كما ترى ، "git clone git: //example.com/myprojectt" يجلب كل شيء ، حتى الفروع ، يجب عليك فقط التحقق منها ، ثم يتم إنشاء فرعك المحلي.


للنسخ واللصق في سطر الأوامر:

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

لمزيد من إمكانية القراءة:

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

هذا سوف:

  1. تحقق من الماجستير (حتى يتسنى لنا حذف الفرع الذي نحن فيه)
  2. حدد عن بعد للخروج (تغييره إلى أي جهاز تحكم عن بعد لديك)
  3. حلقة من خلال جميع فروع جهاز التحكم عن بعد باستثناء الرئيسي ورئيس
    1. حذف الفرع المحلي (حتى يمكننا التحقق من الفروع المحدثة للقوة)
    2. تحقق من فرع من جهاز التحكم عن بعد
  4. تحقق من الماجستير (من أجل ذلك)

استنادا إلى answer VonC .


ما عليك سوى استخدام "git clone" للحصول على جميع الفروع.

git clone <your_http_url>

على الرغم من أنك ترى الفرع الرئيسي فقط ، يمكنك استخدام "git branch -a" لمشاهدة جميع الفروع.

git branch -a

ويمكنك التبديل إلى أي فرع لديك بالفعل.

git checkout <your_branch_name>

لا تقلق من أنه بعد "استنساخ git" ، لن تحتاج إلى الاتصال بريبو عن بعد ، "git branch -a" و "git checkout" يمكن تشغيلهما بنجاح عند إغلاق الواي فاي الخاص بك. لذلك ثبت أنه عندما تفعل "git clone" ، فقد قام بالفعل بنسخ جميع الفروع من الريبو عن بعد. بعد ذلك ، لا تحتاج إلى الريبو البعيد ، فلديك المحلي بالفعل جميع رموز الفروع.


متأخرة أفضل من عدمها ، ولكن هنا أفضل طريقة للقيام بذلك:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

عند هذه النقطة لديك نسخة كاملة من الريبو عن بعد مع جميع فروعه (تحقق مع git branch ). يمكنك استخدام --mirror بدلاً من --bare إذا كان الريبو الخاص بك عن بعد يحتوي على أجهزة تحكم خاصة به.


هذه ليست معقدة جدا ، خطوات بسيطة جدا ومباشرة على النحو التالي ؛

git fetch origin هذا سيجلب جميع الفروع البعيدة إلى المحلية الخاصة بك.

git branch -a هذا سوف يعرض لك كل الفروع البعيدة.

git checkout --track origin/<branch you want to checkout>

تحقق مما إذا كنت في الفرع المطلوب بواسطة الأمر التالي؛

git branch

سوف الإخراج مثل هذا؛

*your current branch 
some branch2
some branch3 

لاحظ علامة * التي تشير إلى الفرع الحالي.


يجب أن تحصل عملية الجلب التي تجريها على جميع الفروع البعيدة ، ولكنها لن تنشئ فروعًا محلية لها. إذا كنت تستخدم gitk ، يجب أن تشاهد الفروع البعيدة الموصوفة باسم "أجهزة التحكم عن بعد / الأصل / dev" أو ما شابه ذلك.

لإنشاء فرع محلي قائم على فرع بعيد ، قم بعمل شيء من هذا القبيل:

git checkout -b dev refs/remotes/origin/dev

التي يجب أن تعيد شيئًا مثل:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

الآن ، عندما تكون على فرع dev ، سيقوم "git pull" بتحديث برنامج التطوير المحلي الخاص بك إلى نفس النقطة مثل فرع مطراف بعيد. لاحظ أنه سيؤدي إلى جلب جميع الفروع ، ولكن عليك فقط سحب الفروع التي أنت عليها إلى أعلى الشجرة.


حسنا ، عندما تقوم باستنساخ الريبو الخاص بك ، لديك كل الفروع هناك ...

إذا كنت تفعل مجرد git branch ، فهي نوع من الخفية ...

لذا إذا كنت ترغب في رؤية اسم كل الفروع ، فما عليك سوى إضافة - --all flag like this:

git branch --all أو git branch --all git branch -a

إذا كنت فقط الخروج إلى الفرع ، تحصل على كل ما تحتاجه.

ولكن ماذا عن الفرع الذي أنشأه شخص آخر بعد استنساخه؟

في هذه الحالة ، ما عليك سوى القيام بما يلي:

git fetch

وتحقق من جميع الفروع مرة أخرى ...

إذا كنت ترغب في الجلب والخروج في نفس الوقت ، فيمكنك القيام بما يلي:

git fetch && git checkout your_branch_name

كما أنشأت الصورة أدناه لتبسيط ما قلته:


لا شيء من هذه الإجابات يقطعها ، ما عدا أحد المستخدمين على الطريق الصحيح.

كنت أواجه مشكلة مع نقل الريبو من خادم / نظام إلى آخر. عندما قمت باستنساخ الريبو ، قامت فقط بإنشاء فرع محلي للماجستير ، لذلك عندما دفعت إلى جهاز التحكم عن بعد الجديد ، تم الضغط على الفرع الرئيسي فقط.

لذلك وجدت هاتين الطريقتين مفيدة جدا. آمل أن يساعدوا شخص آخر.

طريقة 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

الطريقة الثانية:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

اعتبارًا من أوائل عام 2017 ، كانت الإجابة في هذا التعليق ناجحة:

git fetch <origin-name> <branch-name>يجلب الفرع لأسفل لك. في حين أن هذا لا يسحب جميع الفروع في وقت واحد ، يمكنك تنفيذ هذا الفروع بشكل فردي.


سأضيف سنتاتي هنا لأنني جئت إلى هنا أحاول معرفة كيفية سحب فرع بعيد قمت بحذفه محليًا. الأصل لم يكن لي ، ولم أكن أريد أن أذهب من خلال مشاحنات إعادة استنساخ كل شيء

هذا العمل بالنسبة لي:

على افتراض أنك تحتاج إلى إعادة إنشاء الفرع محليًا:

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-origin/recreated-branch-name

لذا إذا تفرعت من gituser / master إلى sjp ثم تفرعت إلى sjp / mynewbranch ، فستبدو كما يلي:

$ git checkout -b mynewbranch
$ git branch -a
  master
  remotes/sjp/master
  remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch

كتبت هذه الوظائف الصغيرة Powershell لتكون قادرة على الخروج من جميع فروع بلدي ، التي هي في الأصل عن بعد.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

يمكن العثور على وظائف أكثر git على ريبتي إعدادات بوابة بلدي


كنت بحاجة إلى أن تفعل بالضبط نفس الشيء. هنا هو بلدي النصي Ruby .

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]




remote-branch