Jak dołączyć nowe żądanie ściągnięcia do istniejącego problemu na github?

409

Nie jestem pewien, ale mam niejasną pamięć tworzenia żądania ściągnięcia github z „Issue 4” lub czymś w tytule, i automatycznie przyłączyło się ono do Issue 4 w projekcie, do którego go przesyłałem. Ostatnio spróbowałem ponownie i nie zadziałało - po prostu stworzyłem zupełnie nowy problem. Nie widzę żadnych opcji, takich jak „Dołącz do wydania” na nowej stronie żądania ściągnięcia, ani „Otwórz nowe żądanie ściągnięcia dla tego problemu” na stronie wydania. Czy jest jakiś sposób, aby to zrobić, aby pomóc właścicielom projektów utrzymać czystą stronę problemów i uniknąć powielania?

Edycja : Aby to wyjaśnić, wiem, że utworzenie żądania ściągania zawsze tworzy nowy problem. Chciałbym zamiast tego dołączyć żądanie ściągnięcia do istniejącego problemu.

MatrixFrog
źródło
1
Wierzę, że moja odpowiedź wyraża fakt, że żądana funkcja („dołącz żądanie ściągnięcia do istniejącego problemu”) może jeszcze nie istnieć.
VonC
Tak jest (i to faktycznie potwierdza ten tweet ), ale uświadomiłem sobie również, że moje pytanie mogło być jaśniejsze.
MatrixFrog,
Mam nadzieję, że ta funkcja znajduje się wysoko na liście priorytetów github, bo kod niesie się spodoba!
flq
2
Prawidłowa odpowiedź powinna zostać zmieniona na masukomi, teraz, gdy dostępna jest metoda „fixes # 1”. Nie trzeba przechodzić przez interfejs API.
Edward Anderson
Nadal nie mogę znaleźć sposobu, aby dołączyć żądanie ściągnięcia do istniejącego problemu. Czy coś przeoczyłem? Odpowiedzi w tym wątku sugerują, że ta funkcja istnieje, ale nie mogę jej znaleźć (zawsze powoduje to nowy problem).
Kevin Jalbert

Odpowiedzi:

245

Projekt „hub” może to zrobić:

https://github.com/defunkt/hub

W repozytorium i oddziale, z którego chcesz wysłać żądanie ściągnięcia:

$ hub pull-request -i 4

Korzysta z interfejsu API GitHub i dołącza żądanie ściągnięcia dla bieżącego oddziału do istniejącego numeru wydania 4.


EDYCJA: Komentarz @atomicules: Aby rozwinąć odpowiedź przez @MichaelMior, pełnym przykładem jest:

$ hub pull-request -i 4 -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE
Christian Oudard
źródło
12
brew install hubzainstalować z homebrew
gcamp
11
To mi nie działa. Mówi o błędzie podczas tworzenia żądania ściągania: Nieprzetworzona jednostka (HTTP 422)
Rubycut
11
@Rubycut Miałem ten sam problem. Zamiast tego zrobiłem hub pull-request URL_TO_ISSUE, to zadziałało dla mnie. Zastanawiam się, czy -i ISSUE_NUMBERdziała, tylko jeśli problem znajduje się w tym samym repozytorium (tj. Nie jest widelcem)
Michael Mior,
30
Aby rozwinąć odpowiedź autorstwa @MichaelMior, pełnym przykładem jest:hub pull-request -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE
atomicules
4
Uwaga: działa to tylko w przypadku problemów, które utworzyłeś: github.com/defunkt/hub/issues/189#issuecomment-6353354
Zach
237

Dodanie żądania ściągnięcia do istniejącego wcześniejszego problemu jest łatwe, zakładając, że rozwidlasz się przy użyciu zwykłych środków github .

Po prostu odwołaj się do problemu w komunikacie zatwierdzenia, używając dowolnego z obsługiwanych słów kluczowych :

  • blisko
  • zamyka się
  • Zamknięte
  • naprawić
  • poprawki
  • naprawiony
  • rozwiązać
  • rozwiązuje
  • zdecydowany

Na przykład: „zatwierdzenie to naprawia numer 116”

Tekst odnoszący się do problemu nie musi pojawiać się w temacie zatwierdzenia.

Wciśnij swoje zatwierdzenie do repozytorium github, a żądanie ściągnięcia zostanie automatycznie dołączone do problemu.

Uwaga: Chociaż nie jest to wymagane, zdecydowanie zaleca się zatwierdzenie wszystkiego, co będzie częścią żądania ściągania, w osobnej gałęzi specyficznej dla tego problemu, ponieważ przyszłe zatwierdzenia w tej gałęzi zostaną dołączone do żądania ściągnięcia (automatycznie przez github ). Tak więc, jeśli nie utworzyłeś osobnej gałęzi, pozostawiłeś ją na master, a następnie kontynuowałeś rozwój, wtedy wszystkie twoje niepowiązane zmiany na master zostaną dołączone do twojego żądania ściągnięcia.

masukomi
źródło
31
„zdecydowanie zaleca się zatwierdzenie wszystkiego, co będzie częścią żądania ściągania, do osobnego oddziału specyficznego dla tego problemu, ponieważ przyszłe zatwierdzenia w tej gałęzi zostaną dołączone do żądania ściągnięcia” - bardzo dobra uwaga. To mi się kiedyś zdarzyło i było to dość zaskakujące.
MatrixFrog,
9
To nie rozwiązuje problemu przekształcenia problemu w żądanie ściągnięcia. Dyskusja dotycząca tego problemu nie jest przenoszona na żądanie ściągnięcia ... co jest niefortunne dla kilku przypadków użycia. Chciałbym, żeby Github dał pewną szczegółową kontrolę nad tym, jak działają wymagania ściągania w ustawieniach repo.
Alex Waters
1
@masukomi Prośba o pobranie jest łatwiejsza dla opiekuna projektu - może zaakceptować i scalić zmiany jednym kliknięciem przycisku. Aby wyciągnąć zmianę w rozwidleniu bez użycia polecenia ściągnięcia, musisz dodać rozwidlenie jako zdalny, pobrać ich zmiany i scalić je samodzielnie.
Rory O'Kane,
2
Myślę, że przegapiłeś mój punkt Rory. Jeśli utworzysz żądanie ściągnięcia i wspomnisz o tym w problemie (jak zasugerowałem), to oba są połączone i nadal możesz kliknąć przycisk, aby uzyskać zmiany.
masukomi
2
Nie pomaga to, gdy żądanie ściągania jest w toku. Nasz obieg pracy polega na tworzeniu problemów z pomysłami, a następnie pobieraniu wniosków z gałęzi funkcji po rozpoczęciu pracy nad tymi pomysłami. Zamknięcie problemu przy użyciu zatwierdzenia w żądaniu ściągnięcia oznacza, że ​​tracimy poprzednią dyskusję, która zawierała problem, który często obejmuje zaszyfrowanie jakiejkolwiek funkcji / naprawy / zmiany adresu, do której odnosi się problem. Naprawdę potrzebny jest sposób, aby od razu przekształcić problem w żądanie ściągnięcia po rozpoczęciu pracy nad problemem.
Daniel Bingham
144

Możesz utworzyć żądanie ściągnięcia z istniejącego problemu za pomocą interfejsu API żądania ściągania :

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

