Bagaimana cara checkout hanya satu file dari repo git?
git
file
git-checkout
sparse-checkout
Arthur Ulfeldt
sumber
sumber
Jawaban:
Awalnya, saya sebutkan pada 2012
git archive
(lihat Jared Forsyth 's jawaban dan Robert Ksatria ' s jawaban ), karena git1.7.9.5 (Maret 2012) , Paul Brannan 's jawabannya :Tetapi: pada 2013, itu tidak lagi memungkinkan untuk URL https://github.com jarak jauh .
Lihat halaman lama " Bisakah saya mengarsipkan repositori? "
Halaman saat ini (2018) " Tentang pengarsipan konten dan data di GitHub " merekomendasikan penggunaan layanan pihak ketiga seperti GHTorrent atau GH Archive .
Jadi Anda juga bisa berurusan dengan salinan / klon lokal:
Anda bisa juga melakukan yang berikut jika Anda memiliki salinan lokal dari repositori telanjang seperti yang disebutkan dalam jawaban ini ,
Atau Anda harus mengkloning repo terlebih dahulu, yang berarti Anda mendapatkan riwayat lengkap: - dalam repo .git - di pohon kerja.
git config core.sparsecheckout true
).git/info/sparse-checkout
fileUntuk membaca kembali pohon yang berfungsi:
Dengan begitu, Anda berakhir dengan pohon kerja termasuk apa yang Anda inginkan (meskipun hanya satu file)
Richard Gomes menunjuk ( dalam komentar ) untuk " Bagaimana saya mengkloning, mengambil, atau jarang checkout satu direktori atau daftar direktori dari repositori git? "
sumber
git archive
sekarang.Klon pertama repo dengan opsi -n, yang menekan checkout default semua file, dan opsi --depth 1, yang berarti hanya mendapat revisi terbaru dari setiap file
Kemudian periksa file yang Anda inginkan seperti itu:
sumber
-n
pohon kerja dan indeks berakhir sinkron. Artinya, semua konten muncul sebagai dihapus. Anda harus salah satugit reset HEAD
ataugit checkout HEAD file
. Juga sangat sulit untuk bekerja dengan repositori pada saat ini kecuali Anda benar-benar mengerti cara kerja git.rm -rf .git
ke skrip NickMoore akan membersihkan semua jejak repo yang dikloning dan mungkin menghilangkan kepedulian Jefromi tentang memiliki repo yang sulit digunakan untuk diletakkan. Membuatnya sangat berguna bagi saya untuk beberapa aplikasi, seperti tantangan saya hari ini untuk membangun kait pasca-terima untuk memperbarui versi kait pasca-terima lain secara otomatis.git
bukan yang terbaik untuk pekerjaan semacam ini). Jawaban ini juga berlaku untuk pertanyaan ini , atau yang populer lainnya , dan banyak yang lain: ubahname_of_file
kename_of_folder
. Git di saat ini (2014) menawarkan submodul kepada pemilik repo menawarkan beberapa por friendly untuk pengguna repo.Jika Anda sudah memiliki salinan git repo, Anda selalu dapat checkout versi file menggunakan a
git log
untuk mengetahui hash-id (misalnya 3cdc61015724f9965575ba954c8cd4232c8b42e4) dan kemudian Anda cukup mengetik:Ini adalah contoh aktual:
sumber
path-to-file
direktori, dan saat iniHEAD
berisi file tertentu sementaratarget
tidak, (atau sebaliknya), ini tidak akan memperbarui file dengan benar. Apakah ada cara untuk mengatasinya?Biasanya tidak mungkin mengunduh hanya satu file
git
tanpa mengunduh seluruh repositori seperti yang disarankan dalam jawaban pertama. Itu karena Git tidak menyimpan file seperti yang Anda pikirkan (seperti yang dilakukan CVS / SVN), tetapi Git menghasilkannya berdasarkan seluruh sejarah proyek.Tetapi ada beberapa solusi untuk kasus-kasus tertentu. Contoh di bawah ini dengan placeholder untuk
user
,project
,branch
,filename
.GitHub
GitLab
GitWeb
Jika Anda menggunakan Git di Server - GitWeb , maka Anda dapat mencoba contohnya (mengubahnya menjadi jalur yang benar):
GitWeb di drupalcode.org
Contoh:
googlesource.com
Ada fitur tidak berdokumen yang memungkinkan Anda mengunduh versi mentah file yang disandikan base64:
Dalam kasus lain, periksa apakah repositori Git Anda menggunakan antarmuka web apa pun.
Jika tidak menggunakan antarmuka web apa pun, Anda dapat mempertimbangkan untuk mendorong kode Anda ke layanan eksternal seperti GitHub , Bitbucket , dll. . dan menggunakannya sebagai cermin.
Jika Anda belum
wget
menginstal, cobacurl -O (url)
alternatifnya.sumber
wget
jawaban yang brilian dan kesederhanaan ini kembali, bersama dengan kebahagiaan. Terima kasih sobat.git checkout branch_or_version - path / file
contoh:
git checkout HEAD -- main.c
sumber
Panduan Minimal
git checkout -- <filename>
Ref: https://git-scm.com/docs/git-checkout
Dup: Membatalkan modifikasi copy pekerjaan dari satu file di Git?
sumber
git-checkout
.Sekarang kita bisa! Karena ini adalah hasil pertama di google, saya pikir saya akan memperbarui ini ke posisi terbaru. Dengan munculnya git 1.7.9.5, kami memiliki
git archive
perintah yang akan memungkinkan Anda untuk mengambil satu file dari host jarak jauh.Lihat jawaban lengkapnya di sini https://stackoverflow.com/a/5324532/290784
sumber
github.com
HEAD
ataumaster
tidakHEAD:directory
.git archive [email protected]:user/repo branch:path/to file | tar -x
Bekerja di GIT 1.7.2.2
Misalnya Anda memiliki remote some_remote dengan cabang-cabang branch1 , branch32
jadi untuk checkout file tertentu Anda memanggil perintah ini:
sebagai contoh akan seperti ini
Perintah checkout ini akan menyalin seluruh struktur file conf / en dan conf / fr ke direktori saat ini di mana Anda memanggil perintah-perintah ini (tentu saja saya menganggap Anda menjalankan git init di beberapa titik sebelumnya)
sumber
git fetch some_remote
sebelumnya, bukan?Sangat sederhana:
Ini tidak akan checkout
from-branch-name
cabang. Anda akan tetap pada cabang apa pun Anda berada, dan hanya file tunggal yang akan diperiksa dari cabang tertentu.Inilah bagian yang relevan dari halaman manual ini
git-checkout
Hat tip untuk Ariejan de Vroom yang mengajari saya ini dari posting blog ini .
sumber
git clone --filter
dari Git 2.19Opsi ini sebenarnya akan melewatkan mengambil sebagian besar objek yang tidak dibutuhkan dari server:
Server harus dikonfigurasi dengan:
Tidak ada dukungan server pada v2.19.0, tetapi sudah dapat diuji secara lokal.
TODO:
--filter=blob:none
melompati semua gumpalan, tetapi masih mengambil semua objek pohon. Tetapi pada repo yang normal, ini harus kecil dibandingkan dengan file itu sendiri, jadi ini sudah cukup baik. Ditanya di: https://www.spinics.net/lists/git/msg342006.html Devs menjawab a--filter=tree:0
sedang mengerjakan hal itu.Ingat yang
--depth 1
sudah tersirat--single-branch
, lihat juga: Bagaimana saya mengkloning satu cabang di Git?file://$(path)
diperlukan untuk mengatasigit clone
protokol shenanigans: Bagaimana cara dangkal mengkloning repositori git lokal dengan path relatif?Format
--filter
didokumentasikan padaman git-rev-list
.Ekstensi dibuat untuk protokol jarak jauh Git untuk mendukung fitur ini.
Documents on Git tree:
Uji itu
GitHub hulu .
Output dalam Git v2.19.0:
Kesimpulan: semua gumpalan kecuali
d1/a
hilang. Misalnyaf70a17f51b7b30fec48a32e4f19ac15e261fd1a4
, yangd1/b
tidak ada setelah check outd1/
.Perhatikan itu
root/root
danmybranch/mybranch
juga hilang, tetapi--depth 1
menyembunyikannya dari daftar file yang hilang. Jika Anda menghapus--depth 1
, maka mereka muncul di daftar file yang hilang.sumber
Anda bisa melakukannya dengan
sumber
Dua varian tentang apa yang sudah diberikan:
dan:
Ini menulis file ke output standar.
sumber
Katakanlah nama file 123.txt, ini berfungsi untuk saya:
Jika file ada di dalam direktori A, pastikan untuk menentukannya dengan benar:
sumber
Di git Anda tidak melakukan 'checkout' file sebelum Anda memperbaruinya - sepertinya inilah yang Anda cari.
Banyak sistem seperti clearcase, csv dan sebagainya mengharuskan Anda untuk 'checkout' file sebelum Anda dapat mengubahnya. Git tidak memerlukan ini. Anda mengkloning repositori dan kemudian membuat perubahan dalam salinan repositori lokal Anda.
Setelah Anda memperbarui file yang dapat Anda lakukan:
Untuk melihat file apa yang telah dimodifikasi. Anda menambahkan yang ingin Anda komit
index
dulu (index
seperti daftar yang harus diperiksa):atau
Maka do
git status
akan menunjukkan kepada Anda file mana yang dimodifikasi dan yangindex
siap untuk dilakukan atau diperiksa.Untuk mengkomit file ke salinan repositori Anda, lakukan:
Lihat
git
situs web untuk tautan ke manual dan panduan.sumber
git format-patch
untuk membuat tambalan untuk pengiriman (git format-patch -1
akan membuat tambalan hanya untuk komit terbaru Anda).Berikut adalah solusi lengkap untuk menarik dan mendorong hanya file tertentu di dalam repositori git:
Lihat juga tautan untuk beberapa info tambahan.
sumber
Kedengarannya seperti Anda mencoba untuk meneruskan ide dari kontrol versi terpusat, yang git pada dasarnya tidak - itu didistribusikan. Jika Anda ingin bekerja dengan repositori git, Anda mengkloningnya. Anda kemudian memiliki semua konten dari pohon kerja, dan semua sejarah (well, setidaknya semuanya mengarah ke ujung cabang saat ini), bukan hanya satu file atau snapshot dari komit tunggal.
sumber
Jika Anda memerlukan file tertentu dari cabang tertentu dari repositori Git jarak jauh, perintahnya adalah:
Sisanya dapat diturunkan dari jawaban @ VonC:
Jika Anda memerlukan file tertentu dari cabang master, itu adalah:
Jika Anda memerlukan file tertentu dari tag, itu adalah:
sumber
Saya tidak melihat apa yang berhasil bagi saya yang tercantum di sini jadi saya akan memasukkannya jika ada yang berada dalam situasi saya.
Situasi saya, saya memiliki repositori jarak jauh mungkin 10.000 file dan saya perlu membangun file RPM untuk sistem Linux saya. Membangun RPM mencakup klon git dari segalanya. Yang saya butuhkan adalah satu file untuk memulai RPM build. Saya dapat mengkloning seluruh pohon sumber yang melakukan apa yang saya butuhkan tetapi butuh dua menit ekstra untuk mengunduh semua file itu ketika yang saya butuhkan hanyalah satu. Saya mencoba menggunakan opsi arsip git yang dibahas dan saya mendapatkan "fatal: Operasi tidak didukung oleh protokol." Sepertinya saya harus mengaktifkan opsi arsip di server dan server saya dikelola oleh penjahat birokratis yang sepertinya senang mempersulit penyelesaiannya.
Apa yang akhirnya saya lakukan adalah saya pergi ke antarmuka web untuk bitbucket dan melihat satu file yang saya butuhkan. Saya melakukan klik kanan pada tautan untuk mengunduh salinan mentah dari file dan memilih “copy shortcut” dari popup yang dihasilkan. Saya tidak bisa hanya mengunduh file mentah karena saya perlu mengotomatisasi sesuatu dan saya tidak memiliki antarmuka browser di server Linux saya.
Demi diskusi, yang menghasilkan URL:
Saya tidak dapat langsung mengunduh file ini dari repositori bitbucket karena saya harus masuk terlebih dahulu. Setelah sedikit menggali, saya menemukan ini berhasil: Di Linux:
Kombinasi ini memungkinkan saya untuk mengunduh satu file yang saya perlukan untuk membangun yang lainnya.
sumber
Saya menambahkan jawaban ini sebagai alternatif untuk melakukan checkout resmi atau operasi lokal serupa. Dengan asumsi bahwa Anda memiliki akses ke antarmuka web penyedia Git Anda, Anda mungkin dapat langsung melihat file apa pun pada komit yang diinginkan yang diberikan. Misalnya, di GitHub Anda dapat menggunakan sesuatu seperti:
Berikut
ed25584f
adalah 8 karakter pertama dari hash SHA-1 dari commit of interest, diikuti oleh path ke file sumber.Similary, di Bitbucket kita dapat mencoba:
Dalam hal ini, kami menempatkan hash komit di akhir URL sumber.
sumber
Jika Anda hanya perlu mengunduh file, tidak perlu memeriksa dengan Git.
GitHub Mate jauh lebih mudah untuk melakukannya, itu adalah ekstensi Chrome, memungkinkan Anda mengklik ikon file untuk mengunduhnya. juga open source
sumber
git
! =github
Jika Anda telah mengedit versi lokal file dan ingin kembali ke versi asli yang dikelola di server pusat, ini dapat dengan mudah dicapai menggunakan Git Extensions .
Mudah!
sumber