回答:
$ git ls-remote --heads git@github.com:user/repo.git branch-name
場合はbranch-name
、あなたが次のような出力が得られます発見されました。
b523c9000c4df1afbd8371324083fef218669108 refs/heads/branch-name
そうでない場合、出力は送信されません。
だからそれをパイプすることwc
はあなたに与える1
か0
:
$ git ls-remote --heads git@github.com:user/repo.git branch-name | wc -l
または、一致する参照が見つからない場合に終了コードを返す--exit-code
フラグを設定できます。これは最も慣用的なソリューションです。結果は、シェルテストで直接確認するか、ステータス変数を確認することで確認できます。git ls-remote
2
$?
$ git ls-remote --exit-code --heads git@github.com:user/repo.git branch-name
/refs/heads/branch-name
。そうでfoo/branch-name
ない場合、ブランチがなくてもブランチが返されbranch-name
ます。
git ls-remote --heads origin branch-name
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
git ls-remote --exit-code . origin/branch-name &> /dev/null
行い$?
ました。テストオペランドとして使用
if git ls-remote ...; then ...; fi
、チェックよりもエラーが発生しにくくなります$?
(これは、ログステートメント、トラップなどで変更できます)。
--heads
?
--heads
はブランチのみをリストします。--tags
タグのみをリストするために使用します。
実行するgitリポジトリの場合、現在のフォルダーで使用できる別の方法
git branch -a | egrep 'remotes/origin/${YOUR_BRANCH_NAME}$'
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
git branch -a
すべてのリモート参照が最初にフェッチされるように使用する場合は必須です。他の人git ls-remote
が指摘したように使用します。
git branch -a --list '<pattern>'
オプションもあります。スクリプトの戻りコードが必要な場合は、grepにパイプしてください。
そうすれば、毎回手動でリポジトリ名を渡す必要はありません。
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と入力すると、リモートに関する詳細情報を表示できます。
ここでの回答はすべて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
。
あなたは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
それが役に立てば幸い。
$ 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
に実行されてからしばらくの間は信頼できないことに注意してください。
grep -x "$branch"
と同じ)を組み合わせたものですgrep ^"$branch"$
。スクリプトでは長い形式のスイッチを使用し--line-regexp
ますが、また、行う必要はありませんwc -l
。空の出力をBashに置くif [ -z ]
と、事実上trueと評価されるため、ブランチが存在しないことになります。これにより、数ミリ秒を節約できます。
使用しているリポジトリをリモートとして使用して追加し、リモートですべての情報を取得git remote add something https://github.com/project-name/project-name.git
するgit remote show something
ことができます。これにはネットワーク接続が必要であり、人間が使用する場合に役立ちます。
または、を実行しgit fetch something
ます。これにより、呼び出されたリモートのすべてのブランチがフェッチさsomething
れ、ローカルリポジトリに保持されます。その後、必要に応じてそれらをローカルブランチにマージできます。最終的にマージする必要があると判断した場合は、これを行う必要があるため、この方法をお勧めします。
OT:「ローカルでチェックアウト」の使用は、集中型バージョン管理システムの観点からこれに取り組んでいることを示しています。これは通常、gitを処理する際の行き止まりです。古いシステムとは異なり、「チェックアウト」などの単語を使用します。
あなたが試すことができます
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'
それ以外の場合、出力はありません。
名前にクエリを含むすべてのブランチ(リモートまたはローカル)を返します。
git branch --all | grep <query>
ブランチ名が非常に具体的である場合、単純なブランチ名のマッチングに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を使用しており、正常に機能します。
私はこれを試しました:
git ls-remote --heads 2>/dev/null|awk -F 'refs/heads/' '{print $2}'|grep -x "your-branch"|wc -l
これは、ブランチ「your-branch」が見つかった場合は1を返し、それ以外の場合は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 branch
やgit checkout
使用してgit checkout -B
。
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
したif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi