Làm thế nào để bạn đính kèm một yêu cầu kéo mới vào một vấn đề hiện có trên github?


409

Tôi không chắc chắn, nhưng tôi có một trí nhớ mơ hồ về việc tạo một yêu cầu kéo github với "Vấn đề 4" hoặc một cái gì đó trong tiêu đề và nó tự động đính kèm với Vấn đề 4 trong dự án mà tôi đã gửi nó. Tôi đã thử lại gần đây và nó không hoạt động - thay vào đó nó chỉ tạo ra một vấn đề hoàn toàn mới. Tôi không thấy bất kỳ tùy chọn nào như "Đính kèm vấn đề" trên trang yêu cầu kéo mới, cũng như "Mở yêu cầu kéo mới cho vấn đề này" trên trang vấn đề. Có cách nào để làm điều này không, để giúp chủ dự án giữ sạch trang Vấn đề của họ và tránh trùng lặp?

Chỉnh sửa : Để làm rõ, tôi biết rằng việc tạo một yêu cầu kéo luôn tạo ra một vấn đề mới . Thay vào đó, tôi muốn đính kèm yêu cầu kéo vào một vấn đề hiện có .


1
Tôi tin rằng câu trả lời của tôi thể hiện sự thật rằng tính năng bạn muốn ("đính kèm yêu cầu kéo vào một vấn đề hiện có ") có thể chưa có.
VonC

Nó thực sự (và điều đó thực tế đã được xác nhận bởi tweet này ), nhưng nó cũng khiến tôi nhận ra câu hỏi của mình có thể đã rõ ràng hơn.
MatrixFrog

Tôi hy vọng tính năng này cao trong danh sách ưu tiên của github, vì mã này sẽ được yêu thích!
flq

2
Câu trả lời đúng phải được đổi thành masukomi, giờ đây phương pháp "sửa lỗi số 1" đã có sẵn. Không cần thông qua API.
Edward Anderson

Tôi vẫn không thể tìm cách đính kèm yêu cầu kéo vào một vấn đề hiện có. Tôi đã bỏ lỡ một cái gì đó? Các câu trả lời trong chủ đề này dường như cho thấy khả năng này không tồn tại, nhưng tôi không thể tìm thấy nó (nó luôn tạo ra một vấn đề mới).
Kevin Jalbert

Câu trả lời:


245

Dự án "trung tâm" có thể làm điều này:

https://github.com/defunkt/hub

Trong kho lưu trữ và chi nhánh mà bạn muốn gửi yêu cầu kéo từ:

$ hub pull-request -i 4

Điều này sử dụng API GitHub và đính kèm yêu cầu kéo cho nhánh hiện tại với vấn đề số 4 hiện có.


EDIT: Nhận xét của @atomicules: Để mở rộng câu trả lời của @MichaelMior, một ví dụ đầy đủ là:

$ hub pull-request -i 4 -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE

12
brew install hubđể cài đặt với homebrew
gcamp

11
Điều này không làm việc cho tôi. Lỗi khi tạo yêu cầu kéo: Thực thể không thể xử lý (HTTP 422)
Rubycut

11
@Rubycut Mình cũng gặp vấn đề tương tự. Thay vào đó tôi đã làm hub pull-request URL_TO_ISSUE, sau đó nó làm việc cho tôi. Tôi tự hỏi nếu -i ISSUE_NUMBERchỉ hoạt động nếu vấn đề nằm trong cùng một kho lưu trữ (nghĩa là không phải là một ngã ba)
Michael Mior

30
Để mở rộng câu trả lời của @MichaelMior, một ví dụ đầy đủ là:hub pull-request -b USERNAME_OF_UPSTREAM_OWNER:UPSTREAM_BRANCH -h YOUR_USERNAME:YOUR_BRANCH URL_TO_ISSUE
nguyên tử

4
Lưu ý điều này chỉ hoạt động đối với các sự cố bạn đã tạo: github.com/defunkt/hub/issues/189#issuecomment-6353354
Zach

237

Thêm một yêu cầu kéo vào một vấn đề ngược dòng hiện có dễ dàng giả sử bạn đã rẽ nhánh bằng cách sử dụng phương tiện github bình thường .

Chỉ cần tham khảo vấn đề trong thông điệp cam kết của bạn bằng bất kỳ từ khóa được hỗ trợ nào :

  • đóng
  • đóng cửa
  • đóng cửa
  • sửa chữa
  • sửa lỗi
  • đã sửa
  • giải quyết
  • giải quyết
  • đã giải quyết

Ví dụ: "cam kết này sửa lỗi # 116"

Văn bản đề cập đến vấn đề không cần phải xuất hiện trong dòng chủ đề của cam kết của bạn.

