特定のリモートリポジトリにリモートブランチが存在するかどうかを確認する方法


105

特定のリモートリポジトリに存在する場合、特定のブランチに対してサブツリーマージを実行する必要があります。問題は、リモートリポジトリがローカルでチェックアウトされていないため、を使用できないことgit branch -rです。私が持っているのは、このようなリモートアドレスだけ https://github.com/project-name/project-name.gitです。リモートアドレスだけでリモートブランチを一覧表示する方法はありますか?何も役に立たなかった:(

回答:


124
$ git ls-remote --heads git@github.com:user/repo.git branch-name

場合はbranch-name、あなたが次のような出力が得られます発見されました。

b523c9000c4df1afbd8371324083fef218669108        refs/heads/branch-name

そうでない場合、出力は送信されません。

だからそれをパイプすることwcはあなたに与える10

$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l

または、一致する参照が見つからない場合に終了コードを返す--exit-codeフラグを設定できます。これは最も慣用的なソリューションです。結果は、シェルテストで直接確認するか、ステータス変数を確認することで確認できます。git ls-remote2$?

$ git ls-remote --exit-code --heads  git@github.com:user/repo.git branch-name

7
私が使用git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/nullしたif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
sibaz

1
私はこのきちんとした正確な答えを数時間探していました。
メディック

ブランチ名をとして指定する必要があります/refs/heads/branch-name。そうでfoo/branch-nameない場合、ブランチがなくてもブランチが返されbranch-nameます。
FuzzY

「Great Answer」ゴールドバッジおめでとうございます。:)
jmort253

4
注:リポジトリURLを指定する必要がない場合は、代わりにリポジトリリモート名を指定できます。例:git ls-remote --heads origin branch-name
daveruinseverything

50
git ls-remote --heads https://github.com/rails/rails.git
5b3f7563ae1b4a7160fda7fe34240d40c5777dcd    refs/heads/1-2-stable
81d828a14c82b882e31612431a56f830bdc1076f    refs/heads/2-0-stable
b5d759fd2848146f7ee7a4c1b1a4be39e2f1a2bc    refs/heads/2-1-stable
c6cb5a5ab00ac9e857e5b2757d2bce6a5ad14b32    refs/heads/2-2-stable
e0774e47302a907319ed974ccf59b8b54d32bbde    refs/heads/2-3-stable
13ad87971cc16ebc5c286b484821e2cb0fc3e3b1    refs/heads/3-0-stable
3df6c73f9edb3a99f0d51d827ef13a439f31743a    refs/heads/3-1-stable
f4db3d72ea564c77d5a689b850751ce510500585    refs/heads/compressor
c5a809e29e9213102351def7e791c3a8a67d7371    refs/heads/deps_refactor
821e15e5f2d9ef2aa43918a16cbd00f40c221e95    refs/heads/encoding
8f57bf207ff4f28fa8da4544ebc573007b65439d    refs/heads/master
c796d695909c8632b4074b7af69a1ef46c68289a    refs/heads/sass-cleanup
afd7140b66e7cb32e1be58d9e44489e6bcbde0dc    refs/heads/serializers

ls-remoteについても知りませんでした。ありがとうございました!
キーン

7
bashスクリプトでテストを行う必要があったため、終了コードにのみ興味があったので、ローカルクローンで次の操作をgit ls-remote --exit-code . origin/branch-name &> /dev/null行い$?ました。テストオペランドとして使用
Darren Bishop

5
@Darrenは、と同様に条件付きでコマンドを直接使用するだけでif git ls-remote ...; then ...; fi、チェックよりもエラーが発生しにくくなります$?(これは、ログステートメント、トラップなどで変更できます)。
Charles Duffy

なぜ--heads
Steve

@JohnLinux --headsはブランチのみをリストします。--tagsタグのみをリストするために使用します。
rymo 2016年

19

実行するgitリポジトリの場合、現在のフォルダーで使用できる別の方法

git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'

2
二重引用符を使用します。git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
イワン

3
これは最適ではありません。既存のブランチ名の一部にのみ一致し、ターゲットブランチに完全には一致しなかった場合でもtrueを返します。したがって、これをスクリプトで安全に使用して、チェックアウトする前にブランチが存在するかどうかをテストすることはできません。とにかく共有してくれてありがとう。このように修正できます:git branch -a | grep "\b${BRANCH}$"
EntangledLoops 2016年

2
git fetchgit branch -aすべてのリモート参照が最初にフェッチされるように使用する場合は必須です。他の人git ls-remoteが指摘したように使用します。
hIpPy 2017

git branch -a --list '<pattern>'オプションもあります。スクリプトの戻りコードが必要な場合は、grepにパイプしてください。
LOAS 2017

17

これを使用することもできます:

git show-branch remotes/origin/<<remote-branch-name>>

最新のコミットと$の値を返しますか?そうでなければ0は「致命的:悪いsha1参照remotes / origin / <>」と$?128です


これはチェック前にリモートからブランチをプルしないため、最新のリモート状態を取得しません。
siemanko

11

そうすれば、毎回手動でリポジトリ名を渡す必要はありません。

git ls-remote origin <branch>

の代わりに

git ls-remote <full repo url> <branch>

例:

git ls-remote git@bitbucket.org:landmarkgroupme/in-store-application.git  uat_21dec

または

git ls-remote origin uat_21dec

どちらも同じ出力になります:

ここに画像の説明を入力してください

Originの詳細:Gitには「リモート」という概念があります。これは、リポジトリの他のコピーへの単なるURLです。別のリポジトリのクローンを作成すると、Gitは自動的に「origin」という名前のリモートを作成し、それを指します。git remote show originと入力すると、リモートに関する詳細情報を表示できます。


11

