Git deposunu bir makinedeki birden fazla kullanıcıyla nasıl paylaşabilirim?


216

Birden çok geliştiricinin çekebilmesi gereken bir hazırlama sunucusunda Git deposuna sahibim. git-initaradığım şeye çok yakın bir bayrağa benziyor: --shareddışında birden fazla kişinin de bu depoya çekmesini istiyorum. git-clone'Nin --sharedbayrağı tamamen farklı bir şey yapar.

Mevcut bir havuzun izinlerini değiştirmenin en kolay yolu nedir?


"Windows için Github" kullanıyorum ve iki Github hesabı arasında geçiş yapıyorum: stackoverflow.com/questions/18565876/…
Alisa

Yanıtlar:


186

İzinler bir haşeredir.

Temel olarak, bu geliştiricilerin hepsinin git deposundaki her şeye yazabildiğinden emin olmanız gerekir.

Bir grup geliştiriciye yazma yeteneği kazandırmak için üstün yöntem için Yeni Dalga Çözümü'ne geçin.

Standart Çözüm

Tüm geliştiricileri özel olarak oluşturulmuş bir gruba koyarsanız, ilke olarak şunları yapabilirsiniz:

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

Daha sonra umaskkullanıcılar için olarak değiştirin 002, böylece yeni dosyalar grupla yazılabilir izinlerle oluşturulabilir.

Bununla ilgili problemler lejyon; Eğer bir varsayan bir dağıtıma olmadığınızı umaskait 022(örneğin ortak sahip olarak usersvarsayılan olarak herkesi kapsadığından grubu), bu başka güvenlik sorunlarını ortaya çıkarabilir. Er ya da geç, bir şey dikkatlice hazırlanmış izinler planınızı bertaraf edecek, siz erişene rootve düzeltene kadar repoyu işlem dışı bırakacak (yani yukarıdaki komutları yeniden uygulayarak).

Yeni Dalga Çözümü

Daha az anlaşılmış olmasına rağmen ve biraz daha fazla OS / araç desteği gerektiren üstün bir çözüm POSIX genişletilmiş özniteliklerini kullanmaktır. Bu bölgeye oldukça yakın zamanda geldim, bu yüzden bilgim olabildiğince sıcak değil. Ancak, temel olarak, genişletilmiş bir ACL, 3 varsayılan alandan (kullanıcı / grup / diğer) daha fazlasına izinler ayarlama yeteneğidir.

Böylece bir kez daha, grubunuzu oluşturun, sonra çalıştırın:

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

Bu, grup üyeleri için genişletilmiş ACL'yi ayarlar; böylece grup üyeleri, orada bulunan dosyaları okuyabilir / yazabilir / erişebilir (ilk satır); daha sonra, mevcut tüm dizinlere, yeni dosyaların aynı ACL'ye (ikinci satır) uygulanmış olması gerektiğini de söyleyin.

Umarım bu yolda olur.


62
git init, grup çalışması için core.sharedRepository değişkenini ayarlayan --shared adlı bir parametreye sahiptir. Değişkeni mevcut bir depoda da ayarlayabilirsiniz. Bu, umask'ı git olarak el ile ayarlama gereksinimini ortadan kaldırır, dosyaları değiştirmeden önce bir aklı başında değer olarak ayarlar.
ptman

6
POSIX için +1 özellikleri genişletilmiş - bana haber!
RobM

5
Bunu chmod -R g+swXyaptığımda Git'i çok mutsuz etti ve artık bir git deposu olmadığına karar verdi ("repo bir git deposu gibi görünmüyor"). Tüm dosyaları chmod yapmak zorunda kaldım . Sadece setgid bitini dizinlere ayarlamak için deneyin find /path/to/repo -type d -print0 | xargs -0 chmod g+s. Hala yap chgrp -R thegroup /path/to/repo.
rescdsk

10
chmod -R g+swX gitreposetguid bitini bir güvenlik riski olan dosyalara uygular. Bunun yerine, find . -type d -exec chmod g+s {} +yalnızca dizinlere uygulamak için kullanabilirsiniz .
Ian Dunn

1
ACL (setfacl), bir dizinde oluşturulan yeni dosyaları ve alt dizinleri kendi grup kimliğini devralacak şekilde uygulamak için setgid ayarına sahip değildir. Bu nedenle setgid'i chmod ile ayrı ayrı ayarlamanız gerekir. Git'in --shared seçeneği ( git-scm.com/docs/git-init ), kullanıcının umask'ını ayarlamanıza ve geçersiz kılmanıza izin verir.
Chase T.

121

depoyu oluşturduysanız (veya varolan bir taneden yeni bir çıplak repo klonladıysanız)

