Wie hängt man eine neue Pull-Anfrage an ein bestehendes Problem auf Github an?

409

Ich bin mir nicht sicher, aber ich habe eine vage Erinnerung daran, wie ich eine Github-Pull-Anfrage mit "Issue 4" oder etwas im Titel erstellt habe, und sie hat sich automatisch an Issue 4 in dem Projekt angehängt, an das ich sie gesendet habe. Ich habe es kürzlich erneut versucht und es hat nicht funktioniert - es wurde stattdessen nur eine brandneue Ausgabe erstellt. Auf der neuen Pull-Anforderungsseite werden keine Optionen wie "An Problem anhängen" oder "Neue Pull-Anforderung für dieses Problem öffnen" auf der Ausgabeseite angezeigt. Gibt es eine Möglichkeit, dies zu tun, um Projektbesitzern zu helfen, ihre Problemseite sauber zu halten und Doppelarbeit zu vermeiden?

Bearbeiten : Zur Verdeutlichung weiß ich, dass das Erstellen einer Pull-Anfrage immer ein neues Problem verursacht. Ich möchte stattdessen die Pull-Anfrage an ein bestehendes Problem anhängen .

MatrixFrog
quelle
1
Ich glaube, meine Antwort drückt die Tatsache aus, dass die gewünschte Funktion ("Pull-Anfrage an ein vorhandenes Problem anhängen ") möglicherweise noch nicht vorhanden ist.
VonC
Es tut es (und das wird tatsächlich durch diesen Tweet bestätigt ), aber es hat mir auch klar gemacht, dass meine Frage klarer hätte sein können.
MatrixFrog
Ich hoffe, dass dieses Feature ganz oben auf der Github-Prioritätenliste steht, denn der Code, den es gibt, würde es lieben!
flq
2
Die richtige Antwort sollte in masukomis geändert werden, da die Methode "Fixes # 1" verfügbar ist. Sie müssen die API nicht durchlaufen.
Edward Anderson
Ich kann immer noch keine Möglichkeit finden, eine Pull-Anfrage an ein vorhandenes Problem anzuhängen. Habe ich etwas verpasst Die Antworten in diesem Thread scheinen darauf hinzudeuten, dass diese Funktion vorhanden ist, aber ich kann sie nicht finden (es entsteht immer ein neues Problem).
Kevin Jalbert

Antworten:

245

Das "Hub" -Projekt kann dies tun:

https://github.com/defunkt/hub

In dem Repository und dem Zweig, von dem Sie eine Pull-Anfrage senden möchten:

$ hub pull-request -i 4

Dies verwendet die GitHub-API und fügt der vorhandenen Problemnummer 4 eine Pull-Anforderung für den aktuellen Zweig hinzu.


EDIT: Kommentar von @atomicules: Um die Antwort von @MichaelMior zu erweitern, ist ein vollständiges Beispiel:

$ hub pull-request -i 4 -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE
Christian Oudard
quelle
12
brew install hubmit homebrew zu installieren
gcamp
11
Das funktioniert bei mir nicht. Sagt Fehler beim Erstellen der Pull-Anfrage: Nicht verarbeitbare Entität (HTTP 422)
Rubycut
11
@ Rubycut Ich hatte das gleiche Problem. Stattdessen habe ich es getan hub pull-request URL_TO_ISSUE, dann hat es bei mir funktioniert. Ich frage mich, ob es -i ISSUE_NUMBERnur funktioniert, wenn sich das Problem im selben Repository befindet (dh nicht in einer Gabelung)
Michael Mior
30
Um die Antwort von @MichaelMior zu erweitern, ist ein vollständiges Beispiel:hub pull-request -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE
Atomicules
4
Beachten Sie, dass dies nur bei Problemen funktioniert, die Sie erstellt haben: github.com/defunkt/hub/issues/189#issuecomment-6353354
Zach
237

Das Hinzufügen einer Pull-Anforderung zu einem vorhandenen Upstream-Problem ist einfach, vorausgesetzt, Sie haben mit den normalen Github-Mitteln gegabelt .

Verweisen Sie einfach mit einem der unterstützten Schlüsselwörter auf das Problem in Ihrer Commit-Nachricht :

  • schließen
  • schließt
  • geschlossen
  • Fix
  • behebt
  • Fest
  • Entschlossenheit
  • löst
  • aufgelöst

Zum Beispiel: "Dieses Commit behebt # 116"

Der Text, der auf das Problem verweist, muss nicht in der Betreffzeile Ihres Commits erscheinen.

Wenn Sie Ihr Commit an Ihr Github-Repo senden, wird die Pull-Anforderung automatisch an das Problem angehängt.

Hinweis: Obwohl dies nicht erforderlich ist, wird dringend empfohlen, dass Sie alles, was Teil einer Pull-Anforderung ist, an einen separaten Zweig festschreiben, der für dieses Problem spezifisch ist, da zukünftige Festschreibungen für diesen Zweig an die Pull-Anforderung angehängt werden (automatisch von github) ). Wenn Sie also keinen separaten Zweig erstellt, ihn auf dem Master belassen und dann weiterentwickelt haben, werden alle Ihre nicht verwandten Commits an den Master an Ihre Pull-Anforderung angehängt.

masukomi
quelle
31
"Es wird dringend empfohlen, dass Sie alles, was Teil einer Pull-Anforderung ist, an einen separaten Zweig festschreiben, der für dieses Problem spezifisch ist, da zukünftige Festschreibungen für diesen Zweig an die Pull-Anforderung angehängt werden" - ein sehr guter Punkt. Das ist mir einmal passiert und es war ziemlich überraschend.
MatrixFrog
9
Dies löst leider nicht das Problem, ein Problem in eine Pull-Anfrage umzuwandeln. Jede Diskussion, die in der Ausgabe geführt wurde, wird nicht auf die Pull-Anforderung übertragen ... was für mehrere Anwendungsfälle unglücklich ist. Ich wünschte, Github würde nur eine detaillierte Kontrolle darüber geben, wie Pull-Reqs in den Repo-Einstellungen funktionieren.
Alex Waters
1
@masukomi Eine Pull-Anfrage ist für den Projektbetreuer einfacher zu lösen - er kann die Änderungen per Knopfdruck akzeptieren und zusammenführen. Um eine Änderung in einer Gabelung ohne Verwendung einer Pull-Anforderung zu ziehen, müssten Sie die Gabelung als Fernbedienung hinzufügen, ihre Änderungen abrufen und sie selbst zusammenführen.
Rory O'Kane
2
Ich denke, du hast meinen Standpunkt verfehlt, Rory. Wenn Sie eine Pull-Anfrage erstellen und diese in der Ausgabe erwähnen (wie von mir vorgeschlagen), sind die beiden miteinander verbunden, und Sie können weiterhin auf eine Schaltfläche klicken, um die Änderungen abzurufen.
Masukomi
2
Dies hilft nicht, wenn die Pull-Anfrage noch nicht abgeschlossen ist. Unser Workflow besteht darin, Probleme für Ideen zu erstellen und dann Anforderungen aus Feature-Zweigen abzurufen, sobald wir mit der Arbeit an diesen Ideen beginnen. Das Schließen des Problems mithilfe eines Commits in der Pull-Anforderung bedeutet, dass wir die vorherige Diskussion verlieren, die das Problem enthielt. Dazu gehört häufig das Herausfiltern der Funktionen / Korrekturen / Refaktoren, mit denen sich das Problem befasst. Was wirklich benötigt wird, ist eine Möglichkeit, ein Problem direkt in eine Pull-Anfrage umzuwandeln, sobald die Arbeit an dem Problem begonnen hat.
Daniel Bingham
144

Sie können eine Pull-Anforderung aus einem vorhandenen Problem mit der Pull-Anforderungs-API erstellen :

$ curl --user "smparkes" \
       --request POST \
       --data '{"issue": 15, "head": "smparkes:synchrony", "base": "master"}' \
       https://api.github.com/repos/technoweenie/faraday/pulls