ここでの回答はすべてLinuxシェル固有のものであり、Windowsのコマンドプロンプトなど、この種の操作をサポートしていない環境ではあまり役に立ちません。

幸い、ブランチが存在するかどうかに応じて、それぞれ0または2を返す引数をgit ls-remote受け入れ--exit-codeます。そう:

git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>

0を返し、

git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>

2を返します。

PowerShellの場合、組み込みの真実性処理セマンティクスを単純に使用できます。

if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }

利回り$true、一方で:

if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }

利回り$false


10

あなたはBashターミナルでこのようなことをすることができます。エコーを実行したいコマンドに置き換えるだけです。

if git ls-remote https://username:password@github.com/project-name/project-name.git | grep -sw "remote_branch_name" 2>&1>/dev/null; then echo "IT EXISTS..START MERGE" ; else echo "NOT FOUND" ; fi

それが役に立てば幸い。


1
私はそれが好きです。他の回答にもls-remoteがあり、私が好きなのは「if」です。
ストーニー

6
$ git ls-remote --heads origin <branch> | wc -l

ほとんどの場合動作します。

しかし、ブランチが以下のように部分的に一致する場合は機能しません、

$ git branch -a
creative/dev
qa/dev

$ git ls-remote --heads origin dev | wc -l
2

使用する

git ls-remote --heads origin <branch> | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^<branch>$ | wc -l

信頼できる方法が必要な場合。

スクリプトで使用しorigin、デフォルトのリモートとして想定したくない場合

git ls-remote --heads $(git remote | head -1) "$branch" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    grep ^"$branch"$ | wc -l

うまくいくはずです。

git branch -a | grep ...最後fetchに実行されてからしばらくの間は信頼できないことに注意してください。


私にとって、これは受け入れられた回答であり、Amitesh(短いリモート名)からの回答とJames Jamesからの回答(grep -x "$branch"と同じ)を組み合わせたものですgrep ^"$branch"$。スクリプトでは長い形式のスイッチを使用し--line-regexpますが、また、行う必要はありませんwc -l。空の出力をBashに置くif [ -z ] と、事実上trueと評価されるため、ブランチが存在しないことになります。これにより、数ミリ秒を節約できます。
Amedee Van Gasse、

1

使用しているリポジトリをリモートとして使用して追加し、リモートですべての情報を取得git remote add something https://github.com/project-name/project-name.gitするgit remote show somethingことができます。これにはネットワーク接続が必要であり、人間が使用する場合に役立ちます。

または、を実行しgit fetch somethingます。これにより、呼び出されたリモートのすべてのブランチがフェッチさsomethingれ、ローカルリポジトリに保持されます。その後、必要に応じてそれらをローカルブランチにマージできます。最終的にマージする必要があると判断した場合、これを行う必要があるため、この方法をお勧めします。

OT:「ローカルでチェックアウト」の使用は、集中型バージョン管理システムの観点からこれに取り組んでいることを示しています。これは通常、gitを処理する際の行き止まりです。古いシステムとは異なり、「チェックアウト」などの単語を使用します。


説明ありがとうございます。私はまだgitに慣れていませんでしたが、考え方は異なります。
Keen、

1

あなたが試すことができます

git diff --quiet @{u} @{0}

ここで@{u}はリモート/アップストリームを@{0}指し、現在のローカルヘッドを指します(gitの新しいバージョンでは、@{0}として短縮できます@)。リモートが存在しない場合、エラーになります。

git 2.16.2(この機能を最初に備えたバージョンがわからない、たとえばgit 1.7.1にはない)で、次のことができます

git checkout

リモートブランチが存在する場合、次のような出力が表示されます。

Your branch is up to date with 'origin/master'

それ以外の場合、出力はありません。


1

名前にクエリを含むすべてのブランチ(リモートまたはローカル)を返します。

git branch --all | grep <query>


0

ブランチ名が非常に具体的である場合、単純なブランチ名のマッチングにgrepを使用する必要がない場合があります。

git ls-remote --heads $(git remote | head -1) "*${BRANCH_NAME}*" | \
    cut -d$'\t' -f2 | \
    sed 's,refs/heads/,,' | \
    wc -l

はたらく

BRANCH=master
BRANCH=mas
BRANCH=NonExistingBranch (returns 0)
BRANCH=ISSUE-123

ブランチ名として一意の課題IDを使用しており、正常に機能します。


0

私はこれを試しました:

git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l

これは、ブランチ「your-branch」が見つかった場合は1を返し、それ以外の場合は0を返します。


0

上記の答えのいくつかをスクリプトにまとめています。

BRANCHES=(develop master 7.0 7.0-master)
ORIGIN=bitbucket
REMOTE=github

for BRANCH in "${BRANCHES[@]}"; do
  BRANCH=$(git ls-remote --heads "${ORIGIN}" "${BRANCH}" \
      | cut --delimiter=$'\t' --fields=2 \
      | sed 's,refs/heads/,,' \
      | grep --line-regexp "${BRANCH}")
  if [ -n "${BRANCH}" ]
  then
    git branch --force "${BRANCH}" "${ORIGIN}"/"${BRANCH}"
    git checkout "${BRANCH}"
    git push "${REMOTE}" "${BRANCH}"
  fi
done

git push github --tags

このスクリプトは、リモートのbitbucketから4つのブランチを取得し、それらをリモートのgithubにプッシュしてから、すべてのタグをgithubにプッシュします。私はこれをJenkinsジョブで使用しています。そのため、git fetchまたはが表示されませんgit pull。これは、Jenkinsジョブリポジトリ設定ですでに行われています。

通常、スクリプトでは長い形式のオプションを使用します。私が組み合わされている可能性git branchgit checkout使用してgit checkout -B

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.