ローカルブランチが追跡しているリモートブランチを見つけるにはどうすればよいですか?
git config
出力を解析する必要がありますか、それともこれを実行するコマンドがありますか?
ローカルブランチが追跡しているリモートブランチを見つけるにはどうすればよいですか?
git config
出力を解析する必要がありますか、それともこれを実行するコマンドがありますか?
回答:
以下は、すべてのトラッキングブランチを提供するコマンドです(「プル」用に構成されています)。以下を参照してください:
$ git branch -vv
main aaf02f0 [main/master: ahead 25] Some other commit
* master add0a03 [jdsumsion/master] Some commit
SHAと長いラッピングコミットメッセージを順番にたどる必要がありますが、入力は簡単で、3番目の列で追跡ブランチが垂直に配置されます。
ブランチごとの「プル」と「プッシュ」の両方の設定に関する情報が必要な場合は、の他の回答を参照してくださいgit remote show origin
。
更新
gitバージョン1.8.5以降では、アップストリームブランチをgit status
およびgit status -sb
git branch -av
or よりも直接的なものgit remote show origin
であり、追跡されるリモートだけでなく、
git status
してgit status -sb
-あなたは1.8.5.xへのアップグレード後はそう、この質問(と回答)は無関係です。
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
%(refname:short)
は、内の現在の参照の名前です--format
。
git help revisions
(ドキュメントのほとんど知られていないが最も有用な部分の1つ)を検索しupstream
ます。
git diff `git rev-parse --abbrev-ref --symbolic-full-name @{upstream}`
echo 'git for-each-ref --format=\'%(refname:short) -> %(upstream:short)\' refs/heads/$1' > ~/bin/git-show-upstream; chmod +x ~/bin/git-show-upstream
git for-each-ref --format='%(upstream:short)' $(git rev-parse --symbolic-full-name SOMEBRANCH)
SOMEBRANCHをブランチ名、または現在のブランチの「HEAD」で置き換える
git branch -av
ローカルブランチが追跡しているリモートブランチを推測するために、あなたが持っているブランチとそれらがどこにコミットしているかを伝えるだけだと思います。
git remote show origin
どのブランチがどのリモートブランチを追跡しているかを明示的に通知します。これは、単一のコミットと呼ばれるリモートブランチを持つリポジトリからの出力例ですabranch
:
$ git branch -av
* abranch d875bf4 initial commit
master d875bf4 initial commit
remotes/origin/HEAD -> origin/master
remotes/origin/abranch d875bf4 initial commit
remotes/origin/master d875bf4 initial commit
対
$ git remote show origin
* remote origin
Fetch URL: /home/ageorge/tmp/d/../exrepo/
Push URL: /home/ageorge/tmp/d/../exrepo/
HEAD branch (remote HEAD is ambiguous, may be one of the following):
abranch
master
Remote branches:
abranch tracked
master tracked
Local branches configured for 'git pull':
abranch merges with remote abranch
master merges with remote master
Local refs configured for 'git push':
abranch pushes to abranch (up to date)
master pushes to master (up to date)
git remote show origin
は、ローカルブランチと、それらがプッシュとプルの両方で追跡するものを示します。
origin
いることですが、実際には何でもかまいません(たとえば、複数のリモートがあり、異なるブランチが異なるリモートからのブランチを追跡しています)。
更新:まあ、私がこれを投稿してから数年になります!HEADをアップストリームと比較するという特定の目的のために、ここでを使用します@{u}
。これは、アップストリーム追跡ブランチのHEADを参照するショートカットです。(https://git-scm.com/docs/gitrevisions#gitrevisions-emltbranchnamegtupstreamemegemmasterupstreamememuemを参照してください)。
元の答え:この問題にも遭遇しました。私は1つのリポジトリで複数のリモートを使用することがよくありますが、現在のブランチが追跡しているリモートを忘れるのは簡単です。また、を介してローカルコミットを確認する場合など、そのことを知っておくと便利な場合がありますgit log remotename/branchname..HEAD
。
このすべてのものはgit構成変数に格納されますが、git構成の出力を解析する必要はありません。git configに続けて変数の名前を呼び出すと、その変数の値が出力されるだけで、解析は必要ありません。これを念頭に置いて、現在のブランチの追跡設定に関する情報を取得するためのコマンドをいくつか次に示します。
LOCAL_BRANCH=`git name-rev --name-only HEAD`
TRACKING_BRANCH=`git config branch.$LOCAL_BRANCH.merge`
TRACKING_REMOTE=`git config branch.$LOCAL_BRANCH.remote`
REMOTE_URL=`git config remote.$TRACKING_REMOTE.url`
私の場合、私は現在のリモコンの名前を見つけることだけに興味があるので、これを行います。
git config branch.`git name-rev --name-only HEAD`.remote
git name-rev --name-only HEAD
は実際にはどのブランチにいるのかを教えてくれないことを発見しました。そのために使用したばかりgit branch | grep '^\*' | cut -d' ' -f2
@{u}
エイリアス/ショートカットについては触れられていませんでした。それがまさに私が探していたものです。プルする必要があるかどうかを判断するだけの場合は、マスターブランチと比較する理由はありません。
@{u}
爆弾です。そして、1.7.0以降に使用されています。つまり、誰かが2018で使用しているgitで使用できない場合、おそらくアップグレードの予定です。
これにより、現在のブランチが表示されます。
$ git branch -vv
これにより、現在のブランチのみが表示されます。
$ git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)
例えば:
myremote/mybranch
現在のブランチで使用されているリモートのURLを確認できます。
$ git remote get-url $(git for-each-ref --format='%(upstream:short)' $(git symbolic-ref -q HEAD)|cut -d/ -f1)
例えば:
https://github.com/someone/somerepo.git
を使用できますgit checkout
。つまり、「現在のブランチをチェックアウト」します。これは、現在のブランチの追跡情報(存在する場合)を表示するという副作用のある何もしません。
$ git checkout
Your branch is up-to-date with 'origin/master'.
これがgit configの出力の解析としてカウントされるかどうかはわかりませんが、これはマスターが追跡しているリモートのURLを決定します。
$ git config remote。$(git config branch.master.remote).url
git config branch.$(git symbolic-ref -q HEAD).remote
、現在のブランチgit config remote.$(git config branch.$(git symbolic-ref -q HEAD).remote).url
で追跡されているリモートの名前(URL)だけが必要な場合。
--short
するようにオプションを追加する必要がありました。したがって、現在のブランチのリモート名git config branch.$(git symbolic-ref -q --short HEAD).remote
を取得する場合、および現在のブランチのリモート名を取得する場合:git config remote.$(git config branch.$(git symbolic-ref -q --short HEAD).remote).url
別の簡単な方法は使用することです
cat .git/config
Gitリポジトリ
これはローカルブランチの詳細をリストします
type .git/config
する代わりにcat .git/config
...平野、コマンドライン上のコースの
別の方法(osseに感謝)、それが存在するかどうかを知りたいだけの場合:
if git rev-parse @{u} > /dev/null 2>&1
then
printf "has an upstream\n"
else
printf "has no upstream\n"
fi
git branch -r -vv
リモートを含むすべてのブランチをリストします。
git-status磁器(マシンが読み取り可能な)v2の出力は次のようになります。
$ git status -b --porcelain=v2
# branch.oid d0de00da833720abb1cefe7356493d773140b460
# branch.head the-branch-name
# branch.upstream gitlab/the-branch-name
# branch.ab +2 -2
そして、ブランチを上流のみに取得するには:
$ git status -b --porcelain=v2 | grep -m 1 "^# branch.upstream " | cut -d " " -f 3-
gitlab/the-branch-name
ブランチに上流がない場合、上記のコマンドは空の出力を生成します(またはで失敗しますset -o pipefail
)。
(自分がいるブランチだけではなく)任意のブランチのアップストリームを見つけたい場合は、@ cdunn2001の回答を少し変更します。
git rev-parse --abbrev-ref --symbolic-full-name YOUR_LOCAL_BRANCH_NAME@{upstream}
という名前のローカルブランチのリモートブランチ名が表示されYOUR_LOCAL_BRANCH_NAME
ます。
このエイリアスを使用します
git config --global alias.track '!sh -c "
if [ \$# -eq 2 ]
then
echo \"Setting tracking for branch \" \$1 \" -> \" \$2;
git branch --set-upstream \$1 \$2;
else
git for-each-ref --format=\"local: %(refname:short) <--sync--> remote: %(upstream:short)\" refs/heads && echo --URLs && git remote -v;
fi
" -'
その後
git track
このスクリプトはトラッキングの設定にも使用できることに注意してください。
EasyGit(別名 "eg")をGitの上(または横)の超軽量ラッパーとして使用しています。EasyGitには「info」サブコマンドがあり、現在のブランチのリモート追跡ブランチなど、あらゆる種類の非常に役立つ情報を提供します。次に例を示します(現在のブランチ名は「foo」です)。
pknotz @ s883422:(foo)〜/ workspace / bd $例情報 コミット総数:175 ローカルリポジトリ:.git 名前付きリモートリポジトリ:(名前->場所) 原点-> git://sahp7577/home/pknotz/bd.git 現在のブランチ:foo 暗号化チェックサム(sha1sum):bd248d1de7d759eb48e8b5ff3bfb3bb0eca4c5bf デフォルトのプル/プッシュリポジトリ:origin デフォルトのプル/プッシュオプション: branch.foo.remote = origin branch.foo.merge = refs / heads / aal_devel_1 投稿者数:3 ファイル数:28 ディレクトリ数:20 最大ファイルサイズ、バイト単位:32473(pygooglechart-0.2.0 / COPYING) コミット:62
この答えを改善して、私はこれらの.gitconfig
エイリアスを思いつきました:
branch-name = "symbolic-ref --short HEAD"
branch-remote-fetch = !"branch=$(git branch-name) && git config branch.\"$branch\".remote || echo origin #"
branch-remote-push = !"branch=$(git branch-name) && git config branch.\"$branch\".pushRemote || git config remote.pushDefault || git branch-remote-fetch #"
branch-url-fetch = !"remote=$(git branch-remote-fetch) && git remote get-url \"$remote\" #" # cognizant of insteadOf
branch-url-push = !"remote=$(git branch-remote-push ) && git remote get-url --push \"$remote\" #" # cognizant of pushInsteadOf
Gradleを使用している場合、
def gitHash = new ByteArrayOutputStream()
project.exec {
commandLine 'git', 'rev-parse', '--short', 'HEAD'
standardOutput = gitHash
}
def gitBranch = new ByteArrayOutputStream()
project.exec {
def gitCmd = "git symbolic-ref --short -q HEAD || git branch -rq --contains "+getGitHash()+" | sed -e '2,\$d' -e 's/\\(.*\\)\\/\\(.*\\)\$/\\2/' || echo 'master'"
commandLine "bash", "-c", "${gitCmd}"
standardOutput = gitBranch
}
次のコマンドは、リモートの現在のフォークが参照している
git remote -v
リモートパスを追加するには、
git remote add origin path_name
git remote show origin
。他の質問の主な答えは、ここで簡単な答えを囲んでいるbashスクリプトです。うまくいけば、この質問は完全に閉じられていません。