Dies erzeugt eine Pull-Anfrage:

  • fragen technoweeniebei Projekt faraday(https://api.github.com/repos/ technoweenie / faraday / Pulls)
  • aus dem synchronyAst in smparkes'Gabel ziehen ("head": " smparkes : synchrony ")
  • zum masterZweig in technoweenieder Gabel ("base": " master ")
  • und hängen Sie die Pull-Anfrage an Ausgabe 15 an ("Ausgabe": 15 )
  • mit dem Pull Request Autor smparkes(--user " smparkes ")
  • Sie werden aufgefordert, Ihr GitHub-Passwort einzugeben
Rory O'Kane
quelle
1
Ich habe einen Teil des Beispielcodes von diesem Link kopiert. Ich hoffe, es macht Ihnen nichts aus, und bitte lassen Sie mich wissen, wenn ich es falsch übersetzt habe!
MatrixFrog
3
Sie benötigen auch eine Authentifizierung. Fügen Sie diese zum obigen Befehl hinzu: -u "login: password"
morgoth
2
Ich möchte nur hinzufügen, dass diese Methode immer noch funktioniert, aber sie kann den Nebeneffekt haben, dass Ihr Commit zweimal auf der Diskussionsseite aufgeführt wird, wenn GitHub es bereits implizit aus dem Problem # in seiner Nachricht ( Beispiel ) übernommen hat. Das Commit kommt jedoch nur einmal auf die offizielle Pull-Anfrage durch.
Greg Haskins
3
Kann dies auf die v3-API aktualisiert werden? GitHub hat gerade die v2-API deaktiviert.
Michael Best
1
@rsanchezsaez Wie ich in meiner Antwort sage , ändern Sie --user "smparkes:password"sich --user "smparkes", um interaktiv zur Eingabe Ihres Passworts aufgefordert zu werden.
Rory O'Kane
10

In dieser anderen Antwort wird erläutert, wie Sie mit cURL ( curl) eine Pull-Anforderung aus einem Problem über die GitHub-API erstellen . So geht's mit HTTPie ( http), das einen leichter lesbaren und leichter zu bearbeitenden Befehl erzeugt:

$ http --auth "<your-GitHub-username>" \
       POST \
       https://api.github.com/repos/<issue-repo-owner>/<issue-repo-name>/pulls \
       issue=<issue-number> head=<your-GitHub-username>:<your-fork-branch-name> base=<issue-repo-branch-name>

Geben Sie dann Ihr GitHub-Passwort ein, wenn Sie dazu aufgefordert werden.

Erklärtes Beispiel

Sie haben sich mit dem Benutzernamen smparkes und dem Passwort hunter2 bei GitHub angemeldet . Sie haben Technoweenies Repo Faraday gesehen , sich etwas überlegt, das geändert werden sollte, und eine Ausgabe für dieses Repo dafür gemacht, Ausgabe Nr. 15 . Später stellen Sie fest, dass niemand anders Ihre vorgeschlagene Änderung vorgenommen hat, und Sie haben auch etwas Zeit, dies selbst zu tun. Sie teilen Faraday auf Ihr eigenes Konto auf , schreiben dann Ihre Änderungen und schieben sie unter einem Zweig namens Synchrony auf Ihren Fork . Sie denken, technoweenie sollte diese Änderungen auf den Master übertragenZweig seines Repos. Dies ist der Befehl, den Sie schreiben würden, um Ihre vorherige Ausgabe in eine Pull-Anforderung für diese Situation umzuwandeln:

$ http --auth "smparkes" \
       POST \
       https://api.github.com/repos/technoweenie/faraday/pulls \
       issue=15 head=smparkes:synchrony base=master
http: password for [email protected]: hunter2

Jetzt ist Ausgabe Nr. 15 eine Pull-Anfrage.

Rory O'Kane
quelle
3

Wenn Sie 2-Faktor-Authentifizierung mit Github verwenden, müssen Sie das Authtoken als Header in der Anforderung angeben:

curl -u "<your_username>:<your_pw>" \
     --header 'X-GitHub-OTP: <your_authtoken>' \
     --request POST \
     --data '{"issue":"<issue_nr>", "head":"<your_username>:<your_forks_branchname>", "base":"<upstream_branch>"}' \
     https://api.github.com/repos/<upstream_user>/<upstream_repo>/pulls
Jörn Hees
quelle
1
Ja, 2FA verhindert, dass viele der Antworten hier funktionieren. In meinem Fall habe ich ein persönliches Zugriffstoken erstellt und es anstelle meines Passworts verwendet, was funktioniert.
Berto
1

Sie können Gub auch verwenden , um Pull-Anfragen für Ihr Problem zu senden.

Es hilft Ihnen auch dabei, einen geeigneten Gabel- / Zuganforderungsstil zu verwenden.

Bearbeiten: 05.10.2013

Damit Gub eine Pull-Anfrage für Problem Nr. 123 sendet, müssen Sie Folgendes ausführen:

$ gub start 123

Dadurch wird ein neues Zweigproblem-123 erstellt. Wenn Sie mit der Bearbeitung des Problems fertig sind, führen Sie Folgendes aus:

$ gub finish

Voila!

Hinweis: Ich bin der Autor von Gub Gem.

Omar Ali
quelle
1

Anstatt dies auf der Clientseite zu tun (mit hub, wie in der Antwort von Christian Oudard ), können Sie dies jetzt (Februar 2020) auf der Serverseite tun (github.com).

Siehe " Probleme anzeigen und verknüpfen und Anforderungen aus der Seitenleiste abrufen ".

Sie können jetzt Probleme verknüpfen und Anfragen über die Seitenleiste auf den jeweiligen Seiten abrufen. Hier hergestellte Verbindungen schließen Probleme automatisch, sobald eine verknüpfte Pull-Anforderung zusammengeführt wird.

Dokumentation :https://help.github.com/assets/images/help/pull_requests/link-issue-drop-down.png

Und es gibt eine Such-API mit dieser Funktion.

Suchen Sie mit dem Suchqualifizierer alle offenen Probleme in einem Repository, die schließende Pull-Anforderungsreferenzen enthalten linked:pr.
Suchen Sie in ähnlicher Weise alle Pull-Anforderungen in einem Repository, bei denen ein unterstützendes Problem fehlt -linked:issue.

VonC
quelle
0

Mit dem Git-Hub- Tool können Sie dies tun mit:

$> git hub pull attach 123

Dies würde das Problem Nr. 123 in die Pull-Anforderung Nr. 123 konvertieren und somit alle Diskussionen über das Problem an einem einzigen Ort aufrechterhalten.

Gautam
quelle
0

Wenn Sie 2FA aktiviert haben, können Sie das Token mit HTTPie übergeben:

http POST \
    https://api.github.com/repos/<repo-owner>/<repo-name>/pulls \
    issue=2 head=issue_2 base=master
    "Authorization:token PUTAUTHTOKENHERE"

Dadurch wird der Zweig verwendet issue_2, um Problem Nr. 2 in eine Pull-Anforderung umzuwandeln.

Kyle Gibson
quelle