web-dev-qa-db-ja.com

すべてのリモート参照を一覧表示するにはどうすればよいですか?

最近、GitHubに [〜#〜] pr [〜#〜] を作成しましたが、一部のテストが失敗しました。そして、ローカルではさらに多くのテストに合格しませんでした。だから私は問題が何であるかを理解しようとしました。

そして私が見つけたのは、Travisが other commit にあるリポジトリをテストしているということです。 refはrefs/pull/81/mergeです。したがって、誰かが私のブランチをマスターにマージし、対応する参照を作成したと考えられます。 GitHubとTravisのどちらでしたか?

そして他の質問、GitHubリポジトリが持っているすべての参照をリストできますか?

14
x-yuri

Travis自体については何も知りませんが、GitHubは実際にこれらの_refs/pull/number/merge_参照を作成します。特に、観察に基づくと、ドキュメントは少しぎこちないようで、私はGitHubの少しカジュアルなユーザーですが、GitHub、GitHubで[新しいプルリクエスト]をクリックすると、次のようになります。

  • _refs/pull/number/head_という名前の参照を作成して、他の誰かにマージを依頼しているコミットのIDを保存します。
  • (_git merge_を使用して)自動マージアンドコミットを試行し、成功した​​場合、_refs/pull/number/merge_という名前の2番目の参照を作成します。

この自動的に作成されたマージコミットはanyブランチではなく、同じプルリクエスト番号が割り当てられていることと、プルリクエスト自体から名前が明らかな参照のみであることに注意してください(headmergeに置き換えるだけです)。私は、手動でテストしていないが、このマージの最初の親は、theysamemerge、つまり、この_refs/pull/number/merge_参照を作成する舞台裏のコードは次のとおりです(または十分に近い):

_commithash=...                         # the commit ID for the pull-request
mergeinto=$(git rev-parse $branchname) # the branch we are to merge into
prnum=...                              # get next pull request number

# create the pull request itself
git update-ref refs/pull/$prnum/pull $commithash

# create the merge ref, if the merge succeeds
git checkout $mergeinto
if git merge -m "..." refs/pull/$prnum/pull; then
    # merge succeeded: create the merge ref
    git update-ref refs/pull/$prnum/merge HEAD
else
    # automatic merge failed, discard it
    git merge --abort
fi
_

(この特定のコードシーケンスはインデックスをめちゃくちゃにし、HEADを分離したままにするため、リポジトリをロックして作業後のクリーンアップを行うか、一時的な作業ツリーを使用して実行する必要があります。実際のコードシーケンスはおそらくいくつかの理由で異なります)。

したがって:

したがって、誰かが私のブランチをマスターにマージし、対応する参照を作成したと考えられます。 GitHubとTravisのどちらでしたか?

GitHubであることを考えると、 William of Ockham はTravisを呼び出す必要がないことを示唆しています。 :-)

そして他の質問、GitHubリポジトリが持っているすべての参照をリストできますか?

アクセスできる限り:

_$ git ls-remote
_

(リモートがGitHub URLであると想定)、公開されたすべての参照が表示されます。これを行うためのWebインターフェースの方法は見ていません。また、GitHub APIドキュメントの私の(軽い)閲覧でも見つけられませんでした。

16
torek

リポジトリ内のすべての参照のリストが必要な場合は、次のコマンドを実行できます。

git show-ref

これにより、<SHA> <NAME>の下にあるすべての参照の.git/refs/*が出力されます

7
cmcginty

一つの答えはgit ls-remoteについて言及しています-これは私のユースケースでは一般的に機能しますが、git thinksリモートが持っているものをリストする必要がありました-for ex。サーバーの管理者が古いリモートリポジトリをクリーンアップし、ローカルのgitクローンを使用してそれらを復元したい場合。

ls .git/refs/remotes/<name>/を使用していたすべての既知のリモート参照を一覧表示するには、場合によっては不十分であることがわかります。たとえば、git-p4リポジトリでは、リモートの参照の1つが.git/packed-refsにのみリストされていました。

git branch -rを使用しても機能しますが、出力はきれいに解析できず、目的のリモート参照をgrepする必要があります。

少し掘り下げた後、git for-each-refを使用してしまいました。

git for-each-ref --format="%(refname)" refs/remotes/<name>/

注:git show-refsは参照をリストすることもできますが、パターンは完全な参照名の末尾にアンカーされ、完全なコンポーネントのみが一致するため、必要なブランチ名がわかっている場合、またはすべての参照をリストしてそれらをgrepする場合にのみ役立ちます。ワンライナーにぴったり合うきちんとしたものが欲しかった。