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