Як отримати всі гіти Git


1507

Я клонував сховище Git, яке містить близько п’яти гілок. Однак, коли я це роблю, git branchя бачу лише одну з них:

$ git branch
* master

Я знаю, що я можу зробити, git branch -aщоб побачити всі гілки, але як би я витягнув усі гілки локально, щоб, коли це робити git branch, це показує наступне?

$ git branch
* master
* staging
* etc...

1
Також обговорювалися на stackoverflow.com/questions/67699 / ...
gliptak

2
Це запитання показує, як отримати всі гілки після використання --single-branchналаштування під час клонування: stackoverflow.com/questions/17714159/… ( git fetch --allніколи не працюватиме, якщо ви вказали лише одну гілку!)
Метью Вілкокссон

2
Ви не побачите цього виходу ніколи, тому що зірочка представляє гілку, яка наразі виходить з каси. Оскільки ви можете одразу перевірити лише одну гілку, ви можете мати лише одну зірочку зліва від списку вашої філії.
Робіно

5
Я побачив багато відповідей, але жодна з них не згадала те, що, на мою думку, є найпростішим способом зробити те, що ви хочете: git clone --bare <repo url> .git (зауважте, вам потрібно додати "--rere" та ".git" наприкінці, щоб клонувати репо як "голою" репо), потім git config --bool core.bare false(встановлює прапорець "голий" на помилкове), потім git reset --hard(переміщує HEAD до поточної HEAD на репо). Тепер, якщо вам git branchслід побачити всі гілки репо, які ви клонували.
Габріель Ферраз

4
@GabrielFerraz Тоді ви зловживаєте функцією коментарів щодо переповнення стека. Користувачі можуть оскаржити ваш коментар, але не подати заявку.
труба

Відповіді:


2050

Ви можете отримати всі гілки з усіх віддалених, як це:

git fetch --all

Це в основному рух сили .

fetchоновлює локальні копії віддалених гілок, так що це завжди безпечно для ваших місцевих відділень, АЛЕ :

  1. fetchне оновлюватиме місцеві гілки (які відстежують віддалені гілки); якщо ви хочете оновити свої локальні відділення, вам потрібно все-таки витягнути кожну гілку.

  2. fetchне створить локальні гілки (які відстежують віддалені гілки), це потрібно зробити вручну. Якщо ви хочете перерахувати всі віддалені відділення: git branch -a

Щоб оновити локальні гілки, які відстежують віддалені гілки:

git pull --all

Однак це може бути все ще недостатньо. Він працюватиме лише для ваших місцевих відділень, які відстежують віддалені гілки. Щоб відстежувати всі віддалені гілки, виконайте цей oneliner ПЕРЕД git pull --all :

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

Версія TL; DR

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(Здається, витягніть всі гілки з усіх віддалених, але я завжди отримую перше, щоб бути впевненим.)

Виконайте першу команду, лише якщо на сервері є віддалені гілки, які не відслідковуються вашими локальними гілками.

PS AFAIK git fetch --allі git remote updateрівнозначні.



Каміла Szot в коментарі , які люди знайшли корисними.

Мені довелося користуватися:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

оскільки ваш код створив локальні гілки з назвою, origin/branchnameі я отримував "перейменувати" походження / ім'я гілки "неоднозначно, коли я посилався на нього.


41
Вибачте. Я не уявляю, що саме цього хоче ОП. Команда 'pull' - це "fetch + merge", і частина злиття перекриє всі гілки один на одного, залишаючи один гігантський безлад.
GoZoner

10
цей збір не створить нову віддалену гілку, з якою все одно потрібно це перевіритиgit checkout -b localname remotename/remotebranch
Learath2

125
Мені довелося використовувати, for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done оскільки ваш код створював локальні гілки з назвою origin / назва імені, і я отримував "перейменувати" походження / ім'я гілки "неоднозначно, коли я посилався на це.
Kamil Szot,

22
Я не знаю, чи використовую я іншу версію GIT, але мені довелося внести зміни до сценарію git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done. Зміна викреслює ГОЛОВУ.
kim3er

16
Для людей з Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Макс

718

Щоб перерахувати віддалені відділення:
git branch -r

Ви можете перевірити їх як місцеві відділення за допомогою:
git checkout -b LocalName origin/remotebranchname


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

11
Навіть якщо гілка не видно локально, я можу це зробити git checkout remotebranchnameі вона працює. яка різниця у вашому рішенні?
Франсуа Ромен

12
Його поведінка за замовчуванням зараз. Так не було у старих версіях git. Використовується git checkout remotebranchnameлише для створення нової незв'язаної гілки, яка називається remotebranchname .
Learath2