Spowoduje to utworzenie żądania ściągnięcia:

  • zapytaj technoweeniew projekcie faraday(https://api.github.com/repos/ technoweenie / faraday / pulls)
  • wyciągać z synchronygałęzi w smparkes„fork” („head”: „ smparkes : synchrony ”)
  • do mastergałęzi w technoweeniewidelcu („base”: „ master ”)
  • i dołącz żądanie ściągnięcia do wydania 15 („issue”: 15 )
  • z autorem żądania ściągania smparkes(--user " smparkes ")
  • zostaniesz poproszony o podanie hasła do GitHub
Rory O'Kane
źródło
1
Skopiowałem część przykładowego kodu z tego linku. Mam nadzieję, że nie masz nic przeciwko i daj mi znać, jeśli źle to przetłumaczę!
MatrixFrog,
3
Potrzebujesz również uwierzytelnienia, dodaj to do powyższego polecenia: -u „login: hasło”
morgoth
2
Chciałbym tylko dodać, że ta metoda nadal działa, ale może mieć efekt uboczny polegający na dwukrotnym wyświetleniu Twojego zatwierdzenia na stronie dyskusji, jeśli GitHub już go podjął niejawnie z numeru # w swoim komunikacie ( przykład ). Zatwierdzenie przychodzi tylko raz na oficjalne żądanie ściągnięcia.
Greg Haskins
3
Czy można to zaktualizować do interfejsu API v3? GitHub właśnie wyłączył interfejs API v2.
Michael Best
1
@rsanchezsaez Jak mówię w mojej odpowiedzi , zmień, --user "smparkes:password"aby --user "smparkes"wyświetlał się monit o podanie hasła interaktywnie.
Rory O'Kane,
10

Ta inna odpowiedź wyjaśnia, jak używać cURL ( curl) do utworzenia żądania ściągnięcia z problemu za pośrednictwem interfejsu API GitHub . Oto jak to zrobić za pomocą HTTPie ( http), która tworzy łatwiejsze do odczytania i łatwiejsze do edycji polecenie:

$ 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>

Następnie po wyświetleniu monitu wpisz hasło do GitHub.

Wyjaśniony przykład

Zalogowałeś się do GitHub przy użyciu nazwy użytkownika smparkes i hasła hunter2 . Widziałeś już repozytorium technoweenie , pomyślałeś o czymś, co powinno zostać zmienione, i zrobiłeś problem z tym repozytorium, numer 15 . Później okazuje się, że nikt inny nie dokonał Twojej proponowanej zmiany, a Ty również masz czas, aby to zrobić samodzielnie. Ty widelec Faraday do własnego konta , a następnie zapisać zmiany i wcisnąć je do widelca pod oddział o nazwie synchronizacji . Myślisz, że technoweenie powinno pociągnąć te zmiany do mistrzagałąź jego repozytorium. Oto polecenie, które napiszesz, aby przekonwertować poprzedni problem na żądanie ściągnięcia w tej sytuacji:

$ 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

Teraz numer 15 to żądanie ściągnięcia.

Rory O'Kane
źródło
3

jeśli używasz uwierzytelniania 2-czynnikowego z github, musisz podać authtoken jako nagłówek w żądaniu:

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
źródło
1
Tak, 2FA uniemożliwia działanie wielu odpowiedzi tutaj. W moim przypadku utworzyłem osobisty token dostępu i używam go zamiast hasła, co działa.
berto
1

Możesz także użyć Guba, aby przesłać prośby o ściągnięcie swojego problemu.

Pomaga również w użyciu właściwego stylu prośby o widelec / pociągnięcie.

Edycja: 10/5/2013

Aby Gub przesłał żądanie ściągnięcia dla problemu nr 123, musisz uruchomić następujące czynności:

$ gub start 123

Spowoduje to utworzenie nowego oddziału numer 123. Po zakończeniu pracy nad problemem wykonaj:

$ gub finish

Voila!

Uwaga: Jestem autorem klejnotu Gub.

Omar Ali
źródło
1

Zamiast robić to po stronie klienta (z hub, jak w odpowiedzi Christiana Oudarda ), teraz (luty 2020) możesz to zrobić po stronie serwera (github.com)

Zobacz „ Wyświetlanie i łączenie problemów oraz pobieranie żądań z paska bocznego

Możesz teraz łączyć problemy i pobierać żądania za pomocą paska bocznego na odpowiednich stronach. Nawiązane tutaj połączenia automatycznie zamkną problemy po scaleniu połączonego żądania ściągnięcia.

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

I jest interfejs API wyszukiwania z tą funkcją.

Znajdź wszystkie otwarte problemy w repozytorium, które zawierają odwołania do zamykających żądań ściągania za pomocą linked:prkwalifikatora wyszukiwania.
Podobnie zlokalizuj wszystkie żądania ściągania w repozytorium, w których brakuje problemu z obsługą -linked:issue.

VonC
źródło
0

Korzystając z narzędzia git-hub , możesz to zrobić za pomocą:

$> git hub pull attach 123

To przekształciłoby problem nr 123 w żądanie ściągnięcia nr 123, utrzymując w ten sposób całą dyskusję na temat problemu w jednym miejscu.

Gautam
źródło
0

Jeśli masz włączone 2FA, możesz użyć tokena z HTTPie:

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

Dzięki temu oddział issue_2przekształci problem nr 2 w żądanie ściągnięcia.

Kyle Gibson
źródło