Как узнать, какая локальная ветка отслеживает удалённую ветку в Git?
Я хотел бы знать, есть ли способ узнать, какая локальная ветка отслеживает, какая удаленная ветвь в Git.
Я использую один удаленный сервер, который называется «origin».
10 ответов
Используя пример моей копии 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
Для всех ветвей:
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 [email protected]{u}
refs/remotes/github-mhl/master
... или для сокращенной формы, добавьте --abbrev-ref
$ git rev-parse --symbolic-full-name --abbrev-ref [email protected]{u}
github-mhl/master
Обычно вы можете использовать синтаксис [email protected]{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
.