12
Прийнята відповідь робить щось принципово інше, і, якщо чесно, я навіть не розумію, чому її прийнята відповідь
Learath2

8
ОП попросили всіх відділень. Ця відповідь робить лише одну.
Тед Бігхем

193

Вам потрібно буде створити локальні гілки, які відстежують віддалені гілки.

Якщо припустити, що у вас є лише один віддалений виклик origin, цей фрагмент створить локальні гілки для всіх віддалених відстежень:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

Після цього git fetch --allбуде оновлено всі локальні копії віддалених відділень.

Крім того, git pull --allбуде оновлено ваші локальні гілки відстеження, але залежно від ваших місцевих комісій та того, як встановлено параметр налаштування "злиття", це може створити коммісію злиття, перемотати вперед або вийти з ладу.


5
Це захищає рішення щодо імен гілок, що містять метахарактеристики оболонок (відповідно до коментаря pinkeen до іншої відповіді), і уникає помилкового виходу помилки: git branch -r | grep -v - '->' | під час читання віддалено; do git branch --track "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v 'вже існує'; виконано
Дайра Хопвуд

6
Ви впевнені, що git pull --allоновите всі локальні гілки відстеження? Наскільки я можу сказати, це лише оновлення поточної гілки з усіх віддалених.
Енді

3
Зробив це. Місцеві гілки, що відповідають віддаленим гілкам, не створені. Що це за команда git, яка просто говорить "витягнути всі віддалені гілки, створюючи локальні, якщо їх немає?"
ДжозефК

@JosephK, можливо, ваш пульт не називається origin? Дивіться цю відповідь, яка працюватиме на всіх віддалених іменах.
Том Хейл

@TomHale Це було "походження", але дякую за вашу відповідь - хоч і божевільний, що багато чого потрібно, щоб зробити те, що має бути один чи, можливо, два прапори. Зараз я намагаюся безтурботно намагатися уникнути божевілля деяких аспектів git.
ДжозефК

116

Якщо ти зробиш:

git fetch origin

тоді вони будуть усі там на місцях. Якщо ви виконаєте:

git branch -a

ви побачите їх у списку як видалення / походження / ім'я гілки. Оскільки вони там локально, ви можете робити з ними все, що завгодно. Наприклад:

git diff origin/branch-name 

або

git merge origin/branch-name

або

git checkout -b some-branch origin/branch-name

5
Щойно знайшов цю сторінку в Google ... це був фактичний тип відповіді, який я шукав. Я спробував першу команду, але отримав помилку: [$ git fetch - all origin fatal: fetch --all не приймає аргумент сховища] --- Використання "git fetch --all", здається, робить свою справу. Дякую за ведучий!
longda

1
Виправлено (усунено --all)
GoZoner

12
git fetch -allотримує всі гілки всіх віддалених. git fetch originотримує всі гілки дистанційного origin. Пізніше це запитувала ОП.
GoZoner

3
--allозначає "всі віддалені", а не "всі гілки даного дистанційного". Останнє має на увазі під собою будь-який збір з віддаленого.
spacediver

2
Це не спосіб перетягувати всі гілки в локальну репо, з віддаленої репо.
Володимир Деспотович

69
$ git remote update
$ git pull --all

Це передбачає, що всі гілки відслідковуються.

Якщо їх немає, ви можете запустити це в Bash:

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

Потім запустіть команду.


3
Коли я намагаюся, я все одно отримую той же результат, що і вище.
David542

4
Так само, як @JacobLowe, я отримав помилку, але вона все одно працювала; 'fatal: філія з назвою' origin / master 'вже існує.'
AnneTheAgile

Це некрасиво, оскільки воно спробує створити гілку, для ->якої, ймовірно, буде git branch -rвиходити як результат `origin / HEAD -> origin / master`
Том Хейл,

Більше того, це не працює. Я отримую вихід: Branch 'origin/quote-filenames' set up to track local branch 'master'. бажаний вихід: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. Це назад , встановлюючи походження для відстеження віддаленого. Дивіться цю відповідь для виправлення.
Том Хейл

саме те, що мені було потрібно. Оскільки я перейшов на Mac, навіть після того, як я клонував репо, я не зміг перевірити інші віддалені відділення і git fetchне працював. Тож урок тут полягає в тому, що вам потрібно відстежувати віддалені гілки. Грацій!
Віктор Рамос

58

forПетля Баша не працювала для мене, але це робилося саме те, що я хотів. Всі гілки з мого походження відображаються локально як однойменна назва.

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

Дивіться коментар Майка Дюпона нижче. Я думаю, що я намагався це зробити на сервері Jenkins, який залишає його в режимі від'єднаної голови.


6
Виходить fatal: Refusing to fetch into current branch refs/heads/master of non-bare repositoryпісля простого клону. Доводиться спочатку відривати голову. Я зробив це зgit checkout <SHA>
brannerchinese

6
Моє рішення, використовуючи це, є git checkout --detach # detach the headі тодіgit fetch origin \'+refs/heads/*:refs/heads/*
Майк Дюпон

1
Цей для мене працював, за винятком того, що я також використовую параметр --tags. Я хотів би, щоб для git був стандартний, простий передній кінець, кількість простих речей у git, для яких потрібні відповіді на переповнення стека у 10 плюс, смішна!
Крістіанп

1
@kristianp Ви перевірили Ungit чи GitKraken?
dragon788

@ dragon788 Я використовував SourceTree для графічного інтерфейсу git, але я справді говорив про більш простий командний рядок для завдань сценаріїв.
Крістіанп

51

Використовуйте git fetch && git checkout RemoteBranchName.

Це дуже добре працює для мене ...


6
Це нова найкраща відповідь, всі ви. Я не знаю, якщо, можливо, це раніше не було можливо, але останні версії Git принаймні помітять, що ви намагаєтеся оформити віддалену гілку і автоматично налаштує локальну гілку відстеження для вас (і вам не потрібно уточнити origin/branch; достатньо лише сказати branch).
Ніл Трафт

9
Це не дає відповіді на початкове запитання: "Як би я витягнув усі гілки на місцях?" Це тягне їх по одному, що не масштабується.
ingyhere

Це була єдина відповідь, яка дозволила мені тягнути віддалені гілки у будь-якій ситуації, з якою я стикався
Еммануель Бакші

38

Коли ви клонуєте сховище, вся інформація гілок фактично завантажується, але гілки приховані. З командою

$ 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".

  2. Другий крок

    переключити це сховище з порожнього (голого) сховища в звичайне сховище, перемикаючи булеве значення "голі" конфігурацій git на хибне:

    $ git config --bool core.bare false
    
  3. Третій крок

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

    $ git reset --hard
    

Тепер ви можете просто ввести команду, git branchі ви побачите, що всі гілки завантажені.

Це швидкий спосіб, за допомогою якого ви можете клонувати сховище git з усіма гілками одночасно, але це не те, що ви хочете зробити для кожного окремого проекту таким чином.


1
Запропонований для згадки про приховані гілки. допомогло мені зрозуміти відстеження місцевої гілки.
mburke05

Це хороша відповідь, але питання передбачає щось для щоденного використання. Клонувати сховище не практично.
З. Хулла

Чому скидання створює всі гілки локально?
З. Хулла

@ Z.Khullah це не скидання, яке створює всі гілки, а клон - mirror. На жаль для нас, це також створює голий репо, саме те, що кроки 2 і 3 змінюються.
ScottJ

29

Ви можете отримати всі гілки:

git fetch --all

або:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000Параметр може допомогти , якщо ви обміліла сховища.


Щоб витягнути всі гілки, використовуйте:

git pull --all

Якщо вище не буде працювати, то передуйте вищевказаній команді:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'

тому що remote.origin.fetchможе підтримувати лише певну гілку під час отримання, особливо коли ви клонували репо --single-branch. Перевірте це: git config remote.origin.fetch.

Після цього ви можете мати можливість оформити будь-яке відділення.

Дивись також:


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

git push --all

врешті-решт, --mirrorщоб відобразити всі відгуки.


Якщо ваша мета - копіювати сховище, див.: Дублювання статті репозиторію в GitHub.


1
Дивовижно ... Я спробував усе інше до вашого рішення на цій сторінці. Дуже дякую!
Сухой

2
Я використовував неглибоке клонування ( depth=1), а конфігурація також вказала одну конкретну гілку для fetch- depth=1000параметром було виправлення, яке допомогло мені перевірити конкретну віддалену гілку
Сандра

2
pull --allне тягне всіх гілок, але всі
віддалені

Хороший трюк з конфігурацією, хоча!
Здійснив

Я перевірив конфігурацію, як ви писали, все ще працює тільки з поточною гілкою. Схоже, всі відповіді тут не діють для мене ...
Олексій Мартьянов

25

Зазвичай я не використовую нічого іншого, крім таких команд:

git fetch origin
git checkout --track origin/remote-branch

Трохи коротша версія:

