Як перерахувати всі віддалені відділення в Git 1.7+?


634

Я намагався git branch -r, але це лише список віддалених гілок, які я відслідковував локально. Як знайти список тих, яких у мене немає? (Для мене не має значення, чи перераховує команда всі віддалені гілки або лише ті, що не відслідковуються.)


11
Ви маєте в виду , що ви модифікували refspec за замовчуванням, так що git fetchі git remote updateне забирати всі гілки пульта? Тому що в іншому випадку ви можете просто взяти, а потім використовувати git branch -r...
Cascabel

2
Я повинен мати. git branch -rпоказував мені лише віддалені гілки, які я відстежував локально. Зараз це працює краще.
Джеймс А. Росен

Відповіді:


804

Для переважної більшості [1] відвідувачів тут правильна і найпростіша відповідь на питання "Як мені перерахувати всі віддалені відділення в Git 1.7+?" є:

git branch -r

Для невеликої меншини [1] git branch -r не працює. Якщо git branch -rне виходить, спробуйте:

git ls-remote --heads <remote-name>

Якщо git branch -rне працює, то , може бути , як Cascabel каже «ви змінили refspec за замовчуванням, так що git fetchі git remote updateне забирають все remoteгілки« s » .


[1] На момент написання цієї виноски 2018-лютого я переглянув коментарі і бачу, що git branch -rпрацює для переважної більшості (близько 90% або 125 із 140 ).

Якщо git branch -rце не допоможе, перевірте, чи git config --get remote.origin.fetchміститься підстановка ( *) відповідно до цієї відповіді


15
Ви також можете зробити це, git ls-remote [url]щоб вам не потрібно було клонувати спочатку :)
Zsub

142
Ця відповідь є правильною, але оманливою, перше, що повинні побачити користувачі, які приїжджають сюди з пошукових систем, - це git branch -rте, що це правильна і найпростіша відповідь, запитуючий мав особливий випадок, коли він змінив поведінку своїх, git branch -rщо більшість користувачів, що приїжджають сюди, не будуть мати
Стефан

24
@Stephan: ти впевнений у цьому? git branch -rтеж не працював для мене. Це просто перелік гілок, які вже відслідковуються локально. Але git ls-remote --headsперераховані всі гілки, доступні у віддаленому сховищі ...
rexford

2
Якщо ви хочете отримати з гілок, перелічених через git ls-remote(а не вказані в git branch -r), його потрібно виконати git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"перед вилученням, як описано на сайті stackoverflow.com/a/26649770/873282 .
коппор

11
Не забудьте зробити git fetch --allраніше, щоб отримати всі поточні віддалені гілки.
А. Аттіа

173

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

git remote show <remote-name>

Він також намагається показати статус гілок відносно вашого локального сховища:

> git remote show origin
* remote origin
  Fetch URL: C:/git/.\remote_repo.git
  Push  URL: C:/git/.\remote_repo.git
  HEAD branch: master
  Remote branches:
    branch_that_is_not_even_fetched new (next fetch will store in remotes/origin)
    branch_that_is_not_tracked      tracked
    branch_that_is_tracked          tracked
    master                          tracked
  Local branches configured for 'git pull':
    branch_that_is_tracked merges with remote branch_that_is_tracked
    master                 merges with remote master
  Local refs configured for 'git push':
    branch_that_is_tracked pushes to branch_that_is_tracked (fast-forwardable)
    master                 pushes to master                 (up to date)

Саме так. Не отримано, не відстежується локально.
Туфір

3
branch_that_is_not_tracked tracked?
Пьотр Доброгост

3
@PiotrDobrogost Так! branch_that_is_not_tracked- це гілка, яку не відслідковує жодна місцева гітла git. Однак він отриманий у локальному сховищі (тому є віддалене відділення). Чомусь git remote showназиває цей стан tracked, навіть не маючи місцевої гілки, яка відстежує віддалений. В цьому випадку, протилежність trackedIS new, що означає «Не неправдоподібним».
Клас Меллбурн

це не працює програмно, занадто складно для розбору
Олександр Міллс

Це спричинило особливий випадок, коли я витягнув локальну гілку, яку потім було видалено на пульті. Тоді git branch -rприпускає, що ще існує віддалений відділення, але це git remote show originпоказує refs/remotes/origin/my-now-dead-branch stale (use 'git remote prune' to remove). Набагато корисніше!
icc97

