Як сказати, яка локальна філія відстежує, яку віддалену гілку в Git?


234

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

Я використовую один віддалений сервер, який має назву "походження".


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

Відповіді:


196

Використовуючи приклад моєї копії Puppet, перевіреної з висхідного сховища Git на Github.com ...

$ git remote show origin
* remote origin
  Fetch URL: git://github.com/reductivelabs/puppet.git
  Push  URL: git://github.com/reductivelabs/puppet.git
  HEAD branch: master
  Remote branches:
    0.24.x                 tracked
    0.25.x                 tracked
    2.6.x                  tracked
    master                 tracked
    next                   tracked
    primordial-ooze        tracked
    reins-on-a-horse       tracked
    testing                tracked
    testing-17-march       tracked
    testing-18-march       tracked
    testing-2-april        tracked
    testing-2-april-midday tracked
    testing-20-march       tracked
    testing-21-march       tracked
    testing-24-march       tracked
    testing-26-march       tracked
    testing-29-march       tracked
    testing-31-march       tracked
    testing-5-april        tracked
    testing-9-april        tracked
    testing4268            tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Тоді, якщо я повинен був виконати наступне:

$ git checkout -b local_2.6 -t origin/2.6.x 
Branch local_2.6 set up to track remote branch 2.6.x from origin.
Switched to a new branch 'local_2.6'

І, нарешті, повторно запустіть git remote show originкоманду ще раз, я побачу наступне внизу внизу:

  Local branches configured for 'git pull':
    local_2.6 merges with remote 2.6.x
    master    merges with remote master

1
Це означає, що ви можете відстежувати всі віддалені гілки в ляльці, хоча у вас є кілька місцевих гілок. Що означає багато «відстежених» знаків, які ви бачите в результаті команди? "відслідковується", яким місцевим відділенням
PJ.

Віддалені гілки відстежуються тим, що якщо ви зробите git fetchабо git pullоновлення віддалених гілок будуть відслідковуватися у вашому клонованому сховищі. Локальні гілки - це саме те, локальні гілки віддалених гілок і, таким чином, оновлення віддалених гілок будуть відслідковуватися і об'єднуватися, коли буде надана відповідна команда для цього. Я чітко включаю параметр '-t' під час створення локальної гілки, щоб переконатися, що вона відслідковує гілку, з якої вона походить. Пам'ятайте, що місцева гілка може також відслідковувати іншу локальну гілку, тому вона не повинна бути віддаленою гілкою.
Джеремі Бууз

5
@PJ: Термін "трек" має два різних значення у Git. "Відстежені " рядки git remote show remote-nameпосилаються на "відстеження гілок" (знімки гілок із віддалених сховищ). Рядки "злиття з" відносяться до локальних гілок, які мають конфігурацію "висхідної гілки" (зроблена з --track/ -tопцією git гілка або git checkout і, таким чином, часто плутаються з "гілками відстеження").
Кріс Джонсен

" відділення дистанційного відстеження " - це сучасний словник для вищезгаданих "відслідковування гілок". Документ було оновлено в 8b3f3f84 .
ento

124

Для всіх галузей:

git branch -avv

Тільки для місцевих відділень:

git branch -lvv

Лише для віддалених відділень:

git branch -rvv

показує всі гілки, а також назву гілки вище за течією.


2
Це, безумовно, найпростіша і найповніша відповідь!

6
На версії git 1.7.7.5 це показує мені локальну гілку та sha-1, на яку вона вказує, але не відображається відслідковане віддалене відділення ...
mpontillo

Для мене працює у версії git 1.7.4.1 Другий 'v' потрібен для показу гілки віддаленого відстеження.
Пітер Джонсон

4
для зменшення показника випуску git branch -lvvможуть бути корисні лише місцеві гілки, що надходять за течією
AB

5
^ git branch -vvпрацює для мене ...
notacouch

52

Джеремі Баус ілюструє, як git remote showвідображається інформація про відстеження . Цього має бути достатньо, якщо ви хочете лише інформації для споживання людиною.