git fetch origin
git checkout -t origin/remote-branch

17

Я вважаю, що ви клонували сховище:

git clone https://github.com/pathOfrepository

Тепер перейдіть до цієї папки за допомогою CD:

cd pathOfrepository

Якщо ви введете, git statusви можете побачити всі:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Щоб побачити всі приховані типи гілок:

 git branch -a

У ньому будуть перераховані всі віддалені гілки.

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

git checkout -b localBranchName origin/RemteBranchName

16

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

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
Дуже корисний; саме те, що мені було потрібно. Єдине, що мені довелося змінити, це було у другому рядку, додав одинарні лапки навколо "HEAD" та "master"; ймовірно тому, що я використовую zsh. Дякую!
sockmonk

В основному це робиться так: (1) Отримання фактичних назв віддалених гілок [не голова, не майстер]; (2) повністю сказати Git відстежувати їх [не всі рішення роблять це]; (3) Виймання та витягування всього з цих гілок [включаючи теги]; (4) Встановлення нового походження і проходження шляхом проштовхування абсолютно всього вгору. Знову ж таки, більшість інших рішень не можуть перемістити всі шматки. Це все робить.
ingyhere

1
Я видалив антипаттер запуску grep, потім awk і конденсував команди grep в команду awk. Дякую трійцю !
ingyhere

Прочитайте це і ніколи не пишіть git fetch git pull stackoverflow.com/a/292359/1114926
Зелений

Git pullдійсно зробити fetchперший , але це легше сказати , якщо проблема з fetchчастини pullабо подальшої mergeчастини , pullколи fetchвиконується самостійно.
ingyhere

12

Після клонування головного сховища ви можете просто виконати

git fetch && git checkout <branchname>

1
простий. і працював над тим, щоб отримати відділення віддаленого походження
сервон

3
Це не дає відповіді на початкове запитання: "Як би я витягнув усі гілки на місцях?" Це тягне їх по одному, що не масштабується. Розглянемо випадок 100 відділень.
ingyhere

10

Переконайтесь, що всі віддалені гілки доступні для .git/configфайлу.

У цьому прикладі origin/productionдоступна лише гілка, навіть якщо ви намагаєтеся нічого git fetch --allне робити , окрім отримання productionгілки:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

Цей рядок слід замінити на:

