Saya memiliki repositori Git pada server pementasan yang beberapa pengembang harus dapat menariknya. git-init
tampaknya memiliki bendera yang sangat dekat dengan apa yang saya cari --shared
:, kecuali saya ingin beberapa orang menarik ke repositori itu, juga. The git-clone
's --shared
bendera melakukan sesuatu yang sama sekali berbeda.
Apa cara termudah untuk mengubah izin repositori yang ada?
permissions
git
users
share
Andrey Fedorov
sumber
sumber
Jawaban:
Izin adalah hama.
Pada dasarnya, Anda perlu memastikan bahwa semua pengembang tersebut dapat menulis ke semua yang ada di git repo.
Lewati ke The New-Wave Solution untuk metode unggul pemberian sekelompok kemampuan menulis pengembang.
Solusi Standar
Jika Anda menempatkan semua pengembang di grup yang dibuat khusus, Anda dapat, pada prinsipnya, lakukan saja:
Kemudian ubah
umask
untuk pengguna002
, sehingga file baru dapat dibuat dengan izin grup-bisa ditulis.Masalah dengan ini adalah legiun; jika Anda berada di sebuah distro yang mengasumsikan
umask
dari022
(seperti memiliki umumusers
kelompok yang mencakup semua orang secara default), ini dapat membuka masalah keamanan di tempat lain. Dan cepat atau lambat, sesuatu akan mengacaukan skema izin Anda yang dibuat dengan hati-hati, membuat repo tidak aktif sampai Anda mendapatkanroot
akses dan memperbaikinya (yaitu, menjalankan kembali perintah di atas).Solusi Gelombang Baru
Solusi superior — meskipun kurang dipahami dengan baik, dan yang membutuhkan sedikit lebih banyak dukungan OS / alat — adalah dengan menggunakan atribut extended POSIX. Saya hanya datang ke daerah ini baru-baru ini, jadi pengetahuan saya di sini tidak sepanas mungkin. Tetapi pada dasarnya, ACL yang diperluas adalah kemampuan untuk mengatur izin pada lebih dari 3 slot default (pengguna / grup / lainnya).
Jadi sekali lagi, buat grup Anda, lalu jalankan:
Ini mengatur ACL yang diperluas untuk grup sehingga anggota grup dapat membaca / menulis / mengakses file apa pun yang sudah ada (baris pertama); kemudian, beri tahu semua direktori yang ada bahwa file baru harus memiliki ACL yang sama ini diterapkan (baris kedua).
Harapan yang membuat Anda di jalan.
sumber
chmod -R g+swX
, itu membuat Git sangat tidak senang dan memutuskan itu bukan repositori git lagi ("repo tampaknya bukan repositori git"). Saya harus chmod gs semua file . Untuk hanya mengatur bit setgid pada direktori , cobafind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Masih melakukanchgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
akan menerapkan bit setguid ke file, yang merupakan risiko keamanan. Sebagai gantinya, Anda dapat menggunakannyafind . -type d -exec chmod g+s {} +
untuk menerapkannya hanya ke direktori.jika Anda membuat repositori (atau mengkloning repo telanjang yang sudah ada) dengan
atau
Git seharusnya menangani izin di atas dan di luar apa yang disediakan umask default Anda. Akhirnya ini benar pada versi Git saya (1.6.3). Tentu saja ini mengasumsikan pengguna Anda berada di grup yang sama.
Namun, jika saya memerlukan manajemen pengguna dalam beberapa grup dengan berbagai tingkat baca / tulis, saya akan menggunakan gitosis. Saya juga pernah mendengar penyebutan gitolite ( http://github.com/sitaramc/gitolite ), garpu gitosis yang dibuat-buat untuk memberikan izin tingkat cabang, tidak bisa mengatakan bahwa saya setiap menggunakannya secara pribadi.
sumber
--shared
argumen mengambil oktal, bukan heksadesimal. Saya telah mengkonfirmasi ini di sumber Git 1.7.8 dan contoh kedua seharusnyagit init --shared=0NNN
.NNN
— topeng misi atau nomor grup atau yang lainnya?git init --bare --shared=group myproj
tempat myproj adalah nama repo Anda, diikuti dengan dichgrp -R mygroup myproj
mana mygroup adalah nama grup Anda.Ini belum dikatakan, jadi saya ingin segera menambahkannya.
Untuk memastikan bahwa masalah izin tidak memotong kepala jeleknya, pastikan untuk mengatur yang berikut ini di file konfigurasi repositori git Anda yang dibagikan:
Ini akan memastikan bahwa pengaturan "umask" sistem Anda dihormati.
sumber
git config core.sharedRepository true
.git init --shared
adalahgit clone --config core.sharedRepository=true
. Strange of git digunakan--shared
untuk arti yang berbeda seperti itu dalam perintah yang serupa.The Git User Manual menjelaskan cara berbagi repositori dalam beberapa cara.
Lebih rumit, meskipun fitur penuh fitur untuk berbagi repositori adalah:
Kami menggunakan GitHub untuk tim yang terdiri dari 6 pengembang.
sumber
Lihat juga gitolite untuk hosting repositori git Anda. Gitosis tampaknya tidak dikembangkan lagi.
sumber
Salah satu cara untuk memperbaiki izin dalam repositori bersama, sehingga pengguna tidak akan memiliki masalah izin saat mendorong, adalah dengan membuat skrip kait pasca-pembaruan yang akan melakukan hal itu. Ini harus bekerja di semua versi git.
Misalkan Anda memiliki repositori bersama di / myrepo.git. Semua file di repositori itu milik mengatakan mysharegroup . Semua pengguna yang mendorong ke repositori itu juga harus menjadi anggota grup berbagi saya . Sekarang buat file berikut (ubah my sharedgroup ke preferensi Anda):
/myrepo.git/hooks/post-update
sumber
/dev/null
. Biarkan pengguna melihat pesan-pesan ini terlebih dahulu dan kemudian memutuskan sendiri.Untuk mengumpulkan sedikit demi sedikit saran bagus dari berbagai jawaban dan komentar lain tentang menyiapkan repo baru:
Jika Anda sedang menyiapkan merek repo baru
myrepo
di/srv/git
untuk grupmygroup
, ini adalah apa yang Anda inginkan:mygroup
core.bare = true
: buat repo kosongcore.sharedrepository = 1
(Sama seperticore.sharedrepository = group
): direktori repo dan semua direktori yang dibuat nanti di dalamnya akan dikelola oleh git untuk mengizinkanmygroup
membaca, menulis, dan mengeksekusi izin (dengan bit sgid diatur juga - sehingga dapat bekerja dengan pengguna yangmygroup
bukan milik mereka. grup utama)receive.denyNonFastforwards = 1
: deny non-forward fastes to the repoJika Anda ingin menyempurnakan izin pengguna, grup, atau pengguna lain, gunakan
--shared=0NNN
, di manaNNN
pengguna standar, grup, dan bit lain untuk file (bit eksekusi dan bit pada direktori akan dikelola dengan tepat oleh git). Misalnya, ini memungkinkan akses baca dan tulis ke pengguna, dan akses hanya baca ke grup (dan tidak ada akses ke yang lain):Ini memungkinkan akses baca dan tulis ke pengguna dan grup (dan tidak ada akses ke yang lain):
Ini memungkinkan akses baca dan tulis ke pengguna dan grup, dan akses hanya baca ke yang lain:
Perhatikan bahwa jika Anda tidak akan mengizinkan akses tulis ke grup, pastikan untuk pertama kali menggunakan
chown
untuk mengatur pemilik repo, dan kemudian jalankangit init
perintah sebagai pengguna (untuk memastikan repo diinisialisasi dengan pemilik yang benar untuk semua file awal dan sub-direktori).sumber
Anda dapat menggunakan git-daemon untuk berbagi repositori. Baca dokumentasi untuk git-daemon untuk informasi lebih lanjut.
SUNTING:
Periksa juga artikel ini 8 cara untuk membagikan repositori git Anda .
sumber
Melakukan hal ini bekerja untuk saya, untuk repositori yang ada. Ini membutuhkan saran dari beberapa jawaban dan komentar sebelumnya:
Dari direktori induk repositori Anda, di server:
sumber
@stevek_mcc jawaban adalah yang saya cari ketika saya mencari pertanyaan ini di Google
sumber