Apakah ada cara untuk mengambil hanya satu komit tertentu dari repo Git jarak jauh tanpa mengkloningnya pada PC saya? Struktur repo jarak jauh sama sekali dengan repo saya dan karenanya tidak akan ada konflik tetapi saya tidak tahu bagaimana melakukan ini dan saya tidak ingin mengkloning repositori besar itu.
Saya baru git, apakah ada cara?
Jawaban:
Dimulai dengan Git versi 2.5+ (Q2 2015), mengambil komit tunggal (tanpa mengkloning repo penuh) sebenarnya mungkin.
Lihat commit 68ee628 oleh Fredrik Medley (
moroten
) , 21 Mei 2015.(Digabung oleh Junio C Hamano -
gitster
- dalam commit a9d3493 , 01 Jun 2015)Anda sekarang memiliki konfigurasi baru (di sisi server)
Jika Anda menggabungkan konfigurasi sisi server dengan clone dangkal (
git fetch --depth=1
), Anda dapat meminta satu komit (lihatt/t5516-fetch-push.sh
:Anda dapat menggunakan
git cat-file
perintah untuk melihat bahwa komit telah diambil:Dokumentasi lengkapnya adalah:
Git 2.6 (Q3 2015) akan meningkatkan model itu.
Lihat komit 2bc31d1 , komit cc118a6 (28 Jul 2015) oleh Jeff King (
peff
) .(Digabung oleh Junio C Hamano -
gitster
- dalam commit 824a0be , 19 Agu 2015)Git 2.7 (Nov / Des 2015) akan meningkat lagi:
Lihat komit 948bfa2 , komit 00b293e (5 November 2015), melakukan 78a766a , komit 92cab49 , komit 92cab49 , komit 92cab49 (3 November 2015), melakukan 00b293e , komit 00b293e (5 November 2015), dan komit 92cab49 , komit 92cab49 , komit 92cab49 , commit 92cab49 (03 Nov 2015) oleh Lukas Fleischer (
lfos
) .Dibantu-oleh: Eric Sunshine (
sunshineco
) .(Digabung oleh Jeff King -
peff
- di commit dbba85e , 20 Nov 2015)Karenanya dokumentasi baru :
R .. menyebutkan dalam komentar konfigurasi
uploadpack.allowAnySHA1InWant
, yang memungkinkanupload-pack
untuk menerimafetch
permintaan yang meminta objek apa pun. (Default kefalse
).Lihat commit f8edeaa (November 2016, Git v2.11.1) oleh David "novalis" Turner (
novalis
) :sumber
uploadpack.allowAnySHA1InWant
tanpa penalti reachability-komputasi (dan vektor DoS).Anda hanya mengkloning sekali, jadi jika Anda sudah memiliki klon repositori jarak jauh, menariknya tidak akan mengunduh semuanya lagi. Cukup tunjukkan cabang apa yang ingin Anda tarik, atau ambil perubahan dan checkout komit yang Anda inginkan.
Mengambil dari repositori baru sangat murah dalam bandwidth, karena hanya akan mengunduh perubahan yang tidak Anda miliki. Pikirkan dalam hal Git membuat hal yang benar, dengan beban minimum.
Git menyimpan semua yang ada di
.git
folder. Komit tidak dapat diambil dan disimpan dalam isolasi, ia membutuhkan semua leluhurnya. Mereka saling terkait .Untuk mengurangi ukuran unduhan, Anda dapat meminta git untuk mengambil hanya objek yang terkait dengan cabang tertentu atau melakukan:
Ini akan mengunduh hanya komit yang terdapat di cabang jarak jauh
branch
(dan hanya yang Anda lewatkan) , dan menyimpannyaorigin/branch
. Anda kemudian dapat menggabungkan atau checkout.Anda juga dapat menentukan hanya komit SHA1:
Ini hanya akan mengunduh komitmen dari SHA-1 96de5297df870 yang ditentukan (dan leluhurnya yang Anda lewatkan), dan menyimpannya sebagai cabang jarak jauh (yang tidak ada)
origin/foo-commit
.sumber
2.7.4-0ubuntu1.3
. Namun, ketika menggunakan2.16.2-0ppa1~ubuntu16.04.1
dari PPA git-core, ini berfungsi sebagaimana mestinya. Kedengarannya seperti bug yang diperbaiki. Tidak dapat menemukan referensi untuk itu dengan pencarian cepat. Jika seseorang bisa memberi saya petunjuk tentang hal itu, saya akan senang mendapatkan perbaikan ini di-backport.Saya melakukan git repo:
Mengizinkan git untuk menarik semua kode untuk cabang dan kemudian saya melakukan reset ke komit yang menarik minat saya.
git reset --hard <commit-hash>
Semoga ini membantu.
sumber
git reset --hard
, ketika dibagikan dalam solusi umum, dapat mengarahkan orang ke dalam jebakan di mana mereka kehilangan data (atau, dalam kasus ini: dalam keadaan di mana mendapatkan kembali data mereka tidak penting).Anda dapat mengambil komit tunggal dari repo jarak jauh dengan
dimana,
<repo>
dapat berupa nama repo jarak jauh (mis.origin
) atau bahkan URL repo jarak jauh (mis.https://git.foo.com/myrepo.git
)<commit>
dapat berupa komit SHA1sebagai contoh
Setelah Anda mengambil komit (dan leluhur yang hilang), Anda dapat checkout dengan
Perhatikan bahwa ini akan membawa Anda dalam kondisi "kepala terpisah".
sumber
fetch
rev tertentu seperti yang Anda lakukan di sana, git gagal dengan kode kesalahan 1 dan tidak ada output. Apakah ini sesuatu yang dulu berfungsi di versi sebelumnya? (Saya v2.0.2.)fetch
, meskipun dalam kasus itu saya tidak yakin apa gunanya.git checkout FETCH_HEAD
membantu.--depth=1
)!Anda dapat mengambil repo jarak jauh dengan:
dimana,
<repo>
dapat berupa nama repo jarak jauh (mis.origin
) atau bahkan URL repo jarak jauh (mis.https://git.foo.com/myrepo.git
)sebagai contoh:
setelah Anda mengambil repo Anda dapat menggabungkan komit yang Anda inginkan (karena pertanyaannya adalah tentang mengambil satu komit, alih-alih menggabungkan Anda dapat menggunakan cherry-pick untuk memilih hanya satu komit):
<commit>
dapat berupa komit SHA1sebagai contoh:
atau
jika komit terbaru yang ingin Anda gabungkan, Anda juga dapat menggunakan variabel FETCH_HEAD:
sumber
git config set uploadpack.allowReachableSHA1InWant
?Ini yang terbaik:
nama "temp" apa pun yang Anda inginkan ... cabang ini mungkin menjadi yatim piatu
sumber
Akhirnya saya menemukan cara untuk mengkloning komit tertentu menggunakan git cherry-pick . Dengan asumsi Anda tidak memiliki repositori di lokal dan Anda menarik komit tertentu dari jarak jauh,
1) membuat repositori kosong di lokal dan git init
2) git remote tambahkan asal " url-of-repository "
3) git fetch origin [ini tidak akan memindahkan file Anda ke ruang kerja lokal Anda kecuali jika Anda bergabung]
4) git cherry-pick " Enter-long-commit-hash-that-you-need "
Selesai. Dengan cara ini, Anda hanya akan memiliki file dari komit tertentu di lokal Anda.
Masukkan-long-commit-hash:
Anda bisa mendapatkannya menggunakan -> git log --pretty = oneline
sumber
Saya pikir 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) harus melakukan apa yang Anda inginkan. Tanpa paksa mengambil atau menarik.
sumber
Jika komit yang diminta ada dalam permintaan tarik repo jarak jauh, Anda bisa mendapatkannya dengan ID-nya:
sumber