GitHub nhân bản từ yêu cầu kéo?


128

Tôi muốn sao chép một kho lưu trữ từ GitHub. Vấn đề là tôi không muốn chi nhánh chính; Tôi muốn phiên bản trong yêu cầu kéo không được chấp thuận này .

Tôi có thể sao chép phiên bản yêu cầu kéo thay vì kho lưu trữ chính không?


2
Nếu bạn đến đây không cho clonenhưng đối với fetchsee: stackoverflow.com/questions/6743514/...
Ciro Santilli郝海东冠状病六四事件法轮功

Câu trả lời:


87

Bạn có thể sao chép nhánh bạn muốn bằng cách sử dụng -btùy chọn và cho yêu cầu kéo:

git clone https://github.com/user_name/repo_name.git -b feature/pull_request_name dir_name

Trong trường hợp của bạn, nhánh bạn muốn sao chép là nhánh nguồn của yêu cầu kéo ( feature/mongoose-support):

git clone https://github.com/berstend/frappe.git -b feature/mongoose-support ./mongoose-support

112

Cách dễ nhất để làm điều đó là như thế này:

git fetch origin pull/2/head
git checkout -b pullrequest FETCH_HEAD

Bây giờ bạn sẽ ở trên một nhánh mới ở trạng thái yêu cầu kéo.

Bạn có thể muốn thiết lập bí danh bằng cách chạy

git config --global alias.pro '!f() { git fetch -fu ${2:-origin} refs/pull/$1/head:pr/$1 && git checkout pr/$1; }; f'

Bây giờ bạn có thể kiểm tra bất kỳ PR nào bằng cách chạy git pr <pr_number>hoặc git pr <pr_number> <remote>nếu điều khiển từ xa github của bạn không được đặt tên origin.


49
Tốt hơn: git fetch origin pull/<#>/head:<local_branch_name>( thông qua )
schlamar

5
Tôi thấy mình thường xuyên tham khảo câu trả lời SO này, vì vậy tôi đã dán nó vào .gitconfigtập tin của mình dưới [alias]: pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f". Bằng cách đó tôi chỉ cần gõ git pr upstream 62và điều tiếp theo tôi biết, tôi đang ở một nhánh mới của PR # 62 từ thượng nguồn! Nếu bạn luôn sử dụng, originbạn có thể mã hóa nó thay vì $1, nhưng điều đó sẽ giúp tôi.
matt ---

@matt giả sử bạn có bí danh để thanh toán có tênco
Michael McQuade

43
git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH

ví dụ:

$ git fetch origin pull/611/head:pull_611
$ git checkout pull_611

Thực hiện thay đổi, cam kết chúng, PUSH và mở PR mới từ ngã ba của bạn trên GitHub


Làm thế nào tôi có thể hợp nhất chi nhánh này tại địa phương? tôi chỉ nhân bản và lấy một yêu cầu kéo không được trộn lẫn như trên bạn đã làm. Và đã thử kiểm tra tên nhánh. Nhưng không có thay đổi nào xuất hiện trong trình soạn thảo IDE / văn bản của tôi.
erginduran

17

Bạn có thể làm theo hướng dẫn trong ý chính này để có thể kiểm tra từ xa trực tiếp mà không cần phải tìm ra kho lưu trữ và chi nhánh của họ.

Ví dụ sử dụng

Đối với một trong những dự án của tôi (github3.py) tôi có những điều sau đây trong github3.py/.git/config

[remote "github"]
    fetch = +refs/heads/*:refs/remotes/github/*
    fetch = +refs/pull/*/head:refs/remotes/github/pr/*
    url = git@github.com:sigmavirus24/github3.py

Dòng đầu tiên là tiêu chuẩn cho mọi điều khiển từ xa với ngoại lệ githubđược thay thế bằng tên của điều khiển từ xa. Điều này có nghĩa là các đầu từ xa (hoặc các đầu của các nhánh trên máy chủ đó) được "ánh xạ" tới các điều khiển từ xa cục bộ có tiền tố github/. Vì vậy, nếu tôi đã làm git fetch githubvà có một chi nhánh trên GitHub chưa được chú ý cục bộ trên máy của tôi, nó sẽ tải xuống chi nhánh và tôi có thể chuyển sang chi nhánh như vậy : git checkout -t github/branch_name.

Dòng thứ hai thực hiện điều tương tự, nhưng nó thực hiện nó cho các yêu cầu kéo thay vì các nhánh git tiêu chuẩn. Đó là lý do tại sao bạn nhìn thấy refs/pull/*/head. Nó tìm nạp phần đầu của mỗi yêu cầu kéo trên GitHub và ánh xạ tới nó github/pr/#. Vì vậy, nếu ai đó gửi yêu cầu kéo và được đánh số 62 (ví dụ), bạn sẽ làm:

git fetch github
git checkout -t github/pr/62

Và sau đó bạn sẽ ở một chi nhánh địa phương được gọi là pr/62(giả sử nó không tồn tại). Thật tuyệt và có nghĩa là bạn không phải theo dõi các điều khiển từ xa hoặc chi nhánh của người khác.


2
Tại sao không? Nó giải thích chính xác làm thế nào để làm điều này một cách thuận tiện và hiệu quả.
Ian Stapleton Cordasco

Bởi vì tôi là một người mới và tài liệu đó rất khó hiểu. Tôi sẽ không bao giờ nhận được từ "không nhận được" git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_clonetừ tài liệu chính.
Fresheyeball

6
Những gì tài liệu chính làm là thêm một bộ thông tin bổ sung (tài liệu tham khảo hoặc tài liệu tham khảo) để tìm nạp từ GitHub. Khi bạn làm git fetch githubbạn có thể làm git co -t github/pr/#. Điều này ngăn bạn khỏi phải sao chép và dán URL từ xa, tìm ra tên chi nhánh, v.v. Sau đó, bạn sẽ có được tên chi nhánh chính xác, ngắn gọn và chính xác mà không gặp rắc rối thêm. Nhưng tôi hiểu nó có vẻ quá sức.
Ian Stapleton Cordasco

Ồ tốt đẹp Tôi không biết +1 này! Bạn có thể cho tôi một ví dụ đầy đủ trình độ?
Fresheyeball

@ sigmavirus24 cảm ơn rất nhiều về thông tin; Tôi tự hỏi nếu thủ thuật tương tự tồn tại cho bitbucket?
Petr Kozelka

8

1
Lưu ý git pulltạo ra một sự hợp nhất vào chi nhánh hiện tại; thường là cho một PR mà bạn muốn chỉ git fetchđể lấy mã của tác giả gốc (sau đó có thể truy cập dưới dạng FETCH_HEAD). Nếu bạn thực sự muốn hợp nhất, thì cũng đáng đề cập pull/2/merge(thay vì pull/2/head) - điều này khiến GitHub cung cấp cho bạn cam kết hợp nhất chính xác sẽ xảy ra nếu bạn nhấp vào nút [Hợp nhất] ngay bây giờ.
Beni Cherniavsky-Paskin

6

Khi người dùng gửi yêu cầu kéo, họ sẽ yêu cầu một số thay đổi được hợp nhất từ ​​một nhánh trên bản sao của một ngã ba trở lại kho lưu trữ của người dùng khác.

Những thay đổi bạn muốn có thể nhận được từ nguồn yêu cầu kéo. Để thực hiện việc này, sao chép kho lưu trữ của người dùng ( git://github.com/berstend/frappe.git) và sau đó kiểm tra nhánh mà anh ta đã tạo yêu cầu kéo từ ( feature/mongoose-support).


1

Sau khi cài đặt git-ngoại vi

(cd /tmp && git clone --depth 1 https://github.com/tj/git-extras.git && cd git-extras && sudo make install)

Bạn chỉ có thể sử dụng git pr

$ git pr 62 [remote]


0

Yêu cầu kéo đó cho thấy các cam kết từ ngã ba của người đó để bạn có thể thấy rằng anh ta đang đẩy các thay đổi của mình từ feature/mongoose-supportchi nhánh.

Bạn có thể sao chép kho lưu trữ của anh ấy và kiểm tra chi nhánh đó


0

Đối với tôi, nó đơn giản như

git fetch origin pull/4/head

Nơi 4được tìm thấy ở đây:

nhập mô tả hình ảnh ở đây

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.