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


Saya memiliki repositori Git di server pementasan yang harus dapat ditarik oleh beberapa pengembang. git-init tampaknya memiliki bendera yang sangat dekat dengan yang saya cari: --shared, kecuali saya ingin beberapa orang menarik ke repositori itu, juga. Itu git-clone's --shared bendera melakukan sesuatu yang sangat berbeda.

Apa cara termudah untuk mengubah izin repositori yang ada?


201
2018-06-17 01:04




Saya menggunakan "Github untuk Windows" dan beralih di antara dua akun Github: stackoverflow.com/questions/18565876/… - Alisa


Jawaban:


Izin adalah hama.

Pada dasarnya, Anda perlu memastikan bahwa semua pengembang dapat menulis ke semua yang ada di git repo.

Lewati ke The New-Wave Solution untuk metode unggul dalam memberikan sekelompok kemampuan menulis pengembang.

Solusi Standar

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

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

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

Masalah dengan ini adalah legiun; jika Anda berada di distro yang mengasumsikan a umask dari 022 (seperti memiliki kesamaan users grup yang mencakup semua orang secara default), ini dapat membuka masalah keamanan di tempat lain. Dan cepat atau lambat, sesuatu akan mengacaukan skema perizinan yang dibuat dengan hati-hati, membuat repo tidak beraksi sampai Anda mendapatkannya root akses dan perbaiki (mis. menjalankan kembali perintah di atas).

Solusi Gelombang Baru

Solusi superior — meskipun kurang dipahami dengan baik, dan yang membutuhkan sedikit dukungan OS / alat — adalah dengan menggunakan atribut POSIX yang diperluas. Saya baru datang ke daerah ini baru-baru ini, jadi pengetahuan saya di sini tidak sepanas mungkin. Tetapi pada dasarnya, ACL yang diperpanjang adalah kemampuan untuk mengatur izin pada lebih dari hanya 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 menetapkan ACL diperpanjang untuk grup sehingga anggota grup dapat membaca / menulis / mengakses file apa saja yang sudah ada (baris pertama); kemudian, beri tahu semua direktori yang ada bahwa file baru harus memiliki penerapan ACL yang sama ini (baris kedua).

Harapan yang membuat Anda di jalan.


171
2018-06-17 06:00



git init memiliki parameter yang disebut --shared yang menetapkan variabel core.sharedRepository untuk kerja kelompok. Anda juga dapat mengatur variabel pada repositori yang ada. Itu menghilangkan kebutuhan pengaturan umask secara manual karena git akan mengaturnya ke nilai waras sebelum memanipulasi file. - ptman
+1 untuk atribut diperpanjang POSIX - berita untuk saya! - RobM
Ketika saya melakukannya 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 g-s semua file. Untuk hanya mengatur bit setgid pada direktori, coba find /path/to/repo -type d -print0 | xargs -0 chmod g+s. Masih melakukan itu chgrp -R thegroup /path/to/repo. - rescdsk
chmod -R g+swX gitrepo akan menerapkan bit setguid ke file, yang merupakan risiko keamanan. Sebaliknya, Anda bisa menggunakannya find . -type d -exec chmod g+s {} + untuk menerapkannya hanya ke direktori. - Ian Dunn
ACL (setfacl) tidak memiliki pengaturan untuk setgid untuk menegakkan file baru dan subdirektori yang dibuat dalam direktori untuk mewarisi ID grupnya. Oleh karena itu, Anda harus mengatur setgid secara terpisah melalui chmod. Git's - opsi berbagi (git-scm.com/docs/git-init), namun, memungkinkan Anda untuk mengatur dan mengganti umask pengguna. - Chase T.


jika Anda membuat repositori (atau mengkloning repo kosong baru dari yang sudah ada) dengan

$ git init --shared=group 

atau

$ git init --shared=0NNN

Git seharusnya menangani perizinan di atas dan melampaui apa yang disediakan umask default Anda. Akhirnya ini benar pada versi saya Git (1.6.3). Tentu saja ini mengasumsikan pengguna Anda berada di grup yang sama.

