it-swarm-id.com

Apa perbedaan antara "git init" dan "git init --bare"?

Apa perbedaan antara git init dan git init --bare? Saya menemukan bahwa banyak posting blog memerlukan --bare untuk server Git mereka?

Dari halaman manual , dikatakan:

--bare

Buat repositori kosong. Jika lingkungan GIT_DIR tidak disetel, itu diatur ke direktori kerja saat ini

Tapi apa sebenarnya artinya? Apakah harus memiliki --bare untuk pengaturan server Git?

150
Kit Ho

Repo Git Non-Bare

Varian ini membuat repositori dengan direktori yang berfungsi sehingga Anda dapat benar-benar bekerja (git clone). Setelah membuatnya, Anda akan melihat bahwa direktori tersebut berisi folder .git tempat sejarah dan semua pipa led git berjalan. Anda bekerja pada level di mana folder .git berada.

Bare Git Repo

Varian lainnya membuat repositori tanpa direktori yang berfungsi (git clone --bare). Anda tidak mendapatkan direktori tempat Anda bisa bekerja. Segala sesuatu dalam direktori sekarang adalah apa yang terkandung dalam folder .git dalam kasus di atas.

Mengapa Anda Akan Menggunakan Satu vs. Lainnya

Kebutuhan untuk repositori git tanpa direktori yang berfungsi adalah fakta bahwa Anda dapat mendorong cabang ke sana dan tidak mengelola apa yang sedang dikerjakan seseorang. Anda masih bisa Push ke repositori yang tidak kosong, tetapi Anda akan ditolak karena Anda berpotensi memindahkan cabang yang sedang dikerjakan seseorang di direktori kerja itu.

Jadi dalam sebuah proyek tanpa folder yang berfungsi, Anda hanya dapat melihat objek ketika git menyimpannya. Mereka dikompresi dan diserialisasi dan disimpan di bawah SHA1 (hash) dari isinya. Untuk mendapatkan objek dalam repositori kosong, Anda perlu git show dan kemudian tentukan sha1 objek yang ingin Anda lihat. Anda tidak akan melihat struktur seperti apa proyek Anda.

Repositori telanjang biasanya adalah repositori sentral tempat setiap orang memindahkan pekerjaannya. Tidak perlu memanipulasi pekerjaan yang sebenarnya. Ini adalah cara untuk menyinkronkan upaya antara banyak orang. Anda tidak akan dapat langsung melihat file proyek Anda.

Anda mungkin tidak memiliki kebutuhan untuk repositori telanjang jika Anda adalah satu-satunya yang mengerjakan proyek atau Anda tidak ingin/memerlukan repositori "secara logis sentral". Seseorang lebih suka git pulldari repositori lain dalam kasus itu. Ini menghindari keberatan yang dimiliki git ketika mendorong repositori yang tidak telanjang.

Semoga ini membantu

129
Adam Dymitruk

Jawaban singkat

Repositori kosong adalah repositori git tanpa copy yang berfungsi, oleh karena itu konten .git adalah level teratas untuk direktori itu.

Gunakan repositori non-telanjang untuk bekerja secara lokal dan repositori kosong sebagai server/hub pusat untuk membagikan perubahan Anda dengan orang lain. Misalnya, ketika Anda membuat repositori di github.com, itu dibuat sebagai repositori kosong.

Jadi, di komputer Anda:

git init
touch README
git add README
git commit -m "initial commit"

di server:

cd /srv/git/project
git init --bare

Kemudian pada klien, Anda Push:

git Push [email protected]:/srv/git/project master

Anda kemudian dapat menyimpan sendiri pengetikan dengan menambahkannya sebagai remote.

Repositori di sisi server akan mendapatkan komit melalui tarikan dan Push, dan tidak dengan Anda mengedit file dan kemudian melakukannya di mesin server, oleh karena itu repositori kosong.

Detail

Anda dapat Push ke repositori yang bukan repositori kosong, dan git akan mengetahui bahwa ada repositori .git di sana, tetapi karena sebagian besar repositori "hub" tidak memerlukan copy pekerjaan, biasanya menggunakan repositori kosong untuk dan direkomendasikan karena tidak ada gunanya memiliki copy pekerjaan di repositori semacam ini.

Namun, jika Anda Push ke repositori non telanjang, Anda membuat copy pekerjaan tidak konsisten, dan git akan memperingatkan Anda:

remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.

Anda dapat melewati peringatan ini. Tetapi pengaturan yang disarankan adalah: gunakan repositori non-telanjang untuk bekerja secara lokal dan repositori telanjang sebagai hub atau server pusat untuk Dorong dan tarik.

Jika Anda ingin berbagi pekerjaan secara langsung dengan copy pekerjaan pengembang lain, Anda dapat menarik satu sama lain dari repositori alih-alih mendorong.

102
duncan

Ketika saya membaca pertanyaan ini beberapa waktu lalu, semuanya membingungkan saya. Saya baru saja mulai menggunakan git dan ada copy pekerjaan ini (yang tidak berarti apa-apa saat itu). Saya akan mencoba menjelaskan ini dari sudut pandang lelaki itu, yang baru saja mulai git tanpa tahu tentang terminologi.

Contoh perbedaan yang bagus dapat dijelaskan dengan cara berikut :

--bare memberi Anda hanya tempat penyimpanan (Anda tidak dapat mengembangkannya di sana). Tanpa --bare ini memberi Anda kemampuan untuk berkembang di sana (dan memiliki tempat penyimpanan).

git init membuat repositori git dari direktori Anda saat ini. Ia menambahkan folder .git di dalamnya dan memungkinkan untuk memulai riwayat revisi Anda.

git init --bare juga membuat repositori, tetapi tidak memiliki direktori yang berfungsi. Ini berarti bahwa Anda tidak dapat mengedit file, melakukan perubahan Anda, menambahkan file baru di repositori itu.

Kapan --bare dapat membantu? Anda dan beberapa orang lainnya sedang mengerjakan proyek dan menggunakan git. Anda meng-host proyek di beberapa server (Amazon ec2). Anda masing-masing memiliki mesin Anda sendiri dan Anda Push kode Anda pada ec2. Tak satu pun dari Anda yang benar-benar mengembangkan apa pun di ec2 (Anda menggunakan mesin Anda) - Anda cukup menekan kode Anda. Jadi ec2 Anda hanyalah penyimpanan untuk semua kode Anda dan harus dibuat sebagai --bare dan semua mesin Anda tanpa --bare (kemungkinan besar hanya satu, dan yang lainnya hanya akan mengkloning semuanya). Alur kerjanya terlihat seperti ini:

enter image description here

57
Salvador Dali

Repositori default Git mengasumsikan bahwa Anda akan menggunakannya sebagai direktori kerja Anda. Biasanya, ketika Anda berada di server, Anda tidak perlu memiliki direktori yang berfungsi. Hanya repositori. Dalam hal ini, Anda harus menggunakan opsi --bare.

14
Sandro Munda

Repositori non-telanjang adalah default. Ini adalah apa yang dibuat ketika Anda menjalankan git init, atau apa yang Anda dapatkan ketika Anda mengkloning (tanpa opsi bare) dari server.

Ketika Anda bekerja dengan repositori seperti ini, Anda bisa melihat dan mengedit semua file yang ada di repositori. Saat Anda berinteraksi dengan repositori - misalnya dengan melakukan perubahan - Git menyimpan perubahan Anda di direktori tersembunyi bernama .git.

Ketika Anda memiliki server git, tidak perlu menyalin file-file tersebut. Yang Anda butuhkan hanyalah data Git yang disimpan di .git. Repositori kosong adalah direktori .git persis, tanpa area kerja untuk memodifikasi dan melakukan file.

Ketika Anda mengkloning dari server, Git memiliki semua informasi yang diperlukan di direktori .git untuk membuat copy pekerjaan Anda.

11
Andrew