Назад | Перейти на главную страницу

Как узнать, какая локальная ветка отслеживает удаленную ветку в Git?

Я хотел бы знать, есть ли способ узнать, какая локальная ветвь отслеживает удаленную ветку в Git.

Я использую один удаленный сервер с именем origin.

Используя пример моей копии 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

Для всех филиалов:

git branch -avv

Только для местных филиалов:

git branch -lvv

Только для удаленных филиалов:

git branch -rvv

показывает вам все ветки, а также имя вышестоящей ветки.

Джереми Баус иллюстрирует как 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 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} синтаксис везде, где ожидается фиксация.

Я использую следующий сценарий оболочки (с именем 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, но я обнаружил, что прямой доступ несколько проще, чем фильтрация вывода для текущей ветви.

.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/*
git branch -vv

показывает именно то, что вы просите. Он показывает локальные ветви вместе с соответствующей удаленной ветвью, которую они отслеживают.

Добавьте эти руны в [alias] раздел вашего файла .gitconfig:

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

Мне нужно было найти соответствующую удаленную ветвь (если есть) для каждой локальной ветки в цикле, который действовал в списке локальных веток. В итоге я использовал следующее:

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

Это ничего не выведет (пустая строка) для локальных ветвей, у которых нет соответствующей удаленной ветки («someremote / somebranch»).

Пытаться 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.