Jika saya membutuhkan manajemen pengguna dalam beberapa grup dengan berbagai tingkat baca / tulis, saya akan menggunakan gitosis. Saya juga pernah mendengar menyebutkan gitolite (http://github.com/sitaramc/gitolite), garpu gitosis yang disuport untuk memberikan izin tingkat cabang, tidak bisa mengatakan saya sudah menggunakannya secara pribadi.


113
2018-02-17 05:40



Ini jelas merupakan jawaban yang benar. - ELLIOTTCABLE
Saya memiliki masalah ini dan ini adalah jawaban terbaik. Satu-satunya masalah adalah bahwa --shared argumen mengambil oktal, bukan heksadesimal. Saya telah mengkonfirmasi ini di sumber Git 1.7.8 dan contoh kedua seharusnya git init --shared=0NNN. - qpingu
apa yang NNN— Topeng jabatan atau nomor kelompok atau sesuatu yang lain? - Craig McQueen
BTW, "grup" di atas adalah kata kunci, bukan placeholder untuk nama grup Anda. Anda menetapkan grup menggunakan perintah chgrp. Untuk repo baru itu git init --bare --shared=group myproj di mana myproj adalah nama repo Anda, diikuti oleh chgrp -R mygroup myproj di mana mygroup adalah nama grup Anda. - labradort
Menuju ke atas bahwa jika pengguna membuat komitmen ketika grup default mereka berbeda dari yang seharusnya, ini dapat mengacaukan semuanya. Untuk memperbaiki masalah ini, Anda perlu setiap pengguna untuk menyalin setiap file yang mereka miliki di repo ke grup yang tepat. Ini akan berulang kecuali Anda mengetahui cara membuat semua orang membuat / mengganti file baru di bawah / ke grup yang tepat sebelum melakukan dan mendorong. - ragerdl


Ini belum dikatakan, jadi saya ingin cepat menambahkannya.

Untuk memastikan bahwa masalah perizinan tidak memangkas kepala jelek mereka, pastikan untuk mengatur hal berikut pada file konfigurasi repositori bersama git Anda:

[core]
    sharedRepository = true

Ini akan memastikan bahwa pengaturan "umask" pada sistem Anda dihargai.


50
2018-03-09 05:52



Menurut git-config (1) (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository, Anda perlu mengatur ini ke "umask" atau "false" agar menghargai umask pengguna. - David Schmitt
Jawaban ini dan user35117 sudah benar. Perhatikan bahwa "benar" sama dengan "grup", dan ini dapat diatur dengan perintah git config core.sharedRepository true. - ColinM
Apakah itu masih mengubah kepemilikan file ketika didorong ke remote? - Duc Tran
Jika Anda ingin mengatur ini ketika kloning daripada setelah fakta, setara dengan git init --sharedaku s git clone --config core.sharedRepository=true. Aneh dari git untuk digunakan --shared untuk makna yang berbeda seperti itu dalam perintah serupa. - stevek_mcc


Itu Git User Manual menjelaskan cara melakukannya berbagi repositori dalam beberapa cara.

Lebih rumit, meskipun cara-cara lengkap untuk berbagi repositori adalah:

Kami menggunakan GitHub untuk tim dari 6 pengembang.


21
2018-06-17 07:35



Saya suka Gitosis. Ini cara yang cukup efektif untuk mengontrol akses berdasarkan kunci publik. - Mike Mazur
Bagaimana solusi-solusi ini memecahkan masalah "Saya ingin banyak orang menarik ke repositori itu"? - womble♦
lihatlah gitosis. yang satu itu memecahkan masalah Anda. - pilif
Ketika Anda berbagi repositori, orang akan dapat menariknya. Mereka mungkin perlu mengkloningnya, atau menambahkan cabang jarak jauh. Dokumentasi yang saya hubungkan akan sangat jelas membimbing Anda dalam memecahkan masalah Anda; Saya telah menggunakan semua metode yang dijelaskan untuk membantu pengembang mengkolaborasikan kode sumber dengan Git. Setahu saya ServerFault bukan untuk pegangan. - jtimberman
Saya harus setuju dengan menggunakan Gitosis. Ia mendapat sekitar masalah izin dengan menggunakan satu akun yang dikonfirmasi oleh beberapa kunci SSH. Ini juga dikelola sepenuhnya sendiri melalui git commit. - Jeremy Bouse


Juga lihat gitolite untuk hosting repositori git Anda. Gitosis tampaknya tidak dikembangkan lagi.


9
2018-01-19 08:55





Salah satu cara untuk memperbaiki izin dalam repositori bersama, sehingga pengguna tidak akan memiliki masalah izin ketika mendorong, adalah membuat skrip hook pasca-pembaruan yang akan melakukan hal itu. Ini harus bekerja dalam versi git apa pun.

Misalkan Anda memiliki repositori bersama di /myrepo.git. Semua file dalam repositori itu adalah milik mysharedgroup. Semua pengguna yang mendorong penyimpanan itu seharusnya menjadi milik mysharedgroup juga. Sekarang buat file berikut (berubah mysharedgroup untuk preferensi Anda):

/myrepo.git/hooks/post-update

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

4
2017-09-27 14:35



jawaban yang benar ketika pengguna memiliki grup default yang berbeda - Pat
Mengatur bit setgid pada direktori akan menyebabkan file yang dibuat pengguna untuk mewarisi kepemilikan grup yang sama dengan direktori (jika pengguna termasuk dalam grup itu). Bahkan jika itu bukan grup default pengguna. Maka hook ini tidak diperlukan. Inilah jawaban dari @womble (dan komentar saya tentang hal itu). - rescdsk
Pada mesin centos7 saya, setelah mencoba setiap solusi yang tercantum di halaman ini, varian dari solusi @ bkmks di atas adalah satu-satunya opsi yang benar-benar berfungsi (pengaturan kait pasca-penggabungan dan pasca-pembayaran bukan pasca-pembaruan seperti di atas). - Mike Godin


Untuk mengumpulkan bit dan potongan nasihat yang baik dari berbagai jawaban dan komentar lain tentang menyiapkan repo baru:

Jika Anda menyiapkan repo baru myrepo di /srv/git untuk grup mygroup, ini 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 menetapkan grupnya ke mygroup
  3. baris ketiga menginisialisasi repo telanjang dengan konfigurasi berikut:
    1. core.bare = true: menjadikannya repo telanjang
    2. core.sharedrepository = 1 (sama dengan core.sharedrepository = group): direktori repo dan semua direktori yang dibuat di dalamnya akan dikelola oleh git untuk diizinkan mygroup membaca, menulis, dan mengeksekusi perizinan (dengan bit sgid yang ditetapkan juga - sehingga berfungsi dengan pengguna untuk siapa mygroup bukan grup utama mereka)
    3. receive.denyNonFastforwards = 1: menolak non fast-forward mendorong ke repo

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

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

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

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

Ini memungkinkan akses baca dan tulis ke pengguna dan grup, dan akses hanya-baca ke lainnya:

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

Perhatikan bahwa jika Anda tidak akan mengizinkan akses tulis ke grup, pastikan untuk pertama kali menggunakannya 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
2018-05-26 01:24



Lebih benar daripada tanggapan suara yang lebih tinggi. - XO01


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

EDIT:

Baca juga artikel ini 8 cara untuk berbagi repositori git Anda.


2
2018-06-17 02:58





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
2017-12-13 12:44