Klon GitHub dari pull request?

128

Saya ingin mengkloning repositori dari GitHub. Masalahnya adalah saya tidak menginginkan cabang utama; Saya ingin versi dalam permintaan penarikan yang tidak disetujui ini .

Apakah mungkin bagi saya untuk menggandakan versi permintaan penarikan alih-alih repositori utama?

Fresheyeball
sumber
2
Jika Anda datang ke sini bukan untuk clonetetapi untuk fetchmelihat: stackoverflow.com/questions/6743514/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

87

Anda dapat mengkloning cabang yang Anda inginkan dengan menggunakan -bopsi dan untuk permintaan tarik:

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

Dalam kasus Anda, cabang yang ingin Anda klon adalah cabang sumber dari pull request ( feature/mongoose-support):

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

Cara termudah untuk melakukannya adalah seperti ini:

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

Anda sekarang akan berada di cabang baru yang berada dalam status permintaan penarikan.

Anda mungkin ingin menyiapkan alias dengan menjalankan

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

Sekarang Anda dapat melakukan pembayaran PR apa pun dengan menjalankan git pr <pr_number>, atau git pr <pr_number> <remote>jika remote github Anda tidak bernama origin.

Kronial
sumber
49
Lebih baik: git fetch origin pull/<#>/head:<local_branch_name>( via )
schlamar
5
Saya menemukan diri saya referensi jawaban SO ini sering, jadi saya terjebak ini ke saya .gitconfigfile di bawah [alias]: pr = "!f() { git fetch $1 pull/$2/head:pull_$2; git co pull_$2; }; f". Dengan begitu saya hanya mengetik git pr upstream 62dan hal berikutnya yang saya tahu, saya berada di cabang baru PR # 62 dari hulu! Jika Anda selalu menggunakan originAnda dapat melakukan hardcode alih-alih $1, tetapi itu beralih untuk saya.
matt ---
@matt yang menganggap Anda memiliki alias untuk checkout bernamaco
Michael McQuade
43
git fetch origin refs/pull/PR_NUMBER/head:NEW_LOCAL_BRANCH

misalnya:

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

Lakukan perubahan, lakukan, PUSH dan buka PR baru dari garpu Anda di GitHub

wierzbiks.dll
sumber
bagaimana cara menggabungkan cabang ini secara lokal? Saya baru saja mengkloning dan mengambil permintaan tarik yang tidak digabungkan seperti yang Anda lakukan di atas. Dan mencoba nama cabang checkout. Tetapi tidak ada perubahan yang muncul di editor IDE / teks saya.
erginduran
17

Anda dapat mengikuti petunjuk dalam inti ini untuk dapat memeriksa remote secara langsung tanpa harus mengetahui repositori dan cabangnya.

Contoh penggunaan

Untuk salah satu proyek saya (github3.py), saya memiliki yang berikut ini di file github3.py/.git/config

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

Baris pertama adalah standar untuk setiap remote dengan pengecualian yang githubdiganti dengan nama remote. Artinya adalah bahwa remote head (atau kepala cabang di server itu) "dipetakan" ke remote lokal yang diawali oleh github/. Jadi jika saya melakukan git fetch githubdan memiliki cabang di GitHub yang belum melihat secara lokal pada komputer saya, itu akan men-download cabang dan saya bisa beralih ke itu seperti: git checkout -t github/branch_name.

Baris kedua melakukan hal yang sama, tetapi melakukannya untuk permintaan pull, bukan cabang git standar. Itu sebabnya kamu lihat refs/pull/*/head. Itu mengambil kepala dari setiap permintaan tarik di GitHub dan memetakannya ke github/pr/#. Jadi jika seseorang mengirim permintaan tarik dan diberi nomor 62 (misalnya), Anda akan melakukan:

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

Dan kemudian Anda akan berada di cabang lokal yang dipanggil pr/62(dengan asumsi itu belum ada). Ini bagus dan berarti Anda tidak perlu melacak remote atau cabang orang lain.

Ian Stapleton Cordasco
sumber
2
Kenapa tidak? Ini menjelaskan dengan tepat bagaimana melakukan ini dengan cara yang nyaman dan efisien.
Ian Stapleton Cordasco
Karena saya noob, dan dokumen itu sulit dimengerti. Saya tidak akan pernah mendapatkan dari "tidak mendapatkannya" git clone https://github.com/berstend/frappe.git -b feature/mongoose-support /my_clonedari dokumen inti.
Fresheyeball
6
Apa yang dilakukan dokumen inti adalah menambahkan satu set informasi tambahan (referensi atau referensi) untuk diambil dari GitHub. Ketika Anda melakukannya, git fetch githubAnda dapat melakukannya git co -t github/pr/#. Hal ini mencegah Anda dari keharusan untuk menyalin dan menempel URL jarak jauh, mencari tahu nama cabang, dll. Anda kemudian mendapatkan nama cabang yang tepat, ringkas dan akurat tanpa kerumitan tambahan. Tapi saya mengerti ini mungkin tampak luar biasa.
Ian Stapleton Cordasco
Oh bagus. Saya tidak tahu +1 ini! Bisakah Anda memberi saya contoh yang sepenuhnya memenuhi syarat?
Fresheyeball
@ sigmavirus24 terima kasih banyak atas informasinya; Saya ingin tahu apakah ada trik serupa untuk bitbucket?
Petr Kozelka
8
git clone git://github.com/dweldon/frappe
cd frappe
git pull origin pull/2/head

Bagaimana cara mengambil permintaan penarikan yang tidak digabungkan untuk cabang yang tidak saya miliki?

Steven Penny
sumber
1
Catatan git pullmembuat penggabungan menjadi cabang saat ini; biasanya untuk PR Anda hanya git fetchingin mendapatkan kode penulis asli (kemudian dapat diakses sebagai FETCH_HEAD). Jika Anda memang menginginkan penggabungan, ada baiknya juga disebutkan pull/2/merge(bukan pull/2/head) - ini membuat GitHub memberi Anda komit penggabungan persis seperti yang akan terjadi jika Anda mengklik tombol [Gabung] sekarang.
Beni Cherniavsky-Paskin
6

Ketika seorang pengguna mengirimkan permintaan tarik, mereka meminta beberapa perubahan untuk digabungkan dari cabang pada klon garpu mereka kembali ke repositori pengguna lain.

Perubahan yang Anda inginkan bisa didapatkan dari sumber pull request. Untuk melakukan ini, klon repositori pengguna ( git://github.com/berstend/frappe.git), lalu periksa cabang tempat dia membuat permintaan tarik dari ( feature/mongoose-support).

adrianbanks
sumber
1

Setelah menginstal git-extras

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

Anda cukup menggunakan git pr

$ git pr 62 [remote]
megawac
sumber
0

Permintaan tarik tersebut menunjukkan komitmen dari garpu orang itu sehingga Anda dapat melihat bahwa dia mendorong perubahannya dari feature/mongoose-supportcabang.

Anda dapat mengkloning repositori dan memeriksa cabang itu

Kartik
sumber
0

Bagi saya, itu sesederhana

git fetch origin pull/4/head

Di mana 4ditemukan di sini:

masukkan deskripsi gambar di sini

stevec
sumber