Soru Bir Git deposunu bir makinede birden fazla kullanıcıyla nasıl paylaşabilirim?


Birden fazla geliştiricinin alabilmesi gereken bir hazırlama sunucusunda bir Git deposu var. git-init aradığım şeye çok yakın bir bayrağı var gibi görünüyor: --sharedAyrıca, birden fazla kişinin de bu depoya çekilmesini istiyorum. git-clone'ler --shared bayrak tamamen farklı bir şey yapar.

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


202
2018-06-17 01:04


Menşei


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


Cevaplar:


İzinler bir zararlıdır.

Temel olarak, tüm geliştiricilerin git repo'daki her şeye yazabildiğinden emin olmalısınız.

Bir grup geliştiricinin yazma yeteneğini vermenin üstün yöntemi için Yeni Dalga Çözümüne geçin.

Standart Çözüm

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

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

Sonra değiştir umask kullanıcılar için 002Böylece yeni dosyalar grup yazılabilir izinlerle oluşturulur.

Bununla ilgili sorunlar lejyon; varsayarsa bir dağıtımda iseniz umask arasında 022 (ortak olmak gibi) users varsayılan olarak herkesi içeren grup), bu, başka yerlerde güvenlik sorunlarını açabilir. Er ya da geç, dikkatli bir şekilde hazırlanmış izinler programınızı berbat edeceksiniz. root erişip düzeltin (örn. yukarıdaki komutları tekrar çalıştırın).

Yeni Dalga Çözümü

Daha az anlaşılan ve biraz daha fazla OS / araç desteği gerektiren üstün bir çözüm, POSIX genişletilmiş özniteliklerini kullanmaktır. Bu alana sadece son zamanlarda geldim, bu yüzden buradaki bilgim olabildiğince sıcak değil. Ancak temel olarak, genişletilmiş bir ACL, izinleri yalnızca 3 varsayılan yuvadan (kullanıcı / grup / diğer) daha fazla ayarlama yeteneğidir.

Bir kez daha grubunuzu oluşturun, ardından ç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 için genişletilmiş ACL'yi kurar, böylece grup üyeleri zaten var olan herhangi bir dosyayı (ilk satırı) okuyabilir / yazabilir / erişebilir; Daha sonra, mevcut tüm dizinlere yeni dosyaların aynı ACL uygulamasına sahip olması gerektiğini söyleyin (ikinci satır).

Umarım seni yoluna alır.


172
2018-06-17 06:00



git init, grup çalışması için core.sharedRepository değişkenini oluşturan --shared adlı bir parametreye sahiptir. Değişkeni mevcut bir depoda da ayarlayabilirsiniz. Bu, umask'i manuel olarak ayarlama ihtiyacını ortadan kaldırır; böylece, dosyaları manipüle etmeden önce bir sane değerine ayarlanacaktır. - ptman
POSIX genişletilmiş öznitelikleri için +1 - haberler bana! - RobM
Ne zaman yaptım chmod -R g+swXGit'i çok mutsuz yaptı ve artık git deposuna gitmediğine karar verdi ("repo bir git deposu gibi görünmüyor"). Bütün bunları chmod g-s zorundaydım Dosyalar. Sadece setgid bitini ayarlamak dizinleri, Deneyin find /path/to/repo -type d -print0 | xargs -0 chmod g+s. Hala yapmak chgrp -R thegroup /path/to/repo. - rescdsk
chmod -R g+swX gitrepo setguid bitini bir güvenlik riski olan dosyalara uygular. Bunun yerine kullanabilirsiniz find . -type d -exec chmod g+s {} + sadece dizinlere uygulamak. - Ian Dunn
ACL (setfacl), grup kimliğini devralmak için bir dizinde oluşturulan yeni dosyaları ve alt dizinleri zorlamak için setgid ayarlamaz. Bu nedenle, setgid'i chmod aracılığıyla ayrı ayrı ayarlamanız gerekir. Git'in paylaşımlı seçeneği (git-scm.com/docs/git-init) Ancak, kullanıcının umask ayarını yapmak ve geçersiz kılmak için izin verir. - Chase T.


Eğer depoyu oluşturduysanız (veya mevcut birinden yeni bir repo klonladıysanız)

$ git init --shared=group 

veya

$ git init --shared=0NNN

