Cara mengkonfigurasi repo git yang ada untuk dibagikan oleh grup UNIX

98

Saya memiliki repo git (yang kosong) yang sampai saat ini hanya dapat ditulis oleh saya. Saya ingin membukanya untuk beberapa grup pengguna UNIX, foo, sehingga semua anggota foo dapat mendorongnya. Saya sadar bahwa saya dapat dengan mudah menyiapkan repo git baru dengan:

git init --bare --shared=group repodir
chgrp -R foo repodir

Tetapi saya membutuhkan operasi yang setara untuk direktori repo yang ada .

Pistos
sumber
4
Ada jawaban yang sangat bagus untuk pertanyaan ini di ServerFault (situs StackOverflow lain).
Zearin

Jawaban:

114

Coba ini untuk membuat repositori yang ada repodirberfungsi untuk pengguna dalam grup foo:

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")
David Underhill
sumber
14
Saya akan menambahkan bahwa Anda mungkin juga harus menyetel config.sharedRepository = true dalam konfigurasi repo. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos
1
Ini cukup dekat dengan apa yang saya lakukan sendiri, tetapi saya ingin mendapatkan konfirmasi eksternal. Terima kasih. :) Saya juga berharap akan ada git clone --shared = group semacam itu, tapi opsi clone - shared melakukan sesuatu yang sama sekali berbeda.
Pistos
5
Anda dapat menggunakan git init --sharedperintah pada repo yang ada untuk menyetel nilai konfigurasi. Anda juga perlu melakukan chmodperintah untuk mendapatkan izin file dengan benar.
Spencer
1
Untuk mengkonfirmasi ini juga membantu jika Anda dalam kekacauan karena seseorang telah melakukan git pulldll sebagai root daripada sebagai www-dataatau apapun pemiliknya dan sebagai hasilnya Anda dapatkan error: insufficient permission for adding an object to repository database .git/objects. Saya pikir saya telah memperbaiki kepemilikan semua file / direktori yang salah dengan menggunakan finddan -type d/ type -f, tetapi hanya metode ini yang menghilangkan kesalahan (mungkin karena file di beberapa subdirektori tidak dapat ditulisi grup?)
William Turrell
2
Umask pengguna tampaknya masih berlaku untuk file yang baru dibuat. Apa itu yang kamu harapkan? Saya akan berpikir dokumentasi core.sharedRepositoryakan menyebutkan ini - tampaknya tidak berguna tanpa pengguna membuat semua grup file mereka dapat ditulisi.
Sam Brightman
47

Di repo dir jalankan perintah berikut:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

Edit: Untuk mengatasi kebingungan yang sering terjadi, groupini adalah kata kunci yang sebenarnya, Anda tidak boleh mengganti ini dengan nama grup.

kixorz.dll
sumber
25
Dimana groupBUKAN nama grup :)
Pierre de LESPINAY
7
File objek dan paket harus tidak dapat diubah; mereka harus memiliki izin 444 / r - r - r--.
CB Bailey
3
Setelah mencoba git config core.sharedRepository devkemudian mengetik git configsaya mendapatkan fatal: bad config value for 'core.sharedrepository' in .git/configdi git version 1.7.0.4(dan mungkin versi setelah)
Kzqai
3
git config core.sharedRepository group groupbukanlah nama grup, tetapi nilai sebenarnya!
kixorz
Jika Anda membuat kesalahan dengan menggunakan nama grup alih-alih "grup", cukup buka .git / config di editor teks dan edit baris core.sharedRepository untuk mengatakan "grup".
Tom
43

Menggabungkan jawaban @David Underhill dan @kixorz , saya membuat solusi (definitif) saya sendiri.

Ini untuk repo telanjang dan repo non-telanjang . Hanya ada sedikit perbedaan di antara mereka, tetapi cara ini lebih jelas.

REPOSITORI BARE

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w objects/pack/*                  # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

dimana:

  • <repo.git>adalah direktori repositori kosong, biasanya di server (mis my_project.git/.).
  • <group-name>adalah nama grup untuk pengguna git (mis. pengguna ).

REPOSITORI NON-BARE

cd <project_dir>/                         # Enter inside the project directory
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w .git/objects/pack/*             # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

dimana:

  • <project_dir>adalah direktori proyek yang berisi .gitfolder tersebut.
  • <group-name>adalah nama grup untuk pengguna git (mis. pengguna ).
Andrea
sumber
Seperti yang dikatakan Charles, lakukan juga: chmod g-w objects/pack/*(jika repositori non-kosong, awali .git/)
Wernight
di sini bagaimana kita bisa menemukan nama grup atau cara membuat nama grup?
Sujithrao
'chmod g + s find . -type d' menimbulkan kesalahanunable to execute /bin/chmod: Argument list too long
Dr. X
Seperti yang dicatat oleh @ Dr.X, chmod g+s `find . -type d`tidak skala. Gunakanfind -type d -exec chmod g+s {} +
hagello
Saya pikir semua objek yang lepas juga harus hanya-baca berdasarkan status yang dibagikan sebelumnya. Mungkin seperti itu chmod g-w objects/*/*. Saya tidak yakin tentang subdirektori info karena repo ini kosong.
Eric
3

Ini mungkin tidak perlu, tetapi ada baiknya menunjukkan bahwa git init --bare --sharedjuga menyetel opsi denyNonFastForwards .

git config receive.denyNonFastForwards true

Arti dari opsi ini adalah sebagai berikut:

receive.denyNonFastForwards

Jika Anda me-rebase komit yang telah Anda dorong dan kemudian mencoba mendorong lagi, atau mencoba mendorong komit ke cabang jarak jauh yang tidak berisi komit yang saat ini ditunjuk oleh cabang jarak jauh, Anda akan ditolak. Ini umumnya merupakan kebijakan yang baik; tetapi dalam kasus rebase, Anda dapat menentukan bahwa Anda tahu apa yang Anda lakukan dan dapat memperbarui paksa cabang jarak jauh dengan tanda -f ke perintah push Anda.

(dari http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )

ahli nerfologi
sumber
1

Selain jawaban di atas untuk mengizinkan sebuah grup membaca / menulis, Anda juga perlu menambahkan pengguna ke grup (katakanlah "foo").

sudo usermod -a -G [groupname] [username]

Catatan: Anda harus terlebih dahulu membuat pengguna jika tidak ada

sarvagya kumar
sumber