Питання Як клонувати всі віддалені філії в Git?


Я маю master і a development філія, обидва поштовх до GitHub. Я вже cloneд pulled, and fetched, але я все ще не можу отримати щось інше, ніж master відгалуження

Я впевнений, що я пропускаю щось очевидне, але я прочитав посібник, і я взагалі не отримую радості.


3560
2017-09-15 22:42


походження


Прийнята відповідь тут (git branch -a) показує вам гілки на пульті, але якщо ви намагаєтеся перевірити будь-яку з цих, ви будете в стані "окремо голова". Наступна відповідь (другий варіант відповіді) відповідає іншому запиту (навик: як витягувати всі гілки, і знову це працює лише для тих, кого ви відстежуєте локально). Деякі коментарі вказують на те, що ви могли б проаналізувати git branch -a результати з скриптом оболонки, який локально відслідковує всі віддалені галузі. Підсумок: не існує жодного оригінального способу робити те, що вам потрібно, і в будь-якому випадку це може бути не все. - Day Davis Waterbury
Можливо, просто скопіюйте всю папку старомодним способом? scp some_user@example.com:/home/some_user/project_folder ~ Не впевнений, що це рішення працює для github хоча .. - snapfractalpop
Замість того, щоб сказати: "Я клонував, витягнув і приїхав", набагато краще показати нам точні команди що ви стратили. - Bob Gilmore
Це завжди пропускає мене, чому "клон" не в сенсі точної копії. Якщо це точний клон, чи не всі гілки повинні бути частиною локального сховища? Я маю на увазі не те, що одне з пунктів розподілу? Тож, коли щось сховище пішло, у вас ще є повна копія всього. Або чи так звані "віддалені" дійсно є частиною локального сховища? - huggie
Побачивши всі джерела, відповіді, коментарі до відповідей і незрозумілу кількість поглядів, я думаю, що саме час git додав команду для цього. І ви, звичайно, @гаггі, мої думки точно. - Sнаđошƒаӽ


Відповіді:


По-перше, клонувати пульт дистанційного керування Гіт сховище та cd в це:

$ git clone git://example.com/myproject
$ cd myproject

Далі, подивіться на місцеві гілки вашого сховища:

$ git branch
* master

Але є й інші гілки, що ховаються у вашому сховищі! Ви можете побачити їх за допомогою -a прапор:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

Якщо ви просто хочете швидко переглянути гілку, ви можете перевірити це безпосередньо:

$ git checkout origin/experimental

Але якщо ви хочете працювати у цій гілці, вам потрібно створити локальну гілку відстеження, яка виконується автоматично за допомогою:

$ git checkout experimental

і ти побачиш

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

Ця остання рядок кидає деяких людей: "Нова гілка" - а? Що це насправді означає, що філія взята з індексу і створена локально для вас. The Попередній Лінія насправді є більш інформативною, оскільки вона говорить вам, що філія налаштована для відстеження віддаленої гілки, що зазвичай означає гілку origin / branch_name

Тепер, якщо подивитися на ваші місцеві філії, це ви побачите:

$ git branch
* experimental
  master

Ви можете відстежувати більше одного віддаленого сховища за допомогою git remote.

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

На цьому етапі все стає зовсім безумним, так бігайте gitk щоб побачити, що відбувається:

$ gitk --all &

4024
2017-09-16 13:28



Як хтось може автоматично створювати всі віддалені галузі, наприклад, Експериментальний для походження / експериментальний? - Cristian Ciupitu
Крістіан: Я завжди створював гілку 'foo' для кожної гілки 'origin / foo', але це призвело до двох проблем: (1) Я покінчив з безліччю дійсно застарілих гілок відстеження, які багато хто виконував за відповідною віддаленою гілкою , і (2) у старих версіях git, запускаючи "git push", намагатиметься натиснути всі мої локальні гілки на віддалений, навіть коли ці гілки були застарілими. Тому зараз я тримаю місцеві підрозділи лише за те, що я активно розвиваюся, і доступ до відділень походження / *, якщо мені потрібна інформація про них. (При цьому, ви можете використовувати сценарій оболонки для аналізу 'git branch -a'.) - emk
"git get <origin-name> <branch-name>" виводить гілку локально для вас. - Orange Box
Хороша відповідь, але якось пропускає питання. Я шукав одного линника для перевірки всіх віддалених філій. - cmcginty
Питання полягало в тому, щоб клонувати всі віддалені галузі, не перевіряючи їх. І, як я вже зазначав вище, ви дійсно не бажаєте робити більше локальних галузей відстеження, ніж потрібно, тому що, коли вони стануть дійсно застарілими, вони можуть викликати головні болі. - emk