53
git branch -a | grep remotes/*

10
Це в основному рівнозначно тому git branch -r, що в ОП заявило, що недостатньо добре.
Каскабель

9
насправді і те, git branch -aі git branch -rперелічити всі віддалені гілки для мене, я не впевнений, що те, що сказала ОП, є правдою. Я просто налаштував тестовий сховище і перевірив це (мав лише початкове відстеження / master master походження, але все ще бачив усі віддалені гілки з обома прапорами).
Ідан К

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

Здається, це рішення не містить перелік віддалених гілок, створених з моменту останнього отримання.
Anubian Noob

Дивна річ: Протягом багатьох років я користувався git fetchними git branch -a, а лише нещодавно почав провалюватися для мене. Можливо, поведінка git була змінена?
Себастьян Мах

39

Використовуючи git branch -rсписки всіх віддалених гілок та git branch -aсписки всіх гілок на локальних та віддалених. Ці списки, однак, застаріли. Щоб оновити ці списки, запустіть

git remote update --prune

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

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

git remote update --prune origin

Це вирішило мою проблему - тепер для мене працює 'git branch -r'.
Френсіс Нортон

27

Але

git branch -ar

повинен це зробити.


41
Подання обох аргументів є зайвим. -rповертає лише віддалені гілки. -aповертає як локальні, так і віддалені гілки. Таким чином, git branch -aі git branch -arобидва дають однаковий вихід.
Вальтер Роман

19

Ви також можете зробити git fetchнаступний a git branch -r. Без отримання ви не побачите найактуальніших гілок.


git fetch --allмати всі поточні гілки
А. Аттіа



9

TL; TR;

Це рішення вашої проблеми:

git remote update --prune    # To update all remotes
git branch -r                # To display remote branches

або:

git remote update --prune    # To update all remotes
git branch <TAB>             # To display all branches

5

Найкраща команда для запуску - це git remote show [remote]. Це покаже всі гілки, віддалені та локальні, відстежені та не відстежені.

Ось приклад проекту з відкритим кодом:

> git remote show origin
* remote origin
  Fetch URL: https://github.com/OneBusAway/onebusaway-android
  Push  URL: https://github.com/OneBusAway/onebusaway-android
  HEAD branch: master
  Remote branches:
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked
    refs/remotes/origin/branding stale (use 'git remote prune' to remove)
  Local branches configured for 'git pull':
    develop merges with remote develop
    master  merges with remote master
  Local refs configured for 'git push':
    develop pushes to develop (local out of date)
    master  pushes to master  (up to date)

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

grep "\w*\s*(new|tracked)" -E

За допомогою цієї команди:

> git remote show origin | grep "\w*\s*(new|tracked)" -E
    amazon-rc2                   new (next fetch will store in remotes/origin)
    amazon-rc3                   new (next fetch will store in remotes/origin)
    arrivalStyleBDefault         new (next fetch will store in remotes/origin)
    develop                      tracked
    master                       tracked

Ви також можете створити псевдонім для цього:

git config --global alias.branches "!git remote show origin | grep \w*\s*(new|tracked) -E"

Тоді можна просто бігти git branches.




4

Просто запустіть git fetchкоманду. Він перетягне всі віддалені гілки до вашого локального сховища, а потім зробить git branch -aсписок усіх гілок.


1

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

git remote show origin

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

git remote update

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

git branch -r

1

Використовуючи цю команду,

git log -r --oneline --no-merges --simplify-by-decoration --pretty=format:"%n %Cred CommitID %Creset: %h %n %Cred Remote Branch %Creset :%d %n %Cred Commit Message %Creset: %s %n"

CommitID       : 27385d919
Remote Branch  : (origin/ALPHA)
Commit Message :  New branch created

У ньому перераховані всі віддалені гілки, включаючи повідомлення фіксування та ідентифікатори фіксації, на які посилаються віддалені гілки.


1

Я б використав:

git branch -av

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


0

Переконайтеся, що віддалене походження, яке ви перераховуєте, - це справді сховане сховище, а не старіший клон.


0

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

git branch -r --all --merged \
    | tail -n +2 \
    | grep -P '^  remotes/origin/(?!HEAD)' \
    | perl -p -e 's/^  remotes\/origin\///g;s/master\n//g'

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