Mengambil tertentu komit dari remote repositori Git

Apakah ada cara untuk hanya mengambil satu tertentu melakukan dari jarak jauh Git repo tanpa kloning pada PC saya? Struktur remote repo adalah benar-benar sama seperti yang saya dan oleh karena itu tidak ada't akan ada konflik tapi saya tidak tahu bagaimana untuk melakukan hal ini dan saya don't ingin klon yang besar repositori.

Saya baru git, apakah ada cara lain?

Mengomentari pertanyaan (8)
Larutan

Dimulai dengan Git versi 2.5+ (Q2 2015), mengambil satu komitmen (tanpa kloning penuh repo) adalah benar-benar mungkin. Lihat melakukan 68ee628 oleh Fredrik Medley (moroten), 21 Mei 2015. (Digabung dengan Junio C Hamano -- gitster -- di melakukan a9d3493, 01 Jun 2015) Anda sekarang memiliki konfigurasi baru (di sisi server)

uploadpack.allowReachableSHA1InWant

Memungkinkan upload-pack untuk menerima permintaan pengambilan yang meminta untuk sebuah objek yang dicapai dari setiap ref tip. Namun, perhatikan bahwa menghitung objek reachability adalah komputasi mahal. Defaultnya palsu. Jika anda menggabungkan sisi server dengan konfigurasi yang dangkal clone ([git fetch-depth=1][1]), anda dapat meminta satu komit (lihat [t/t5516-fetch-push.sh][2]:

git fetch --depth=1 ../testrepo/.git $SHA1

Anda dapat menggunakan git kucing-file` perintah untuk melihat bahwa komit telah diambil:

git cat-file commit $SHA1

"git tanggal-pack" yang menyajikan "git fetch" dapat dikatakan untuk melayani melakukan yang tidak di ujung setiap ref, asalkan mereka dicapai dari wasit, dengan uploadpack.allowReachableSHA1InWant konfigurasi variabel.

Dokumentasi lengkap adalah:

upload-pack: opsional memungkinkan mengambil dicapai sha1

Dengan uploadpack.allowReachableSHA1InWant opsi konfigurasi set pada sisi server, "git fetch" dapat membuat permintaan dengan "ingin" line bahwa nama-nama objek yang belum diiklankan (mungkin telah diperoleh dari band atau dari submodule pointer). Hanya benda-benda yang dapat dicapai dari tips cabang, yaitu uni diiklankan cabang dan cabang disembunyikan oleh transfer.hideRefs, akan diproses. Perhatikan bahwa ada biaya yang terkait harus berjalan kembali sejarah untuk memeriksa reachability. fitur Ini dapat digunakan ketika mendapatkan konten tertentu komit, untuk yang sha1 diketahui, tanpa perlu kloning seluruh repositori, terutama jika dangkal fetch digunakan. Berguna kasus misalnya

  • repositori yang berisi file-file besar dalam sejarah,
  • mengambil hanya data yang diperlukan untuk submodule checkout,
  • ketika berbagi sha1 tanpa memberitahu yang tepat cabang itu milik dan di Gerrit, jika anda berpikir dalam hal melakukan alih-alih mengubah angka-angka. (Gerrit kasus telah diselesaikan melalui allowTipSHA1InWant karena setiap Gerrit perubahan ref.)

    Git 2.6 (Q3 2015) akan meningkatkan model itu. Lihat melakukan 2bc31d1, melakukan cc118a6 (28 Jan 2015) oleh Jeff King (peff). (Digabung dengan Junio C Hamano -- gitster -- di melakukan 824a0be, 19 Aug 2015)

    ref: dukungan negatif transfer.hideRefs

    Jika anda menyembunyikan sebuah hirarki ref menggunakan transfer.hideRefs config, tidak ada cara untuk kemudian mengesampingkan bahwa config untuk "unhide" itu. Patch ini menerapkan "negatif" menyembunyikan yang menyebabkan pertandingan untuk segera ditandai sebagai unhidden, bahkan jika pertandingan lain akan menyembunyikannya. Kami berhati-hati untuk menerapkan pertandingan di reverse-order dari cara mereka makan kita dengan konfigurasi mesin, yang memungkinkan kami biasa "terakhir menang" config diutamakan bekerja (dan entri dalam .git/config, misalnya, akan menimpa /etc/gitconfig). Jadi sekarang anda dapat melakukan:

git config --system transfer.hideRefs refs/secret
git config transfer.hideRefs '!refs/secret/not-so-secret'

untuk menyembunyikan ref/rahasia di semua repos, kecuali untuk satu publik bit di satu tertentu repo.

Git 2.7 (Nov/Dec 2015) akan meningkatkan lagi: Lihat melakukan 948bfa2, melakukan 00b293e (05 Nov 2015), melakukan 78a766a, melakukan 92cab49, melakukan 92cab49, melakukan 92cab49 (03 juli 2015), melakukan 00b293e, melakukan 00b293e (05 Nov 2015), dan melakukan 92cab49, melakukan 92cab49, komit 92cab49, melakukan 92cab49 (03 Nov 2015) oleh Lukas Fleischer (lfos). Membantu-oleh: Eric Sunshine (sunshineco). (Digabung dengan Jeff King -- peff -- di melakukan dbba85e, 20 Nov 2015)

config.txt: dokumen semantik hideRefs dengan namespaces

sekarang, tidak ada definisi yang jelas tentang bagaimana transfer.hideRefs harus berperilaku ketika namespace diatur. Jelaskan bahwa hideRefs prefiks pertandingan dilucuti nama-nama dalam kasus itu. Ini adalah cara hideRefs pola saat ini ditangani dalam menerima-pack.

hideRefs: menambahkan dukungan untuk pencocokan penuh ref

selain pencocokan dilucuti refs, satu sekarang dapat menambahkan hideRefs pola yang penuh (unstripped) ref melawan. Untuk membedakan antara dilucuti dan penuh pertandingan, mereka pola-pola baru harus diawali dengan aksen sirkumfleks (^). Oleh karena itu [new dokumentasi][3]:

transfer.hideRefs:

Jika sebuah namespace yang di gunakan, namespace prefix adalah dilucuti dari masing-masing referensi sebelum melawan transfer.hiderefs pola. Misalnya, jika ref/kepala/guru ditentukan dalam transfer.hideRefs dan saat ini namespace foo, kemudian ref/nama/foo/ref/kepala/guru dihilangkan dari iklan tapi ref/kepala/guru dan ref/nama/bar/ref/kepala/guru masih diiklankan sebagai disebut "memiliki" garis-garis. Dalam rangka untuk mencocokkan ref sebelum pengupasan, tambahkan ^ di depan wasit nama. Jika anda menggabungkan ! dan ^, ! harus ditentukan terlebih dahulu.

R.. menyebutkan komentar config uploadpack.allowAnySHA1InWant, yang memungkinkan upload-pack menerima mengambil permintaan yang meminta untuk setiap objek pada semua. (Default false). Lihat melakukan f8edeaa (Nov. 2016, Git v2.11.1) oleh David "novalis" Turner (novalis):

upload-pack: opsional memungkinkan mengambil setiap sha1

tampaknya sedikit konyol untuk melakukan reachabilty periksa dalam kasus di mana kita kepercayaan pengguna untuk mengakses benar-benar segala sesuatu di repositori. Juga, it's racy dalam sistem terdistribusi-mungkin satu server mengiklankan wasit, tapi yang lain karena telah memiliki kekuatan-push untuk ref, dan mungkin dua permintaan HTTP berakhir diarahkan untuk berbeda ini server.

Komentar (9)

Anda hanya clone sekali, jadi jika anda sudah memiliki sebuah clone dari repositori jauh, menarik dari itu tidak't download semuanya lagi. Hanya menunjukkan apa yang cabang yang ingin anda tarik, atau mengambil perubahan dan pelajari melakukan yang anda inginkan.

Mengambil dari sebuah repositori baru ini sangat murah di bandwidth, karena hanya akan men-download perubahan yang anda don't memiliki. Berpikir dalam hal Git membuat hal yang benar, dengan beban minimum.

Git menyimpan segala sesuatu dalam .git folder. Komit dapat't dapat diambil dan disimpan dalam isolasi, itu kebutuhan semua nenek moyangnya. Mereka adalah saling terkait.


Untuk mengurangi ukuran download namun anda dapat meminta git untuk mengambil hanya benda-benda yang berkaitan dengan cabang tertentu atau melakukan:

git fetch origin refs/heads/branch:refs/remotes/origin/branch

Ini akan men-download hanya melakukan yang terkandung di remote branch cabang (dan hanya orang-orang yang anda kehilangan), dan menyimpannya dalam asal/cabang. Anda kemudian dapat menggabungkan atau checkout.

Anda juga dapat menentukan hanya SHA1 melakukan:

git fetch origin 96de5297df870:refs/remotes/origin/foo-commit

Ini akan men-download hanya melakukan yang ditentukan SHA-1 96de5297df870 (dan nenek moyangnya yang anda lewatkan), dan menyimpannya sebagai (tidak ada) cabang terpencil asal/foo-commit.

Komentar (9)

Saya melakukan tarik pada saya git repo:

git pull --rebase  

Memungkinkan git untuk menarik semua kode untuk cabang dan kemudian saya pergi untuk melakukan reset atas untuk melakukan yang tertarik padaku.

git reset --hard <commit-hash>

Semoga ini bisa membantu.

Komentar (3)

Anda hanya dapat mengambil satu melakukan remote repo dengan

git fetch  

di mana,

  • <repo> bisa menjadi remote repo nama (misalnya asal) atau bahkan remote repo URL (misalnya https://git.foo.com/myrepo.git)
  • <melakukan> dapat SHA1 melakukan

misalnya

git fetch https://git.foo.com/myrepo.git 0a071603d87e0b89738599c160583a19a6d95545

setelah anda mengambil komitmen (dan hilang moyang) anda hanya dapat checkout dengan

git checkout FETCH_HEAD

Catatan bahwa ini akan membawa anda di "kepala terpisah" negara.

Komentar (9)

Anda hanya dapat mengambil remote repo dengan:

git fetch 

di mana,

  • <repo> bisa menjadi remote repo nama (misalnya asal) atau bahkan remote repo URL (misalnya https://git.foo.com/myrepo.git)

misalnya:

git fetch https://git.foo.com/myrepo.git 

setelah anda mengambil repos anda dapat menggabungkan melakukan yang anda inginkan (karena pertanyaannya adalah tentang mengambil satu melakukan, bukan merge anda dapat menggunakan cherry-pick untuk memilih hanya satu kali):

git merge 
  • <melakukan> dapat SHA1 melakukan

misalnya:

git cherry-pick 0a071603d87e0b89738599c160583a19a6d95545

atau

git merge 0a071603d87e0b89738599c160583a19a6d95545

jika ini terbaru komit yang ingin anda bergabung, anda juga dapat menggunakan FETCH_HEAD variabel :

git cherry-pick (or merge) FETCH_HEAD
Komentar (3)

Akhirnya saya menemukan cara untuk mengkloning tertentu komit menggunakan git cherry-pick. Dengan asumsi anda don't memiliki repositori di lokal dan anda menarik tertentu melakukan dari jarak jauh,

  1. membuat kosong repositori di lokal dan git init

  2. git remote add origin "url-dari-repository"

  3. git fetch asal [ini tidak akan memindahkan file ke lokal anda kerja kecuali anda menggabungkan]

  4. git cherry-pick "Masukkan panjang-melakukan-hash-yang-anda-perlu"

Dilakukan.Dengan cara ini, anda hanya akan memiliki file yang spesifik komit di lokal anda.

Masukkan panjang-melakukan-hash:

Anda bisa mendapatkan ini menggunakan -> git log --cukup=oneline

Komentar (0)

Ini bekerja terbaik:

git fetch origin specific_commit
git checkout -b temp FETCH_HEAD

nama "temp" apa pun yang anda inginkan...cabang ini mungkin menjadi yatim piatu meskipun

Komentar (1)

Saya pikir 'git ls-remote' ( http://git-scm.com/docs/git-ls-remote ) harus melakukan apa yang anda inginkan. Tanpa memaksa mengambil atau menarik.

Komentar (0)

Jika diminta komit dalam tarikan permintaan dari remote repo, anda bisa mendapatkannya dengan ID-nya:

# Add the remote repo path, let's call it 'upstream':
git remote add upstream https://github.com/repo/project.git

# checkout the pull ID, for example ID '60':
git fetch upstream pull/60/head && git checkout FETCH_HEAD
Komentar (0)