Я хотел бы знать, есть ли способ сказать, какая локальная ветвь отслеживает, какая удаленная ветвь в 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
/ git branch или git checkout и поэтому часто путается с «отслеживающими ветвями»). -t
Для всех филиалов:
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
против git rev-parse --symbolic-full-name HEAD@{u}
, спасибо!
Я использую следующий сценарий оболочки (named 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
. Эхоси ничего :(
.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»).