Gitでどのローカルブランチがどのリモートブランチを追跡しているかを確認する方法があるかどうか知りたいのですが。
「Origin」という名前の1つのリモートサーバーを使用しています。
Github.comのアップストリームGitリポジトリからチェックアウトした私のPuppetのコピーの例を使用しています...
$ 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
すべてのブランチと上流のブランチの名前を表示します。
Jeremy Bouseが _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
_は Git 1.6. で%(upstream)
トークンを学習しました。以前のバージョンの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
あなたが求めるものを正確に示します。ローカルブランチと、追跡している対応するリモートブランチが表示されます。
これらのルーン文字を.gitconfigファイルの[alias]
セクションに追加します。
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")に対しては何も出力しません(空の文字列)。