Đẩy cam kết của bạn vào repo github của bạn và yêu cầu kéo sẽ tự động được thêm vào vấn đề.

Lưu ý: Mặc dù không bắt buộc, nhưng chúng tôi khuyên bạn nên cam kết bất cứ điều gì sẽ là một phần của yêu cầu kéo đối với một nhánh riêng biệt cho vấn đề đó, bởi vì các cam kết trong tương lai trên nhánh đó sẽ được thêm vào yêu cầu kéo (tự động bởi github ). Vì vậy, nếu bạn không tạo một nhánh riêng, để nó thành chủ, và sau đó tiếp tục phát triển, thì tất cả các cam kết không liên quan đến chủ của bạn sẽ được thêm vào yêu cầu kéo của bạn.


31
"Chúng tôi khuyên bạn nên cam kết bất cứ điều gì sẽ là một phần của yêu cầu kéo đối với một chi nhánh riêng biệt cho vấn đề đó, bởi vì các cam kết trong tương lai trên chi nhánh đó sẽ được thêm vào yêu cầu kéo" - điểm rất tốt. Điều đó đã xảy ra với tôi một lần và nó khá ngạc nhiên.
MatrixFrog

9
Điều này không giải quyết vấn đề biến một vấn đề thành một yêu cầu kéo không may. Bất kỳ cuộc thảo luận nào có vấn đề không được chuyển sang yêu cầu kéo ... thật không may cho một số trường hợp sử dụng. Tôi ước Github sẽ cung cấp một số điều khiển chi tiết về cách pull-reqs hoạt động trong cài đặt repo.
Alex Waters

1
@masukomi Yêu cầu kéo dễ dàng hơn cho người duy trì dự án giải quyết - họ có thể chấp nhận và hợp nhất các thay đổi chỉ bằng một nút bấm. Để kéo thay đổi trong một ngã ba mà không sử dụng yêu cầu kéo, bạn sẽ phải thêm ngã ba làm điều khiển từ xa, tìm nạp các thay đổi của chúng và tự hợp nhất chúng.
Rory O'Kane

2
Tôi nghĩ rằng bạn đã bỏ lỡ quan điểm của tôi Rory. Nếu bạn tạo một yêu cầu kéo và đề cập đến nó trong vấn đề (như tôi đã đề xuất), thì hai cái đó được kết nối và bạn vẫn có thể nhấp vào nút để nhận các thay đổi.
masukomi

2
Điều này không có ích khi yêu cầu kéo là một điều đang diễn ra. Quy trình công việc của chúng tôi là tạo ra các vấn đề cho các ý tưởng và sau đó lấy các yêu cầu từ các nhánh tính năng một khi chúng tôi bắt đầu thực hiện các ý tưởng đó. Đóng vấn đề bằng cách sử dụng một cam kết trong yêu cầu kéo có nghĩa là chúng ta mất đi cuộc thảo luận trước đó về vấn đề đó, thường bao gồm việc băm ra bất kỳ tính năng / sửa chữa / cấu trúc lại địa chỉ vấn đề nào. Điều thực sự cần thiết là một cách để giải quyết vấn đề thành yêu cầu kéo khi công việc về vấn đề đã bắt đầu.
Daniel Bingham

144

Bạn có thể tạo Yêu cầu kéo từ một vấn đề hiện có với API yêu cầu kéo :

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

