Я хотів би знати, чи є спосіб сказати, яка локальна гілка відстежує, яку віддалену гілку в Git.
Я використовую один віддалений сервер, який має назву "походження".
Я хотів би знати, чи є спосіб сказати, яка локальна гілка відстежує, яку віддалену гілку в Git.
Я використовую один віддалений сервер, який має назву "походження".
Відповіді:
Використовуючи приклад моєї копії 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 fetch
або git pull
оновлення віддалених гілок будуть відслідковуватися у вашому клонованому сховищі. Локальні гілки - це саме те, локальні гілки віддалених гілок і, таким чином, оновлення віддалених гілок будуть відслідковуватися і об'єднуватися, коли буде надана відповідна команда для цього. Я чітко включаю параметр '-t' під час створення локальної гілки, щоб переконатися, що вона відслідковує гілку, з якої вона походить. Пам'ятайте, що місцева гілка може також відслідковувати іншу локальну гілку, тому вона не повинна бути віддаленою гілкою.
git remote show remote-name
посилаються на "відстеження гілок" (знімки гілок із віддалених сховищ). Рядки "злиття з" відносяться до локальних гілок, які мають конфігурацію "висхідної гілки" (зроблена з --track
/ -t
опцією git гілка або git checkout і, таким чином, часто плутаються з "гілками відстеження").
Для всіх галузей:
git branch -avv
Тільки для місцевих відділень:
git branch -lvv
Лише для віддалених відділень:
git branch -rvv
показує всі гілки, а також назву гілки вище за течією.
git branch -lvv
можуть бути корисні лише місцеві гілки, що надходять за течією
git branch -vv
працює для мене ...
Джеремі Баус ілюструє, як 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 for-each-ref --format=$'\n'' '' '' '' '' '' ''/%(refname:short);%(upstream:short)' refs/heads | tr ';' $'\n'
Для певної гілки ви можете використовувати 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 rev-parse --symbolic-full-name HEAD
vs. git rev-parse --symbolic-full-name HEAD@{u}
, дякую!
Я використовую такий скрипт оболонки (названий 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
, але зазвичай дотримуюся явної перевірки. Але в цьому випадку це дійсно краще.
git version 1.9.4
. Чи не Echos нічого :(
.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 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
.