Git, varsayılan umask öğenizin sağladığı değerin üstündeki ve dışındaki izinleri ele almalıdır. Sonunda bu benim Git sürümümde (1.6.3) doğrudur. Elbette bu, kullanıcılarınızın aynı grupta olduğunu varsayar.

Farklı seviyelerde okuma / yazma ile birden fazla grupta kullanıcı yönetimine ihtiyacım olsaydı, jitosis ile giderdim. Gitolit'den de bahsettim (http://github.com/sitaramc/gitolite), şube düzeyinde izinler sağlamak için desteklenen bir gitosis çatalı, her ne kadar ben şahsen kullandım diyemem.


113
2018-02-17 05:40



Bu kesinlikle doğru cevaptır. - ELLIOTTCABLE
Bu sorunu yaşadım ve bu en iyi cevap. Tek sorun şu ki --shared argüman bir sekizlik değil, onaltılı alır. Bunu Git 1.7.8'in kaynağında doğruladım ve ikinci örnek git init --shared=0NNN. - qpingu
Nedir NNN- Maske ya da grup numarası ya da başka bir şey? - Craig McQueen
BTW, yukarıdaki "grup", grup adınız için bir yer tutucu değil, bir anahtar kelime. Chgrp komutunu kullanarak grubu atarsınız. Yeni bir repo için git init --bare --shared=group myproj myproj sizin repo isminiz ise chgrp -R mygroup myproj benim grubum senin grup ismin. - labradort
Kullanıcılarınız varsayılan gruplarının olması gerekenden farklı olduğunda işlem yaparsa, bu durumun üstesinden gelebilir. Bu sorunu düzeltmek için, her kullanıcıya sahip oldukları her dosyayı doğru gruba kopyalamanız gerekir. Bu, herkesin, işlem yapmadan ve itmeden önce doğru gruba / yeni bir dosya oluşturmasını / değiştirmesini nasıl yapacağınızı belirlemezseniz, tekrarlanır. - ragerdl


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

İzin sorunlarının çirkin başlarını kesmemesini sağlamak için, git paylaşılan havuzunuzun yapılandırma dosyasında aşağıdakileri ayarladığınızdan emin olun:

[core]
    sharedRepository = true

Bu, sisteminizin "umask" ayarlarına uyulmasını sağlayacaktır.


50
2018-03-09 05:52



Git-config (1) 'e göre (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository, kullanıcının umask'a saygı duymasını sağlamak için bunu "umask" veya "false" olarak ayarlamanız gerekir. - David Schmitt
Bu ve user35117'nin cevabı doğru. "Doğru" ifadesinin "grup" ile aynı olduğunu ve bu komutla ayarlanabileceğini unutmayın. git config core.sharedRepository true. - ColinM
Uzaklaştırıldığında bir dosyanın sahipliğini hala değiştiriyor mu? - Duc Tran
Bunu gerçeğin yerine klonlama yaparken ayarlamak istiyorsanız, eşdeğer git init --shared olduğu git clone --config core.sharedRepository=true. Kullanmak için git tuhaf --shared benzer komutlarda böyle farklı anlamlar için. - stevek_mcc


Git Kullanıcı Kılavuzu nasıl açıklanır bir havuzu paylaş çeşitli yollarla.

Depoları paylaşmanın tam özellikli yolları olsa da daha karmaşıktır:

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


21
2018-06-17 07:35



Gitosis'i severim. Ortak anahtarlara dayalı erişimi kontrol etmek için oldukça etkili bir yoldur. - Mike Mazur
Bu çözümlerden herhangi biri, "Bu depoya çekmek için birden fazla insanın hoşuna gitmesini istiyorum" problemini nasıl çözer? - womble♦
Gitosise bir göz at. Bu senin problemini çözüyor. - pilif
Havuzu paylaştığınız zaman, insanlar bundan alabilecekler. Büyük olasılıkla klonlamanız veya uzak bir şube eklemeleri gerekecektir. Bağladığım belgeler, sorununuzu çözerek size çok açık bir şekilde yürüyecek; Geliştiricilerin Git ile ortak kaynak kodu oluşturmasına yardımcı olmak için açıklanan tüm yöntemleri kullandım. Bilgim için ServerFault tutma için değil. - jtimberman
Gitosis kullanmaya katılıyorum. Birden çok SSH anahtarının kimliği doğrulanmış tek bir hesap kullanarak izin konusuyla karşılaşır. Aynı zamanda tamamen git taahhütleri ile yönetilmektedir. - Jeremy Bouse


