Saya sudah membaca tentang repositori telanjang dan non-telanjang / default di Git. Saya belum dapat memahami dengan baik (secara teoritis) tentang perbedaan di antara mereka, dan mengapa saya harus "mendorong" ke repositori kosong. Ini kesepakatannya:
Saat ini, saya satu-satunya yang mengerjakan proyek pada 3 komputer yang berbeda, tetapi akan ada lebih banyak orang yang terlibat di dalamnya nanti, jadi saya menggunakan Git untuk kontrol versi. Saya mengkloning repo telanjang di semua komputer, dan ketika saya menyelesaikan modifikasi saya di salah satu dari mereka, saya komit dan mendorong perubahan ke repo telanjang. Dari apa yang saya baca, repositori telanjang TIDAK memiliki "pohon kerja", jadi jika saya mengkloning repo telanjang, saya tidak akan memiliki "pohon kerja".
Saya menduga bahwa pohon yang bekerja menyimpan informasi komit, cabang, dll dari proyek. Itu tidak akan muncul di repo telanjang. Jadi sepertinya lebih baik bagi saya untuk "mendorong" komitmen ke repo dengan pohon yang berfungsi.
Lalu, mengapa saya harus menggunakan repositori telanjang dan mengapa tidak? Apa perbedaan praktisnya? Itu tidak akan bermanfaat bagi lebih banyak orang yang mengerjakan suatu proyek, saya kira.
Apa metode Anda untuk jenis pekerjaan ini? Saran?
sumber
git clone
Anda dapat dengan bebas mengkonversi antara repositori kosong dan tidak kosong.git clone --bare
Anda akan mendapatkan repo telanjang, dan jika Anda menjalankangit clone
, Anda akan mendapatkan yang tidak telanjang. Setiap proyek publik yang pernah Anda kloning (dihosting di github, misalnya) adalah repositori kosong di ujung yang lain.Jawaban:
Perbedaan lain antara repositori telanjang dan non-telanjang adalah bahwa repositori telanjang tidak memiliki repositori asal asli remote :
Dari halaman manual untuk
git clone --bare
:Agaknya, ketika itu membuat repositori telanjang, Git mengasumsikan bahwa repositori telanjang akan berfungsi sebagai repositori asal untuk beberapa pengguna jarak jauh, sehingga tidak membuat asal-usul jauh default. Apa artinya ini adalah bahwa dasar
git pull
dangit push
operasi tidak akan berfungsi karena Git mengasumsikan bahwa tanpa ruang kerja, Anda tidak bermaksud melakukan perubahan apa pun pada repositori kosong:sumber
git clone --no-checkout
dapat membuat repositori non-telanjang tanpa file ruang kerja juga.git init
, yang akan membuat repo non-telanjang tanpa ditentukan jarak jauh.clone
diedit. Jika sudahinit
diedit secara lokal, itu tidak akan memiliki asal seperti itu. Ini tidak ada hubungannya dengan apakah itu telanjang atau tidak.Perbedaan antara repositori telanjang dan non-telanjang adalah buatan dan menyesatkan karena ruang kerja bukan bagian dari repositori dan repositori tidak memerlukan ruang kerja. Sebenarnya, repositori Git mencakup objek-objek yang menggambarkan status repositori. Objek-objek ini mungkin ada di direktori mana pun, tetapi biasanya ada di
.git
direktori di direktori tingkat atas ruang kerja. Ruang kerja adalah pohon direktori yang mewakili komit tertentu di repositori, tetapi mungkin ada di direktori mana pun atau tidak sama sekali. Variabel lingkungan$GIT_DIR
menautkan ruang kerja ke repositori tempat asalnya.Perintah Git
git clone
dangit init
keduanya memiliki opsi--bare
yang membuat repositori tanpa ruang kerja awal. Sangat disayangkan bahwa Git mengonfigurasi dua terpisah, tetapi konsep terkait ruang kerja dan repositori dan kemudian menggunakan istilah membingungkan telanjang untuk memisahkan dua ide.sumber
Repositori kosong hanyalah folder .git itu sendiri yaitu isi repositori kosong sama dengan isi folder .git di dalam repositori kerja lokal Anda.
sumber
5 tahun terlambat, saya tahu, tetapi tidak ada yang benar-benar menjawab pertanyaan:
Mengutip langsung dari buku Loeliger / MCullough (978-1-449-31638-9, p196 / 7):
sumber
Repositori non-telanjang hanya memiliki pohon kerja check-out. Pohon kerja tidak menyimpan informasi apa pun tentang keadaan repositori (cabang, tag, dll.); alih-alih, pohon yang berfungsi hanyalah representasi dari file aktual dalam repo, yang memungkinkan Anda untuk mengerjakan (mengedit, dll.) file.
sumber
git clone --no-checkout
. Dalam hal ini, repositori non-telanjang memiliki lokasi untuk ruang kerja, tetapi Git tidak memeriksa file apa pun ke dalam ruang kerja tersebut.Repositori kosong memiliki manfaat di
sumber
Repositori non telanjang memungkinkan Anda untuk (ke dalam pohon kerja Anda) menangkap perubahan dengan membuat komit baru.
Repositori kosong hanya diubah dengan mentransportasikan perubahan dari repositori lain.
sumber
Saya tentu saja bukan "pakar" Git. Saya telah menggunakan TortoiseGit untuk sementara waktu, dan bertanya-tanya apa yang dibicarakan ketika bertanya apakah saya ingin membuat repo "telanjang" setiap kali saya membuatnya. Saya membaca tutorial ini: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init dan membahas masalah ini, tetapi saya masih belum cukup memahami konsepnya. Yang ini banyak membantu: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html . Sekarang, yang pertama juga masuk akal!
Menurut sumber-sumber ini, singkatnya repo "telanjang" digunakan pada server tempat Anda ingin mengatur titik distribusi. Itu tidak dimaksudkan untuk digunakan pada mesin lokal Anda. Anda biasanya mendorong komit dari mesin lokal Anda ke repo telanjang di server jarak jauh, dan Anda dan / atau orang lain menarik dari repo telanjang itu ke mesin lokal Anda. Jadi GitHub, Assembla, dll. Repo penyimpanan / distribusi jarak jauh Anda adalah contoh di mana repo "telanjang" dibuat. Anda akan membuatnya sendiri jika sedang menyiapkan "pusat berbagi" analog Anda sendiri.
sumber
Repo Git default / non-telanjang berisi dua bagian negara:
The snapshot adalah apa yang mungkin Anda anggap sebagai proyek Anda: file Anda kode, membangun file, script helper, dan apa pun versi Anda dengan Git.
The sejarah adalah negara yang memungkinkan Anda untuk memeriksa berbeda komit dan mendapatkan gambaran lengkap dari apa file dalam repositori Anda tampak seperti ketika yang komit ditambahkan. Ini terdiri dari sekelompok struktur data yang internal untuk Git yang mungkin belum pernah Anda berinteraksi secara langsung. Yang penting, sejarah tidak hanya menyimpan metadata (mis. "Pengguna U menambahkan banyak baris ini ke File F pada Waktu T sebagai bagian dari Komit C"), tetapi juga menyimpan data (mis. "Pengguna U menambahkan baris yang tepat ini ke File F" ).
Gagasan kunci dari repositori kosong adalah bahwa Anda sebenarnya tidak perlu memiliki snapshot. Git membuat snapshot tetap ada karena nyaman bagi manusia dan proses non-Git lainnya yang ingin berinteraksi dengan kode Anda, tetapi snapshot itu hanya menduplikasi keadaan yang sudah ada dalam sejarah.
Sebuah repositori telanjang adalah repositori Git yang tidak memiliki snapshot. Itu hanya menyimpan sejarah.
Mengapa Anda menginginkan ini? Nah, jika Anda hanya akan berinteraksi dengan file Anda menggunakan Git (yaitu, Anda tidak akan mengedit file Anda secara langsung atau menggunakannya untuk membangun yang dapat dieksekusi), Anda dapat menghemat ruang dengan tidak menyimpan snapshot. Khususnya, jika Anda mempertahankan versi repo terpusat pada server di suatu tempat (yaitu Anda pada dasarnya hosting GitHub Anda sendiri), server itu mungkin harus memiliki repo telanjang (Anda masih akan menggunakan repo non-telanjang pada Anda mesin lokal, karena Anda mungkin ingin mengedit snapshot Anda).
Jika Anda menginginkan penjelasan yang lebih mendalam tentang repo telanjang dan contoh penggunaan lainnya, saya menulis posting blog di sini: https://stegosaurusdormant.com/bare-git-repo/
sumber
Ini bukan jawaban baru, tetapi itu membantu saya untuk memahami berbagai aspek dari jawaban di atas (dan itu terlalu banyak untuk dikomentari).
Menggunakan Git Bash coba saja:
Sama dengan
git --bare
:sumber
$ git help repository-layout
sumber