Якщо у вас багато віддалених філій, які потрібно одразу отримати, виконайте такі дії:

$ git pull --all

Тепер ви можете перевірити будь-яку гілку, як вам потрібно, не потрапивши у віддалений сховище.


745
2018-01-13 16:42



Якщо я виконую клонування git, у мене є майстер філії локально та 10 філій «віддалений». Отже, ця відповідь Габе була дуже корисною і відповідає на питання. - basZero
це лише приносить віддалені гілки, які локально не додані будь-який віддалена філія - jujule
Перша команда є зайвою. Просто git pull --all буде робити те ж саме - він просто не буде завантажувати двічі. І в infosec812 правильно, що це не відповідає на запитання в будь-якому випадку. Цікаво, як це так багато. - Sven Marnach
Після цього я зробив git remote update, потім спробував git branch, Я бачу лише місцеві філії. Але якщо я роблю git branch -a Тепер я бачу віддалені філії, і я можу зробити це git pull <branchname> щоб отримати галузь, я хочу. - Я вийшов на це питання з пошуку Google, і ця відповідь вирішує мою проблему. - Jazzerus
Це взагалі не є корисним, не витягує жодних віддалених галузей, окрім існуючих. - Avinash R


Це Баш Сценарій допоміг мені:

#!/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 Як завжди: перевірте в налаштуваннях перед копіюванням всередині rm -rf, як ми це знаємо

Кредити для однолистника йдуть до користувача cfi


379
2018-01-21 02:18



Це дійсно близьке до ідеального рішення .. Єдине, що б зробити це краще, якщо ця функція була вбудована в якості опції в GIT. - Deven Phillips
"Один лайнер": 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 as we know it - cfi
Ця команда створює гілки функції віддаленого, як звичайні гілки (а не філії) - як це виправити? - Alex2php
якщо ви зіткнулися з проблемами з "/" в іменах галузей, то нижче використовується гітарний псевдонім. див. відповідь "ніхто" на "відповів 15 травня 13 на 11:02" - wemu
Я обрізаю просто remotes/origin/ зберегти простір імен: for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done - kgadek


Використовуючи --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 FAQ: Як я можу клонувати сховище з усіма дистанційно відстеженими гілками?


280
2017-08-27 17:49



Ви знаєте, що це насправді здається гарною відповіддю, хоча вона і не має голосів. Чи існують якісь підводні камені, щоб зробити це таким чином? Після виконання цих команд я повинен був явно перевірити філію. - loop
Це в поєднанні з git push -mirror - саме те, що мені потрібно було створити точний дублікат віддаленого репозитайте git при переході від github.com до інсталяції github enterprise. Дякую! - Jacob Fike
@Dave: Додати фінал git checkout як остання команда, щоб остаточно перевірити голову поточної гілки на клонованому репо. Це чудова відповідь, на краще. Будьте сміливі, врешті-решт ми приведемо вас до вершини :-) - cfi
@Dave: Hm. У мене є інші думки: - Mirror робить більше, ніж просто налаштування всіх галузей як відслідковуються. Вона копіює всі реферати з походження та наступного git remote update зробить це знову. Поведінка зміни тягне. Я повертаюсь, вважаючи, що для повного копіювання потрібен скрипт з одного рядка. - cfi
git clone --mirror Дуже добре для резервного копіювання ваших сховищ GIT ^ _ ^ - TrinitronX


Ви можете легко перейти до філії, не використовуючи синтаксис "git checkout-b somebranch origin / somebranch". Ви можете просто зробити:

git checkout somebranch

