Mevcut bir git deposunu bir UNIX grubu tarafından paylaşılacak şekilde yapılandırma


98

Şu ana kadar sadece benim tarafımdan yazılabilir olan mevcut bir git repom (çıplak) var. Onu bir UNIX kullanıcı grubuna açmak istiyorum, foo, böylece foo'nun tüm üyeleri ona itebilir. Aşağıdakilerle kolayca yeni bir git deposu kurabileceğimin farkındayım :

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

Ancak mevcut bir repo dizini için eşdeğer işleme ihtiyacım var .


4
Orada bu soruya mükemmel cevap ServerFault (başka bir StackOverflow site) üzerinde bitti.
Zearin

Yanıtlar:


116

repodirGruptaki kullanıcılar için çalışmak üzere mevcut bir arşiv yapmak için bunu deneyin 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")

14
Muhtemelen deponun yapılandırmasında config.sharedRepository = true ayarlamanız gerektiğini de ekleyeceğim. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos

1
Bu, kendi başıma yaptığım şeye oldukça yakın, ancak bazı dış onaylar almak istedim. Teşekkürler. :) Ayrıca git klonu --shared = grup gibi bir şey olacağını umuyordum, ama klonun --shared seçeneği tamamen farklı bir şey yapıyor.
Pistos

5
git init --sharedYapılandırma değerini ayarlamak için mevcut bir depodaki komutu kullanabilirsiniz . chmodDosyaların izinlerini doğru bir şekilde almak için komutu da yapmanız gerekir .
Spencer

1
Bunu onaylamak, bir karmaşa içindeyseniz de yardımcı olur, çünkü biri, sahibi git pullolarak www-dataveya her ne ise ve bunun sonucunda elde ettiğinizden ziyade kök olarak vb error: insufficient permission for adding an object to repository database .git/objects. Yanlış olan tüm dosyaların / dizinlerin sahipliğini findve -type d/ kullanarak düzelteceğimi düşündüm type -f, ancak yalnızca bu yöntem hatayı giderdi (olasılık çünkü bazı alt dizindeki bir dosya grup yazılabilir değil miydi?)
William Turrell

2
Kullanıcının umask değeri yeni oluşturulan dosyalara hala uygulanıyor gibi görünüyor. Beklediğiniz bu mu? Sanırım dokümantasyonunun core.sharedRepositorybundan bahsedeceğini düşünüyorum - kullanıcılar tüm dosya gruplarını yazılabilir hale getirmeden işe yaramaz görünüyor.
Sam Brightman

47

Repo dizininde aşağıdaki komutları yürütün:

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

Düzenleme: Sık sık kafa karışıklığını gidermek için, groupgerçek bir anahtar kelimedir, bunu grubun adıyla değiştirmemeniz gerekir.


26
groupGrubun adı nerede DEĞİLDİR :)
Pierre de LESPINAY

7
Nesne ve paket dosyaları değişmez olmalıdır; 444 / r - r - r-- izinlerine sahip olmaları gerekir.
CB Bailey

3
Denedikten sonra git config core.sharedRepository devsonra yazmaya git configElde fatal: bad config value for 'core.sharedrepository' in .git/configiçinde git version 1.7.0.4(ve muhtemelen versiyonları sonra)
Kzqai

3
git config core.sharedRepository group groupgrubun adı değil, gerçek değerdir!
kixorz

"Grup" yerine grup adınızı kullanma hatası yaptıysanız, metin düzenleyicide .git / config'i açın ve core.sharedRepository satırını "grup" olarak düzenleyin.
Tom

46

@David Underhill ve @kixorz cevaplarını birleştirerek , kendi (kesin) çözümümü yaptım.

Bu içindir çıplak repo ve olmayan çıplak repo. Aralarında çok az fark var ama bu şekilde daha net.

Çıplak DEPO

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

nerede:

  • <repo.git>tipik olarak sunucudaki (örneğin my_project.git/) çıplak depo dizinidir .
  • <group-name>git kullanıcıları için grup adıdır (örneğin kullanıcılar ).

Çıplak Olmayan Depo

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

nerede:

  • <project_dir>.gitklasörü içeren proje dizinidir .
  • <group-name>git kullanıcıları için grup adıdır (örneğin kullanıcılar ).

Charles'ın dediği gibi, şunu da yapın: chmod g-w objects/pack/*(çıplak depo değilse, başa ekleyin .git/)
Wernight

burada grup adını nasıl bulabiliriz veya grup adını nasıl oluşturabiliriz?
Sujithrao

'chmod g + s find . -type d' hatayı artırıyorunable to execute /bin/chmod: Argument list too long
Dr.X

@ Dr.X'in belirttiği gibi, chmod g+s `find . -type d`ölçeklenmiyor. Kullanımfind -type d -exec chmod g+s {} +
hagello

Tüm gevşek nesnelerin de önceden paylaşılan duruma göre salt okunur olması gerektiğini düşünüyorum. Belki gibi bir şey chmod g-w objects/*/*. Bu depo için boş olduğu için bilgi alt dizininden emin değilim.
Eric

3

Bu muhtemelen gerekli değildir, ancak bunun git init --bare --sharedaynı zamanda denyNonFastForwards seçeneğini belirlediğini belirtmek gerekir .

git config receive.denyNonFastForwards true

Bu seçeneğin anlamı aşağıdaki gibidir:

receive.denyNonFastForwards

Zaten ittiğiniz taahhütleri yeniden temellerseniz ve ardından tekrar itmeyi denerseniz veya başka bir şekilde uzak şubenin şu anda işaret ettiği taahhüdü içermeyen bir uzak şubeye bir taahhüt göndermeye çalışırsanız reddedilirsiniz. Bu genellikle iyi bir politikadır; ancak yeniden temelde, ne yaptığınızı bildiğinizi belirleyebilir ve uzak dalı push komutunuza bir -f bayrağıyla zorla güncelleyebilirsiniz.

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


1

Bir grubun okumasına / yazmasına izin vermenin yukarıdaki cevaplarına ek olarak, kullanıcıyı gruba eklemeniz de gerekir ("foo" deyin).

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

Not: yoksa önce kullanıcı oluşturmanız gerekecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.