Wie liste ich alle Remote-Referenzen auf?

Lesezeit: 4 Minuten

Kürzlich habe ich eine erstellt PR auf GitHub, aber einige Tests schlugen fehl. Und vor Ort sind noch mehr Tests nicht gegangen. Also habe ich versucht herauszufinden, woran es liegt.

Und was ich herausgefunden habe, ist, dass Travis das Repo getestet hat andere Verpflichtung Ich habe nicht. Die Referenz ist refs/pull/81/merge. Also hat jemand angeblich meinen Zweig mit dem Master zusammengeführt und die entsprechende Referenz erstellt. War es GitHub oder Travis?

Und die andere Frage, kann ich alle Refs auflisten, die GitHub Repo hat?

Wenn Sie nur eine Liste aller Refs in Ihrem Repo haben möchten, können Sie Folgendes ausführen:

git show-ref

Dies druckt die <SHA> <NAME> von jedem ref unter .git/refs/*

  • Nicht alle Schiedsrichter sind dabei .git/refs/* – Einige können dabei sein .git/packed-refs

    – Thomas Guyot-Sionnest

    26. September 2019 um 23:38 Uhr

  • Das ist nicht das, wonach OP gefragt hat – sie haben nach Referenzen auf der Fernbedienung gefragt; nicht im lokalen Repository.

    – ryanwebjackson

    8. Mai 2020 um 12:29 Uhr

Ich weiß nichts über Travis selbst, aber GitHub erstellt diese tatsächlich refs/pull/number/merge Refs. Insbesondere, basierend auf Beobachtungen – die Dokumentation scheint etwas dürftig zu sein und ich bin nur ein eher gelegentlicher Benutzer von GitHub – wenn Sie in GitHub auf „neue Pull-Anfrage“ klicken, GitHub:

  • erstellt eine Referenz mit dem Namen refs/pull/number/head um die ID des Commit zu speichern, das Sie jemand anderen bitten, für Sie zusammenzuführen;
  • versucht, ein automatisches Merge-and-Commit durchzuführen (mithilfe von git merge), und wenn das gelingterstellt eine zweite Referenz mit dem Namen refs/pull/number/merge.

Beachten Sie, dass dieser automatisch erstellte Merge-Commit nicht aktiviert ist irgendein Branch, ihm ist lediglich dieselbe Pull-Request-Nummer zugewiesen und eine Referenz, deren Name aus dem Pull-Request selbst ersichtlich ist (einfach ersetzen head mit merge). Ich glaube – aber ich habe es nicht manuell getestet – dass der erste Elternteil dieser Zusammenführung der Tipp-Commit des Zweigs ist, für den Sie jemanden anfordern, wann er „angeschaltet“ sein soll sie mach das gleich merge, dh der Code hinter den Kulissen, der dies erstellt refs/pull/number/merge Referenz ist (oder nahe genug dran ist):

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

(Diese spezielle Codesequenz spielt mit dem Index herum und geht HEAD getrennt, also muss es mit gesperrtem Repository und einer Bereinigung nach der Arbeit oder mit einem temporären Arbeitsbaum erfolgen; die tatsächliche Codesequenz ist wahrscheinlich aus einer Reihe von Gründen anders).

Somit:

Also hat jemand angeblich meinen Zweig mit dem Master zusammengeführt und die entsprechende Referenz erstellt. War es GitHub oder Travis?

Da GitHub Wille, Wilhelm von Ockham würde vorschlagen, dass es nicht notwendig ist, Travis anzurufen. 🙂

Und die andere Frage, kann ich alle Refs auflisten, die GitHub Repo hat?

Solange Sie Zugriff haben:

$ git ls-remote

(vorausgesetzt, die Fernbedienung ist eine GitHub-URL) zeigt alle exponierten Referenzen an. Ich habe dazu weder eine Möglichkeit für eine Webschnittstelle gesehen, noch eine in meiner (leichten) Lektüre der GitHub-API-Dokumentation gefunden.

  • Aha, git ls-remote muss entweder aus dem Remote-Repo ausgeführt werden oder man kann verwenden git ls-remote REMOTE_NAME aus dem gegabelten Repository.

    – x-yuri

    11. März 2017 um 17:19 Uhr

  • @x-yuri: genauer gesagt, git ls-rmote sucht nach den aktuellen Zweigen remote Einstellung, es sei denn, Sie geben ihm ein Argument. Das Argument kann der Name einer Fernbedienung sein (wie z origin oder upstream), in welchem ​​Fall git ls-remote sucht die URL daraus oder kann eine URL sein. Sobald Git die URL hat, ruft es den ersten Teil des Üblichen auf git fetch Vorgang, der eine Liste aller öffentlichen Referenzen von dem anderen Git anfordert.

    – Torek

    12. März 2017 um 2:32 Uhr

Eine Antwort erwähnt git ls-remote – Während dies für meinen Anwendungsfall im Allgemeinen funktioniert, musste ich auflisten, welcher Git denkt die fernbedienung hat – zb. wenn der Administrator des Servers meine veralteten Remote-Repositories bereinigt und ich sie mit meinen lokalen Git-Klonen wiederherstellen möchte.

Um alle bekannten Remote-Referenzen aufzulisten, die ich verwendet habe ls .git/refs/remotes/<name>/ – stellt sich heraus, dass es in manchen Fällen nicht ausreicht, z. B. bei a git-p4 Repository, in dem nur eine der Referenzen meiner Fernbedienung aufgeführt war .git/packed-refs.

Verwenden git branch -r würde funktionieren, aber die Ausgabe ist nicht sauber parsbar und erfordert das Auslesen der gewünschten Remote-Refs.

Nach ein bisschen Graben habe ich es schließlich verwendet git for-each-ref:

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

Hinweis: git show-refs kann auch Refs auflisten, aber das Muster ist am Ende des vollständigen Ref-Namens verankert und es werden nur vollständige Komponenten abgeglichen. Daher ist es nur nützlich, wenn Sie wissen, welchen Zweignamen Sie möchten, oder alle Refs auflisten und grep. Ich wollte etwas Ordentliches, das gut in einen Einzeiler passt.

1181300cookie-checkWie liste ich alle Remote-Referenzen auf?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy