pengembangan-web-mp.com

Bagaimana cara saya berbagi repositori Git dengan banyak pengguna di mesin?

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 juga ingin banyak orang menarik ke repositori itu. The git-clone 's --shared flag melakukan sesuatu yang sama sekali berbeda.

Apa cara termudah untuk mengubah izin repositori yang ada?

217
Andrey Fedorov

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 superior pemberian sekelompok pengembang kemampuan menulis.

Solusi Standar

Jika Anda menempatkan semua pengembang di grup yang dibuat khusus, Anda dapat, pada prinsipnya, lakukan saja:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

Kemudian ubah umask untuk pengguna menjadi 002, sehingga file baru dapat dibuat dengan izin yang dapat ditulis grup.

Masalah dengan ini adalah legiun; jika Anda berada di distro yang menganggap umask dari 022 (seperti memiliki grup users umum yang mencakup semua orang secara default), ini dapat membuka masalah keamanan di tempat lain. Dan cepat atau lambat, sesuatu akan mengacaukan skema izin yang Anda buat dengan hati-hati, membuat repo tidak aktif sampai Anda mendapatkan root akses dan memperbaikinya (mis., 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:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

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.

193
womble

jika Anda membuat repositori (atau mengkloning repo telanjang yang sudah ada) dengan

$ git init --shared=group 

atau

$ git init --shared=0NNN

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 membutuhkan pengelolaan 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 saya setiap menggunakannya secara pribadi.

122
user35117

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:

[core]
    sharedRepository = true

Ini akan memastikan bahwa pengaturan "umask" sistem Anda dihormati.

55
Niels Joubert

The Manual Pengguna Git 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.

22
jtimberman

Lihat juga gitolite untuk hosting repositori git Anda. Gitosis tampaknya tidak dikembangkan lagi.

9
mt3

Salah satu cara untuk memperbaiki izin dalam repositori bersama, sehingga pengguna tidak akan memiliki masalah izin saat mendorong, adalah 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 say my sharedgroup. Semua pengguna yang mendorong ke repositori itu harus milik mysharegroup juga. Sekarang buat file berikut (mengubah grup saya ke preferensi Anda):

/ myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
4
bkmks

Untuk mengumpulkan sedikit demi sedikit saran bagus dari berbagai jawaban dan komentar lain tentang menyiapkan repo baru:

Jika Anda menyiapkan repo baru myrepo di /srv/git untuk grup mygroup, inilah yang Anda inginkan:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. baris pertama membuat dir repo
  2. baris kedua mengatur grupnya menjadi mygroup
  3. baris ketiga menginisialisasi repo telanjang dengan konfigurasi berikut:
    1. core.bare = true: buat repo kosong
    2. core.sharedrepository = 1 (sama dengan core.sharedrepository = group): direktori repo dan semua direktori yang dibuat nanti akan dikelola oleh git untuk mengizinkan mygroup membaca, menulis, dan mengeksekusi izin (dengan bit sgid diatur juga - agar dapat bekerja dengan pengguna untuk siapa mygroup bukan grup utama mereka)
    3. receive.denyNonFastforwards = 1: tolak dorongan non-maju ke repo

Jika Anda ingin menyempurnakan izin pengguna, grup, atau pengguna lain, gunakan --shared=0NNN, di mana NNN adalah pengguna standar, grup, dan bit lain untuk file (bit eksekusi dan sgid 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):

git init --bare --shared=0640 /srv/git/myrepo.git

Ini memungkinkan akses baca dan tulis ke pengguna dan grup (dan tidak ada akses ke yang lain):

git init --bare --shared=0660 /srv/git/myrepo.git

Ini memungkinkan akses baca dan tulis ke pengguna dan grup, dan akses hanya baca ke yang lain:

git init --bare --shared=0664 /srv/git/myrepo.git

Perhatikan bahwa jika Anda tidak akan mengizinkan akses tulis ke grup, pastikan untuk terlebih dahulu menggunakan chown untuk mengatur pemilik repo, dan kemudian jalankan git init perintah sebagai pengguna itu (untuk memastikan repo diinisialisasi dengan pemilik yang benar untuk semua file awal dan sub-direktori).

3
Justin Ludwig

Anda dapat menggunakan git-daemon untuk berbagi repositori. Baca dokumentasi untuk git-daemon untuk informasi lebih lanjut.

EDIT:

Periksa juga artikel ini 8 cara berbagi repositori git Anda .

2
Vihang D

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:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
1
Luis de Arquer

@stevek_mcc jawaban adalah yang saya cari ketika saya mencari pertanyaan ini di Google

git clone --config core.sharedRepository=true
0
ragerdl