回答:
非常に磁器製のコマンドですが、これをスクリプトで使用したい場合は不向きです。
git branch -vv # doubly verbose!
git 1.8.3では、上流のブランチが青で表示されることに注意してください(「gitでこのブランチトラッキング(ある場合)とは何ですか?」を参照)。
きれいな出力が必要な場合は、arcresuの回答を参照してください。この回答は、私が最初にこの回答を書いたときに存在していたとは思わない磁器コマンドを使用しているため、少し簡潔で、マージだけでなく、リベース用に構成されたブランチで機能します。
git remote show origin
「origin」をリモコンの名前に置き換えます。
git remote show
コマンドが実際にリモートリポジトリに接続することです...オフラインであるか、
git remote show -n origin
オフラインでも一部の情報を取得するために使用できます。gitのリモートドキュメント:「-nオプションを指定すると、リモートヘッドはgitのLS-リモート<名前>で最初に照会されていません。キャッシュされた情報が代わりに使用されます。」
git remote show | xargs git remote show -n
結合追跡情報を表示するために実行できます。
のマニュアルページをgit-rev-parse
見ると、次の構文が記述されていることがわかります。
<branchname>@{upstream}
、例えばmaster@{upstream}
、@{u}
@{upstream}
ブランチ名のサフィックス(短縮形<branchname>@{u}
)は、branchnameで指定されたブランチがその上に構築するように設定されているブランチを指します。欠落しているブランチ名はデフォルトで現在の名前になります。
したがって、ブランチの上流を見つけるにはmaster
、次のようにします。
git rev-parse --abbrev-ref master@{upstream}
# => origin/master
各ブランチの情報を出力するには、次のようにします。
while read branch; do
upstream=$(git rev-parse --abbrev-ref $branch@{upstream} 2>/dev/null)
if [[ $? == 0 ]]; then
echo $branch tracks $upstream
else
echo $branch has no upstream configured
fi
done < <(git for-each-ref --format='%(refname:short)' refs/heads/*)
# Output:
# master tracks origin/master
# ...
これは、リファレンスと設定を手動で解析するよりもクリーンです。
done < <(git for-each-ref --format='%(refname:short)' refs/heads/**)
注意してください。
git rev-parse --abbrev-ref HEAD@{upstream}
現在のブランチではうまく機能しているようです。また、素晴らしいgitエイリアスになります。
while
ループ構文は、私には少し奇妙に見えます。git for-each-ref ... | while read branch; do ...
FIFOを必要とせず、記述されたコマンドと同じ順序で実行されるものを使用できます。
git for-each-ref --format='%(refname:short) tracks %(upstream:short)' refs/heads/*
kubiの答えの代わりに.git/config
、ローカルリポジトリの構成を示すファイルを確認することもできます。
cat .git/config
git config --get-regex branch
git for-each-ref --format='%(refname:short) <- %(upstream:short)' refs/heads
ローカルブランチごとに線が表示されます。追跡ブランチは次のようになります。
master <- origin/master
追跡しないものは次のようになります。
test <-
git branch -vv
たものよりもはるかに読みやすくなっています。🙏
git config --global alias.track 'for-each-ref --format='\''%(refname:short) <- %(upstream:short)'\'' refs/heads'
以下のために現在のブランチ、ここでは2つの良い選択肢があります。
% git rev-parse --abbrev-ref --symbolic-full-name @{u}
origin/mainline
または
% git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
origin/mainline
git for-each-ref --shell --format='%(refname:short) %(upstream:short)' refs/heads
。
現在のブランチについては、git checkout
(ブランチなし)と言うこともできます。これは、現在のブランチの追跡情報(存在する場合)を表示するという副作用のある何もしません。
$ git checkout
Your branch is up-to-date with 'origin/master'.
git checkout .
ません。これは何もしません。
このエイリアスを使用します
git config --global alias.track '!f() { ([ $# -eq 2 ] && ( echo "Setting tracking for branch " $1 " -> " $2;git branch --set-upstream $1 $2; ) || ( git for-each-ref --format="local: %(refname:short) <--sync--> remote: %(upstream:short)" refs/heads && echo --Remotes && git remote -v)); }; f'
その後
git track
if [ $# -eq 2 ]
then
echo "Setting tracking for branch " $1 " -> " $2
git branch --set-upstream $1 $2
else
echo "-- Local --"
git for-each-ref --shell --format="[ %(upstream:short) != '' ] && echo -e '\t%(refname:short) <--> %(upstream:short)'" refs/heads | sh
echo "-- Remote --"
REMOTES=$(git remote -v)
if [ "$REMOTES" != '' ]
then
echo $REMOTES
fi
fi
トラックが設定されたローカルのみが表示されます。
パス上のgit-trackと呼ばれるスクリプトにそれを書いてください、そうすればgit trackコマンドを取得します
git config --get-regexp "branch\.$current_branch\.remote"
追跡されているリモコンの名前が表示されます
git config --get-regexp "branch\.$current_branch\.merge"
追跡されているリモートブランチの名前が表示されます。
$ current_branchを現在のブランチの名前に置き換える必要があります。あなたはそれを動的に得ることができますgit rev-parse --abbrev-ref HEAD
次のミニスクリプトはそれらを組み合わせたものです。という名前のファイルに貼り付けgit-tracking
、実行可能にして、パスに含まれていることを確認します。
その後、あなたは言うことができます
$ git tracking
<current_branch_name>-><remote_repo_name>/<remote_branch_name>
リモートブランチ名はローカルブランチ名と異なる場合があります(ただし、通常はそうではありません)。例えば:
$git tracking
xxx_xls_xslx_thing -> origin/totally_bogus
コードを見るとわかるように、これの鍵はgit構成からデータを抽出することです。sedを使用して、無関係なデータをクリアします。
#!/bin/sh
current_branch=$(git rev-parse --abbrev-ref HEAD)
remote=$(git config --get-regexp "branch\.$current_branch\.remote" | sed -e "s/^.* //")
remote_branch=$(git config --get-regexp "branch\.$current_branch\.merge" | \
sed -e "s/^.* //" -e "s/refs\/.*\///")
echo "$current_branch -> $remote/$remote_branch"