[origin]
fetch = +refs/heads/*:refs/remotes/origin/*

Потім запустіть git fetchі т.д. ...


3
Щоб перевірити: git config --get remote.origin.fetchа потім (руйнівно) встановити його:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

або змінити текстовий файл конфігурації в каталозі .git, який працював на мене
FDIM

9

Цикл, схоже, не працює на мене, і я хотів ігнорувати походження / майстер. Ось що для мене спрацювало.

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

Після того:

git fetch --all
git pull --all

1
Варіант цього варіанту - правильна відповідь, але ця діє не у всіх крайових випадках. Також назви гілок можуть бути прикольними. Тому я зробив наступне: git гілка -r | grep -v ГОЛОВА | grep –v майстер | awk -F'origin / '' {print $ 2 "" $ 1 "походження /" $ 2} '| xargs -L 1 git гілка -f - трек; git fetch - всі; git pull - всі; І ТО РОЗПОДІЛИТИ ТРИК!
ingyhere

3
Стилістичне вдосконалення, щоб уникнути grep | awk антипаттера : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
трійка

7

Просто ці три команди отримають усі гілки:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

Це фактично корінь проблеми ОП. Якщо його клонують правильно, йому не потрібно буде робити цього pull --all. Але якщо все-таки потрібно, то інша відповідь нижче, від Джона Нола, припускаючи, що всі гілки відслідковуються, змішуються з цією відповіддю, - це шлях.
Д-р Беко

7

Чому ніхто не відповідає на питання хлопців і не пояснює, що відбувається?

  1. Переконайтеся, що ви відстежуєте всі віддалені гілки (або те, що ви хочете відстежувати) .
  2. Оновіть свої локальні відділення, щоб вони відображали віддалені гілки.

Відстежуйте всі віддалені гілки:

Відстежуйте всі гілки, які існують у віддаленому репо.

Зробіть це вручну:

Ви б замінили <branch>гілку, яка відображається на виході з git branch -r.

git branch -r
git branch --track <branch>

Зробіть це за допомогою сценарію bash

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

Оновіть інформацію про віддалені відділення на локальному комп’ютері:

Це отримує оновлення гілок віддаленого репо, які ви відстежуєте у вашому місцевому репо. Це не змінює ваші місцеві відділення. Ваше місцеве git repo тепер знає, що сталося на віддалених відділеннях репо. Прикладом може бути те, що нова віддана комісія була передана віддаленому майстру, а тепер ви отримаєте попередження про те, що ваш місцевий майстер відстає на 1 фіксацію.

git fetch --all

Оновіть інформацію про віддалені відділення вашого локального комп'ютера та оновіть локальні гілки:

Чи має вилучення з подальшим злиттям для всіх гілок від віддаленої до локальної гілки. Прикладом може бути те, що нова віддана команда була висунута на віддалений майстер, якщо виконати витяг, оновить ваше місцеве репортаж про зміни у віддаленій гілці, а потім вони об'єднають ці зміни у вашу локальну гілку. Це може створити досить безлад через конфлікти злиття.

git pull --all

4

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

Ви можете знайти останню версію тут :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

Щоб використовувати його, просто скопіюйте його у свій каталог git bin (для мене це C:\Program Files (x86)\Git\bin\git-cloneall), а потім у командному рядку:

git cloneall [standard-clone-options] <url>

Він клонується, як завжди, але створює локальні гілки відстеження для всіх віддалених гілок.


4

Як отримати всі гіти Git відстеження одного віддаленого.

Це було перевірено і функціонує на Red Hat та Git Bash в Windows 10.


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Пояснення:

Один лайнер перевіряє, а потім отримує всі гілки, окрім HEAD.

Перерахуйте гілки віддаленого відстеження.

git branch -r

Ігноруйте ГОЛОВУ.

grep -v ' -> '

Зняти назву філії з віддалених (-ів).

cut -d"/" -f2

Ознайомтесь з усіма гілками, які відстежують один пульт.

git checkout $branch

Отримати перевірену гілку.

git fetch

Технічно вибір нових місцевих гілок не потрібен.

Це може бути використано для будь-яких fetchабо pullгілок, які є новими та мають зміни у віддалених.

Просто переконайтеся, що ви тягнете лише тоді, коли готові до злиття.


Налаштування тесту

Ознайомтесь із сховищем із URL-адресою SSH.

git clone git@repository.git

До цього

Перевірте місцеві відділення.

$ git branch
* master

Виконати команди

Виконайте один вкладиш.

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

Після

Перевірка місцевих відділень включає віддалені гілки.

$ git branch
  cicd
  master
* preprod

4

Для користувачів Windows, що використовують PowerShell:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

Це працює з гілками з / у назві: git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Маркус

3

Ось що я вважаю надійним:

  • Не оновлює віддалене відстеження для існуючих гілок
  • Не намагається оновити HEADдля відстеженняorigin/HEAD
  • Дозволяє видаляти імена, окрім інших origin
  • Правильно цитується оболонка
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

Це не обов'язково для того git fetch --all, -allщоб git pullпереходити для передачі цієї опції до внутрішнього fetch.

Похвальна відповідь .


2

Ось Perl-версія однолінійки, надана у прийнятій відповіді:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

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

Ми випадково видалили своє сховище проекту Stash. На щастя, хтось створив виделку прямо перед випадковою втратою. Я клонував вилку до свого місцевого (опускаю деталі, як я це зробив). Після того, як я повністю роздобув вилку у своєму місцевому, я пробіг один одноколісний лайнер. Я змінив URL-адресу віддаленого пристрою (джерело в моєму випадку), щоб вказати на цільове сховище, до якого ми відновили:

git remote set-url origin <remote-url>

І нарешті підштовхнув усі гілки до виникнення так:

git push --all origin

і ми знову були в бізнесі.


1

Ми можемо помістити всі імена гілок або тегів у тимчасовий файл, а потім зробити git pull для кожного імені / тегу:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done

1

Якщо у вас виникли проблеми з fetch --allвідстеженням віддаленого відділення:

git checkout --track origin/%branchname%

1

Щоб уникнути повідомлення про помилку 'fatal: гілка з назвою' origin / master 'вже існує.', Вам потрібно це:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

Виходячи з відповіді Learath2, ось що я зробив, зробивши git clone [...]та cdввівши у створений каталог:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

Працював для мене, але я не можу знати, що він працюватиме для тебе. Будь обережний.


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

Тепер локально yourNewLocalBranchNameце ваше requiredRemoteBranch.


0

Для користувачів Visual Studio на консолі диспетчера пакунків:

гіт гілка | % {git fetch upstream; git merge upstream / master}


0

Перепробував багато способів, тільки цей простий і працює для мене.

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

Встановити псевдонім: (на основі верхньої відповіді)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

Тепер відстежувати всі гілки:

git track-all-branches

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.