$ git init --shared=group 

veya

$ git init --shared=0NNN

Git, varsayılan umask'ınızın sağladıkları üstündeki ve üstündeki izinleri kullanması gerekiyor. Sonunda bu Git (1.6.3) sürümümde geçerlidir. Elbette bu, kullanıcılarınızın aynı grupta olduğunu varsayar.

Bununla birlikte, farklı derecelerde okuma / yazma derecelerine sahip birden fazla gruptaki kullanıcıların yönetimine ihtiyacım olsaydı, gitosis ile giderdim. Ayrıca , şube düzeyinde izinler sağlamak için kullanılan bir gitosis çatalı olan gitolitten ( http://github.com/sitaramc/gitolite ) bahsettiğimi de duydum , her birinin kişisel olarak kullandığı söylenemez.


9
Bu kesinlikle doğru cevap.
ELLIOTTCABLE

4
Bu sorunu yaşadım ve şu ana kadarki en iyi cevap bu. Tek sorun, --sharedargümanın onaltılık değil sekizli bir sayı almasıdır. Bunu Git 1.7.8 kaynağında onayladım ve ikinci örnek de olmalı git init --shared=0NNN.
qpingu

3
Nedir? NNNİzin maskesi, grup numarası veya başka bir şey?
Craig McQueen,

20
BTW, yukarıdaki "grup", bir anahtar kelimedir, grup adınız için bir yer tutucu değildir. Chgrp komutunu kullanarak grubu atarsınız. Yeni bir repo için, git init --bare --shared=group myprojprojemin sizin repo adınız olduğu, ardından chgrp -R mygroup myprojgrubumun grup adınız olduğu yerdir.
labradort

2
Kullanıcılarınız, varsayılan grupları olması gerekenden farklı olduğunda, taahhütte bulunursa işleri mahvedebilir. Bu sorunu çözmek için, her kullanıcının depodaki her dosyayı sağ gruba chgrp olarak koyması gerekir. Bu, söz vermeden ve zorlamadan önce herkesin doğru grup altında / altında yeni dosyalar oluşturmasını / değiştirmesini sağlamazsanız, yinelenir.
ragerdl

55

Bu söylenmedi, bu yüzden hızlıca eklemek istiyorum.

İzin sorunlarının çirkin kafalarını kırpmamalarını sağlamak için, git paylaşılan deponuzun config dosyasına aşağıdakileri ayarladığınızdan emin olun:

[core]
    sharedRepository = true

Bu, sisteminizin "umask" ayarlarına uyulduğundan emin olmanızı sağlar.


6
Git-config (1) 'e göre ( kernel.org/pub/software/scm/git/docs/git-config.html ) core.sharedRepository' e göre bunu gitmemek için "umask" veya "false" olarak ayarlamanız gerekir. kullanıcının umask.
David Schmitt

14
Bu ve user35117'nin cevabı doğrudur. "True" öğesinin "grup" ile aynı olduğunu ve bunun komutla ayarlanabileceğini unutmayın git config core.sharedRepository true.
ColinM

Uzaktaki bir dosyaya basıldığında hala bir dosyanın sahipliğini değiştiriyor mu?
Duc Tran,

2
Eğer işten geçtikten sonra yerine klonlama yaparken Bunu ayarlamak istiyorsanız, eşdeğer git init --sharedolduğunu git clone --config core.sharedRepository=true. --sharedBu tür benzer komutlarda farklı anlamlar için kullanmak için git garip .
stevek_mcc

21

Git Kullanıcı Kılavuzu açıklar bir depo paylaşmak çeşitli şekillerde.

Daha karmaşık, ancak depoları paylaşmanın özellik dolu yolları:

GitHub'ı 6 geliştiriciden oluşan bir ekip için kullanıyoruz.


1
Gitosis'i severim. Ortak anahtarlara göre erişimi kontrol etmenin oldukça etkili bir yolu.
Mike Mazur

Bu çözümlerden herhangi biri "Birden fazla kişinin o depoya çekmesini istiyorum" sorununu nasıl çözer?
womble

gitosis bir göz atın. bu bir sorunu çözdü.
pilif

3
Depoyu paylaştığınızda, insanlar ondan yararlanabilecek. Büyük olasılıkla klonlamaları veya uzak bir şube eklemeleri gerekecek. Bağlantılı olduğum belgeler size sorununuzu çözmede çok açık bir şekilde yol gösterecektir; Geliştiricilerin Git ile kaynak kodunu ortak çalışması için açıklanan tüm yöntemleri kullandım. Bildiğim kadarıyla, ServerFault tutmak için değildir.
jtimberman

3
Gitosis kullanmaya katılıyorum. Birden fazla SSH anahtarının kimliği doğrulanmış tek bir hesap kullanarak izinler sorununu çözer. Ayrıca tamamen git taahhütleriyle tamamen kendisi yönetiliyor.
Jeremy Bouse,


4

Paylaşılan depodaki izinleri düzeltmenin bir yolu, kullanıcıların zorlarken izin sorunu yaşamamaları, bunu yapacak bir güncelleme sonrası kanca komut dosyası oluşturmaktır. Bu, herhangi bir git versiyonunda çalışmalıdır.

/Myrepo.git’te paylaşılan bir havuzunuz olduğunu varsayalım. Bu depodaki tüm dosyalar mysharedgroup'a aittir . Bu depoya iten tüm kullanıcılar aynı zamanda mysharedgroup'a ait olmalıdır . Şimdi aşağıdaki dosyayı yaratın ( mysharedgroup'u tercihlerinize göre değiştirin ):

/myrepo.git/hooks/post-update

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

kullanıcıların farklı varsayılan gruplarla varken için doğru cevabı
Pat

Bir dizinde setgid bitinin ayarlanması, kullanıcıların oluşturduğu dosyaların dizinle aynı grup sahipliğini devralmasına neden olur (eğer kullanıcılar o gruba aitse). Kullanıcıların varsayılan grubu olmasa bile. O zaman bu çengel gerekli değildir. @ Womble'ın cevabı (ve benim yorumum) budur.
rescdsk

Centos7 makinemde, bu sayfada listelenen her çözümü denedikten sonra, yukarıdaki @ bkmks'in çözümünün bir çeşidi, gerçekten işe yarayan tek seçenekti (yukarıdaki gibi birleştirme sonrası ve çıkış sonrası kancaları ayarlandı).
Mike Godin

STDER'de hata mesajları veya uyarıları yönlendiren bir çözümü teşvik etmenin kötü olduğunu düşünüyorum /dev/null. Lütfen kullanıcının önce bu mesajları görmesine izin verin, sonra kendi başlarına karar verin.
Daniel Böhmer

3

Yeni bir repo oluşturmakla ilgili diğer cevap ve yorumlardaki parçaları ve iyi tavsiye parçalarını bir araya getirmek için:

Yepyeni bir repo kuruyorsanız myrepoiçinde /srv/gitgrup için mygroup, bu ne istediğiniz:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. ilk satır repo dir'ini oluşturur
  2. ikinci satır grubunu mygroup
  3. Üçüncü satır, aşağıdaki konfigürasyon ile çıplak bir repo başlatır:
    1. core.bare = true: çıplak bir depo yapmak
    2. core.sharedrepository = 1(Aynı şekilde core.sharedrepository = grouprepo dizini ve daha sonra oluşturulan tüm dizinleri izin vermek için git ile yönetilecektir:) mygroup, okuma, yazma ve hem de set sgid biraz (yürütme izinleri - kime yönelik kullanıcılarla çalışmak çok olarak mygroupdeğil onların birincil grup)
    3. receive.denyNonFastforwards = 1: hızlı ileri sarmayı reddetme repoya iter

Kullanıcının, grubun veya diğer kullanıcıların izinlerine ince ayar yapmak istiyorsanız , standart kullanıcı, grup ve diğer bit dosyalarının--shared=0NNN nerede olduğunu kullanın ( dizinlerdeki yürütme ve hızlı bitler git tarafından uygun şekilde yönetilecektir). Örneğin, bu kullanıcıya okuma ve yazma erişimi sağlar ve gruba salt okunur erişim sağlar (ve diğerlerine erişim yok):NNN

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

Bu, kullanıcıya ve gruba okuma ve yazma erişimi sağlar (ve diğerlerine erişim yok):

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

Bu, kullanıcıya ve gruba okuma ve yazma erişimi ve diğerlerine salt okunur erişim sağlar:

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

Gruba yazma erişimine izin vermeyecekseniz chown, önce repo sahibini ayarlamak için kullandığınızdan emin olun ve ardından git initkomutu bu kullanıcı olarak çalıştırın (repo için doğru sahibi ile başlatıldığından emin olmak için). tüm ilk dosyalar ve alt dizinler).


Yüksek oy cevaplarından daha doğru.
XO01


1

Tam olarak bunu yapmak benim için çalıştı, mevcut bir depo için. Bu önce birkaç cevap ve yorumlardan tavsiye alır:

Depo üst dizininizden, sunucuda:

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

0

@ stevek_mcc cevabı bu soru için googled zaman aradığım cevap

git clone --config core.sharedRepository=true
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.