Ayrıca bak gitolite Git deponuzu barındırmak için. Görünüşe göre Gitosis artık geliştirilmiyor.


9
2018-01-19 08:55





Paylaşılan depodaki izinleri düzeltmenin bir yolu olduğundan, kullanıcılar itme sırasında izin sorunlarına sahip olmayacak, sadece bunu yapacak bir güncelleştirme sonrası hook komut dosyası oluşturmaktır. Bu herhangi bir git sürümünde çalışmalıdır.

/Myrepo.git dosyasında paylaşılan bir deponuz olduğunu varsayalım. Bu arşivdeki tüm dosyalar mysharedgroup. Bu depoya iten tüm kullanıcılar mysharedgroup Ayrıca. Şimdi aşağıdaki dosyayı oluştur (değiştir mysharedgroup tercihlerinize):

/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



Kullanıcılar farklı varsayılan gruplara sahip olduğunda doğru cevap - Pat
Bir dizindeki setgid bitini ayarlamak, kullanıcıların dizinle aynı grup sahipliğini miras almak için oluşturdukları dosyalara neden olur (kullanıcılar bu gruba aitse). Kullanıcıların varsayılan grubu olmasa bile. Sonra bu kanca gerekli değildir. @ Womble'ın cevabı budur (ve bunun üzerine yaptığım yorum). - rescdsk
Centos7 makinemde, bu sayfada listelenen her çözümü denedikten sonra, yukarıdaki bkmks çözümünün bir varyantı, gerçekten işe yarayan yegane seçenek oldu (yukarıdaki gibi güncelleme sonrası birleştirme sonrası ve ödeme sonrası kancaların ayarlanması). - Mike Godin


Yeni bir repo kurmayla ilgili diğer çeşitli cevaplardan ve yorumlardan gelen bitleri ve iyi tavsiyelerin parçalarını toplamak için:

Eğer yepyeni bir repo kuruyorsan myrepo içinde /srv/git grup için mygroup, İstediğin bu:

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
  2. ikinci satır grubunu mygroup
  3. Üçüncü satır, aşağıdaki yapılandırmaya sahip çıplak bir repo başlatır:
    1. core.bare = true: onu çıplak bir repo yap
    2. core.sharedrepository = 1 (ile aynı core.sharedrepository = group): repo dizini ve daha sonra oluşturulan tüm dizinler izin vermek için git tarafından yönetilecektir mygroup izinleri okumak, yazmak ve yürütmek (sgid biti ile birlikte) - kime yönelik kullanıcılarla çalışmak için mygroup onların birincil grubu değildir)
    3. receive.denyNonFastforwards = 1: Repoya olmayan hızlı ileri itmeyi reddetmek

Kullanıcı, grup veya diğer kullanıcıların izinlerini ayarlamak istiyorsanız, --shared=0NNN, nerede NNN standart kullanıcı, grup ve diğer bitler Dosyalar (yürütme ve sgid bitleri dizinleri git) tarafından uygun şekilde yönetilecektir. Örneğin, bu kullanıcıya okuma ve yazma erişimine ve gruba salt okunur erişime izin verir (ve diğerlerine erişim yok):

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

Bu, kullanıcı ve gruba okuma ve yazma erişimine izin verir (ve diğerlerine erişim yok):

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

Bu, kullanıcı ve gruba okuma ve yazma erişimine ve diğerlerine salt okunur erişime izin verir:

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

Gruba yazma erişimine izin vermezseniz, ilk kullandığınızdan emin olun. chown repo sahibini ayarlamak ve sonra git init Bu kullanıcı olarak komut verin (tüm başlangıç ​​dosyaları ve alt dizinler için repo'nun doğru kullanıcıyla başlatıldığından emin olmak için).


3
2018-05-26 01:24



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


Depoyu paylaşmak için git-daemon uygulamasını kullanabilirsiniz. İçin belgeleri okuyun Git-cindaha fazla bilgi için.

DÜZENLE:

Bu makaleyi de kontrol et Git deponuzu paylaşmanın 8 yolu.


2
2018-06-17 02:58





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

Havuzdaki ana dizinden sunucuya:

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





@stevek_mcc yanıtı, bu soru için googled ettiğimde aradığım cevaptı

git clone --config core.sharedRepository=true

0
2018-03-29 19:02