Gіt автоматично зробить правильну річ:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git перевірить, чи існує одна точка філії в точності одного дистанційного керування, і якщо вона це робиться, вона відстежує її так само, як якщо б ви чітко вказали, що це віддалений підрозділ. З сторінки git-checkout людина Git 1.8.2.1:

Якщо <branch> не знайдено, але існує гілка відстеження в   точно один пульт дистанційного керування (називайте його <remote>) з відповідним ім'ям, розглядайте як   дорівнює

$ git checkout -b <branch> --track <remote>/<branch>

204
2018-05-12 12:11



Отже, якщо назва гілки ви checkout є ідентичним назві віддаленої гілки, все після "/", тоді git створить гілку з тим самим ім'ям, все після "/", "відстеження", яке віддалено? І шляхом відстеження ми маємо на увазі: git push, git pullі т. д. буде виконано на цьому пульті? Якщо це правильно, то розгорніть вашу відповідь з додатковою інформацією, оскільки я погоджуюсь з @Daniel, ця відповідь заслуговує на більшу репутацію. - Gerard Roche
@ BullfrogBlues, відповідь на всі ваші запитання з'являється так (я використовую git v1.7.7.4). Я згоден, що ця поведінка повинна бути краще відома. (Це не в посібнику для цієї версії git.) Мені насправді не подобається ця поведінка, я б краще помилився і повинен сказати git checkout --track origin/somebranch явно - dubiousjim
@dubiousjim: Насправді, це в посібнику. git-checkout (1) говорить: "Якщо <branch> не знайдено, але існує відгалуження у точному пульті (назвемо його <remote>) з відповідним іменем, вважати еквівалентом" git checkout -b <branch > --track <remote> / <branch> '' (Git V.1.8.1.1). - sleske
Нам потрібно $ git pull * <remote> / * - де "*" - це підстановочний код, тому він витягує всі гілки, включаючи ті, що ще не в локальній системі. Як це зробити? Чи дійсно ми маємо справу з перевіркою / притягненням до кожної галузі тільки для того, щоб отримати код у нашій місцевій системі? - JosephK


Що стосується

$ git checkout -b експериментальне походження / експериментальне

використовуючи

$ git checkout -t origin/experimental

або докладніше, але легше запам'ятати

$ git checkout --track origin/experimental

може бути краще, з точки зору відстеження віддаленого сховища.


88
2017-07-27 06:10





Прийняття, що ви робите, має отримати всі віддалені філії, але для них не буде створено місцевих відділень. Якщо ви використовуєте gitk, ви повинні побачити віддалені відгалуження, позначені як "remotes / origin / dev" або щось подібне.

Щоб створити локальну гілку на основі віддаленої гілки, виконайте щось на зразок:

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

Який повинен повернути щось на кшталт:

Branch dev створено для відстеження віддалених філій refs / remotes / origin / dev.
Переключився на нову гілку "dev"

Тепер, коли ви знаходитесь на відділення dev, "git pull" буде оновлювати ваш локальний dev до того самого пункту, що і віддалене відділення dev. Зверніть увагу, що він буде завантажувати всі гілки, але лише витягніть той, який ви перебуваєте, у верхній частині дерева.


77
2017-09-15 22:52



Вам не потрібні посилання / пульти тут. git checkout-dev dev / dev буде працювати нормально. - emk
Це завжди буде працювати: git checkout -b newlocaldev --track origin/dev. Якщо ви хочете, щоб місцева філія мала таку саму назву, що і віддалена, і на пульті не виникає складного імені, ви можете опустити -b newlocaldev. За замовчуванням branch.autosetupmerge налаштування конфігурації і припускаючи, що у вас немає місцевої гілки з назвою dev, ці дві команди можуть робити те ж саме: git checkout -b dev origin/dev і просто git checkout dev. Нарешті, git checkout origin/dev не створює нову гілку, а просто поміщає вас в стан HEAD. - dubiousjim
Що станеться, коли віддалене з'єднання більше не існує, але Git занадто тупий, щоб визнати його видалення? Це припускає, що ви оновили і git branch -a продовжує списувати його як віддалену галузь. - jww
І ми робимо це для десятків галузей? - JosephK