Điều này tạo ra một yêu cầu kéo:

  • hỏi technoweenietại dự án faraday(https://api.github.com/repose/ technoweenie / faraday / pulls)
  • để kéo từ synchronynhánh trong smparkes'ngã ba ("đầu": " smparkes : đồng bộ ")
  • đến masternhánh trong technoweeniengã ba ("cơ sở": " chính ")
  • và đính kèm yêu cầu kéo để phát hành 15 ("vấn đề": 15 )
  • với tác giả yêu cầu kéo smparkes(--user " smparkes ")
  • bạn sẽ được nhắc nhập mật khẩu GitHub của bạn

1
Tôi đã sao chép trong một số mã mẫu từ liên kết đó. Hy vọng bạn không phiền, và xin vui lòng cho tôi biết nếu tôi dịch sai nó!
MatrixFrog

3
Bạn cũng cần xác thực, thêm lệnh này vào lệnh trên: -u "đăng nhập: mật khẩu"
morgoth

2
Tôi chỉ muốn nói thêm rằng phương thức này vẫn hoạt động, nhưng nó có thể có tác dụng phụ là liệt kê cam kết của bạn hai lần trên trang thảo luận, nếu GitHub đã chọn nó một cách ngầm định từ vấn đề # trong thông điệp của nó ( ví dụ ). Tuy nhiên, cam kết chỉ đến một lần theo yêu cầu kéo chính thức.
Greg Haskins

3
Điều này có thể được cập nhật lên API v3 không? GitHub vừa tắt API v2.
Michael hay nhất

1
@rsanchezsaez Như tôi đã nói trong câu trả lời của tôi , thay đổi --user "smparkes:password"để --user "smparkes"được nhắc nhập mật khẩu của bạn một cách tương tác.
Rory O'Kane


10

Câu trả lời khác này giải thích cách sử dụng cURL ( curl) để tạo Yêu cầu kéo từ một vấn đề thông qua API GitHub . Đây là cách thực hiện bằng HTTPie ( http), tạo ra lệnh dễ đọc hơn và dễ chỉnh sửa hơn:

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

Sau đó nhập mật khẩu GitHub của bạn khi được nhắc.

Ví dụ giải thích

Bạn đã đăng nhập vào GitHub với tên người dùng smparkes và mật khẩu hunter2 . Bạn thấy technoweenie ‘s repo faraday , nghĩ đến cái gì đó nên được thay đổi, và làm cho một vấn đề trên repo mà cho nó, Issue # 15 . Sau đó, bạn thấy rằng không có ai khác thực hiện thay đổi được đề xuất của bạn và bạn cũng có thời gian để tự thực hiện. Bạn ngã ba faraday vào tài khoản riêng của bạn , sau đó ghi các thay đổi của bạn và đẩy họ đến bàn ăn của bạn dưới một chi nhánh tên là đồng bộ . Bạn nghĩ rằng Technoweenie nên kéo những thay đổi đó đến chủchi nhánh repo của mình. Đây là lệnh bạn sẽ viết để chuyển vấn đề trước đó thành Yêu cầu kéo cho tình huống này:

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

Bây giờ Vấn đề # 15 là Yêu cầu Kéo.


3

trong trường hợp bạn sử dụng 2 yếu tố xác thực với github, bạn sẽ cần cung cấp tiêu đề tự động dưới dạng tiêu đề trong yêu cầu:

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

1
Có, 2FA ngăn không cho nhiều câu trả lời ở đây hoạt động. Trong trường hợp của tôi, tôi đã tạo mã thông báo truy cập cá nhân và sử dụng nó chứ không phải mật khẩu của tôi, hoạt động.
berto

1

Bạn cũng có thể sử dụng Gub để gửi yêu cầu kéo cho vấn đề của mình.

Nó cũng giúp bạn sử dụng một phong cách yêu cầu ngã ba / kéo thích hợp.

Chỉnh sửa: 10/5/2013

Để yêu cầu Gub gửi yêu cầu kéo cho vấn đề # 123, bạn cần chạy như sau:

$ gub start 123

Điều này sẽ tạo ra một vấn đề chi nhánh mới - 123. Khi bạn đã xử lý xong vấn đề, hãy thực hiện:

$ gub finish

Voila!

Lưu ý: Tôi là tác giả của đá quý Gub.


1

Thay vì làm điều đó trên các mặt hàng (với hub, như trong Kitô giáo Oudard câu trả lời ), bạn bây giờ (tháng 2 năm 2020) có thể làm điều đó trên máy chủ bên (github.com)

Xem " Xem và liên kết các vấn đề và kéo yêu cầu từ thanh bên "

Bây giờ bạn có thể liên kết các vấn đề và kéo các yêu cầu thông qua thanh bên trong các trang tương ứng của chúng. Các kết nối được thực hiện ở đây sẽ tự động đóng các vấn đề sau khi yêu cầu kéo được liên kết được hợp nhất.

Tài liệu :https://help.github.com/assets/images/help/pull_Vquests/link-su-drop-down.png

Và có một API tìm kiếm với tính năng đó.

Tìm tất cả các vấn đề mở trong kho lưu trữ có đóng yêu cầu tham chiếu với linked:prvòng loại tìm kiếm.
Tương tự, xác định tất cả các yêu cầu kéo trong kho lưu trữ thiếu vấn đề hỗ trợ -linked:issue.


0

Sử dụng công cụ git-hub , bạn có thể làm điều này với:

$> git hub pull attach 123

Điều này sẽ chuyển vấn đề # 123 thành yêu cầu kéo # 123, do đó duy trì tất cả các cuộc thảo luận về vấn đề ở một vị trí.


0

Nếu bạn đã bật 2FA, bạn có thể sử dụng chuyển mã thông báo với HTTPie:

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

Điều này sẽ sử dụng chi nhánh issue_2để chuyển vấn đề # 2 thành yêu cầu kéo.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.