Я хотел бы знать, есть ли способ узнать, какая локальная ветвь отслеживает удаленную ветку в 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
.