Якщо ви плануєте використовувати інформацію в автоматизованому контексті (наприклад, сценарій), вам слід використовувати нижчий рівень («сантехніка») git for-each-ref.

% git remote show origin
* remote origin
⋮
  Local branches configured for 'git pull':
    master merges with remote master
    pu     merges with remote pu
⋮
% git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
master <- origin/master
pu <- origin/pu

git for-each-refДізнався %(upstream)фішку в Git 1.6.3 . У більш ранніх версіях Git вам доведеться витягти інформацію про відстеження з git config branch.<name>.remoteі git config branch.<name>.merge(можливо використовуючи git for-each-refдля створення команди для кожного локального імені філії).



Щоб зробити його менш лаконічним, але запропонувати приємний спосіб візуально перевірити, чи віддалені назви такі ж, як імена місцевих гілок, загальний git gotcha: in bashgit for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
hobs

19

Для певної гілки ви можете використовувати git rev-parseразом із суфіксом @{u}або @{upstream}ім'ям гілки, наприклад:

$  git rev-parse --symbolic-full-name master@{u}
refs/remotes/github-mhl/master

... або для скороченої форми додайте --abbrev-ref

$ git rev-parse --symbolic-full-name --abbrev-ref master@{u}
github-mhl/master

Як правило, branch@{upstream}синтаксис можна використовувати там, де очікується фіксація.


1
+1 Ваша відповідь дала мені саме те, що мені потрібно: git rev-parse --symbolic-full-name HEADvs. git rev-parse --symbolic-full-name HEAD@{u}, дякую!
Тіно

10

Я використовую такий скрипт оболонки (названий git-tracks), щоб показати віддалену гілку, яку відслідковує поточна гілка:

#!/bin/sh -e
branch=$(git symbolic-ref HEAD)
branch=${branch##refs/heads/}
remote=$(git config "branch.${branch}.remote")
remoteBranch=$(git config "branch.${branch}.merge")
remoteBranch=${remoteBranch##refs/heads/}

echo "${remote:?}/${remoteBranch:?}"

Це також могло б використовувати згадане git for-each-ref, але я знайшов прямий доступ дещо простішим, ніж фільтрування виходу для поточної гілки.


Ви можете розглянути можливість використання "set -e" у верхній частині сценарію. Це дозволить вам видалити всі екземпляри "|| exit $?" зберігши таку ж невдалу поведінку.
Джон Вітлі

@JohnWhitley: Спасибі, я відредагував свою відповідь. Я знаю про set -e, але зазвичай дотримуюся явної перевірки. Але в цьому випадку це дійсно краще.
Інго Каркат

Не працює на мене git version 1.9.4. Чи не Echos нічого :(
Ain

8

.git/config файл також надасть інформацію про гілку відстеження як

[remote "Hub"]
    url = ssh://xxxx/tmp/Hub
    fetch = +refs/heads/*:refs/remotes/Hub/*
[branch "develop"]
    remote = Hub
    merge = refs/heads/develop
[branch "Dev1"]
    remote = Test
    merge = refs/heads/Dev1
[remote "Test"]
    url = ssh://xxxx/tmp/gittesting/Dev1GIT
    fetch = +refs/heads/*:refs/remotes/Test/*

5
git branch -vv

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


2

Додайте ці руни до [alias]розділу вашого файлу .gitconfig:

show-tracking = !sh -c 'git ls-remote . |grep `git log -1 --grep="git-svn-id" --format=%H`|perl -pe "s/[[:alnum:]]+[[:space:]]//"'

0

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

git for-each-ref --format='%(refname:short):%(upstream:short)' refs/heads | grep "^LocalBranchName:.*/" | sed "s/^LocalBranchName://"

Це не виведе нічого (порожній рядок) для місцевих гілок, які не мають відповідної віддаленої гілки ("someremote / somebranch").


-1

Спробуйте git branch з варіантами :

 -r
List or delete (if used with -d) the remote-tracking branches. 

-a
List both remote-tracking branches and local branches. 

В іншому випадку вивчіть своє .git/config.


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