යන්ත්‍රයක බහු පරිශීලකයින් සමඟ මම Git ගබඩාවක් බෙදා ගන්නේ කෙසේද?


220

වේදිකා සේවාදායකයක මට Git ගබඩාවක් ඇත, එය බහු සංවර්ධකයින්ට ඇද ගැනීමට අවශ්‍ය වේ. git-initමා සොයන දෙයට ඉතා ආසන්නව ධජයක් ඇති බව පෙනේ --shared:, මම කැමතියි බහු පුද්ගලයින් එම ගබඩාවට ඇදගෙන යාමට කැමති නම් හැර. මෙම git-cloneගේ --sharedධජය සම්පූර්ණයෙන්ම වෙනස් දෙයක් කරන්නේ නැහැ.

පවත්නා ගබඩාවක අවසර වෙනස් කිරීමට ඇති පහසුම ක්‍රමය කුමක්ද?


: මම Github ගිණුම් දෙකක් අතර "Windows සඳහා Github" මාරු මම භාවිතා stackoverflow.com/questions/18565876/...
දිලිනි

Answers:


195

අවසර පළිබෝධයකි.

මූලික වශයෙන්, එම සියලු සංවර්ධකයින්ට git repo හි ඇති සියල්ලට ලිවිය හැකි බවට ඔබ සහතික විය යුතුය.

සංවර්ධකයින් පිරිසකට ලිවීමේ හැකියාව ලබා දීමේ උසස් ක්‍රමය සඳහා නව තරංග විසඳුම වෙත යන්න.

සම්මත විසඳුම

ඔබ සියලු සංවර්ධකයින් විෙශේෂෙයන් සාදන ලද කණ්ඩායමකට ඇතුළත් කළහොත්, ඔබට ප්‍රතිපත්තිමය වශයෙන් කළ හැක්කේ:

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

ඉන්පසු umaskපරිශීලකයින් සඳහා වෙනස් කරන්න 002, එවිට කණ්ඩායම් ලිවිය හැකි අවසරයන් සමඟ නව ලිපිගොනු නිර්මාණය වේ.

මෙහි ඇති ගැටළු වන්නේ ලෙජියන් ය; ඔබ උපකල්පනය කරන ඩිස්ට්‍රෝ එකක සිටී umaskනම් 022( usersපෙරනිමියෙන් සියල්ලන් ඇතුළත් වන පොදු කණ්ඩායමක් සිටීම වැනි ), මෙය වෙනත් තැනක ආරක්ෂක ගැටළු විවෘත කළ හැකිය. ඉක්මනින් හෝ පසුව, යම් දෙයක් ඔබගේ ප්‍රවේශමෙන් සකසන ලද අවසර පත්‍රය ඉවතට හරවා, ඔබ rootප්‍රවේශය ලබාගෙන එය නිවැරදි කරන තෙක් (එනම්, ඉහත විධානයන් නැවත ක්‍රියාත්මක කිරීම) ක්‍රියාත්මක වේ.

නව තරංග විසඳුම

වඩා හොඳ විසඳුමක් - එතරම් හොඳින් අවබෝධ කර නොතිබුණත්, ඊට වඩා වැඩි මෙහෙයුම් පද්ධතියක් / මෙවලම් සහාය අවශ්‍ය වේ - POSIX දීර් extended කරන ලද ගුණාංග භාවිතා කිරීම. මම මෙම ප්‍රදේශයට පැමිණියේ තරමක් මෑතකදී පමණි, එබැවින් මෙහි මගේ දැනුම එය තරම් උණුසුම් නොවේ. නමුත් මූලික වශයෙන්, දීර් AC කරන ලද ACL යනු පෙරනිමි තව් 3 කට වඩා (පරිශීලක / කණ්ඩායම් / වෙනත්) අවසර ලබා දීමට ඇති හැකියාවයි.

එබැවින් නැවත වරක්, ඔබේ කණ්ඩායම නිර්මාණය කර ධාවනය කරන්න:

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

මෙමඟින් සමූහය සඳහා දීර් AC කරන ලද ACL සැකසෙන අතර කණ්ඩායම් සාමාජිකයින්ට දැනටමත් එහි ඇති ඕනෑම ලිපිගොනු කියවීමට / ලිවීමට / ප්‍රවේශ වීමට හැකි වේ (පළමු පේළිය); නව ලිපිගොනු වලට එකම ACL යෙදිය යුතු බව (දෙවන පේළිය) පවතින සියලුම ඩිරෙක්ටරි වලටද කියන්න.

එය ඔබව මඟට ගෙන එනු ඇතැයි බලාපොරොත්තු වෙමු.


63
git init හි --shared නමින් පරාමිතියක් ඇති අතර එය කණ්ඩායම් වැඩ සඳහා core.sharedRepository විචල්‍යය සකසයි. ඔබට දැනට පවතින ගබඩාවක විචල්‍යය සැකසිය හැකිය. එමඟින් උමාස්ක් අතින් සැකසීමේ අවශ්‍යතාවය ඉවත් කරයි.
ptman

7
POSIX දීර් extended කරන ලද ගුණාංග සඳහා +1 - මට ප්‍රවෘත්ති!
RobM

5
මා එසේ කළ විට chmod -R g+swX, එය Git ඉතා අසතුටට පත් කළ අතර එය තවදුරටත් Git ගබඩාවක් නොවන බව තීරණය කළේය ("repo යනු git repository ලෙස නොපෙනේ"). මට සියලුම ලිපිගොනු chmod කිරීමට සිදු විය . ඩිරෙක්ටරිවල setgid bit සැකසීමට , උත්සාහ කරන්න find /path/to/repo -type d -print0 | xargs -0 chmod g+s. තවමත් කරන්න chgrp -R thegroup /path/to/repo.
rescdsk

11
chmod -R g+swX gitrepoආරක්ෂක අවදානමක් වන ගොනු වලට setguid bit යොදනු ඇත. ඒ වෙනුවට, ඔබට find . -type d -exec chmod g+s {} +එය නාමාවලි වලට පමණක් යෙදිය හැකිය .
ඉයන් ඩන්

1
ACL (setfacl) හි සමූහ හැඳුනුම්පත උරුම කර ගැනීම සඳහා නාමාවලියක් තුළ නිර්මාණය කරන ලද නව ලිපිගොනු සහ උප බහලුම් බලාත්මක කිරීමට setgid සඳහා සැකසුමක් නොමැත. එමනිසා, ඔබ chmod හරහා වෙන වෙනම setgid සැකසිය යුතුය. Git ගේ --shared විකල්පය ( git-scm.com/docs/git-init ), කෙසේ වෙතත්, පරිශීලක ඇති umask setgid හා ප්රතිස්ථාපනය කිරීමට ඔබට අවසර දෙයි.
චේස් ටී.

125

ඔබ නිධිය නිර්මාණය කළේ නම් (හෝ දැනට පවතින එකකින් නව හිස් ගබඩාවක් ක්ලෝන කර ඇත)

$ git init --shared=group 

හෝ

$ git init --shared=0NNN

ඔබගේ පෙරනිමි umask සපයන දෙයට වඩා ඉහළින් සහ ඉන් ඔබ්බට Git විසින් අවසරයන් හැසිරවිය යුතුය. අවසානයේ මෙය මගේ Git (1.6.3) අනුවාදයේ සත්‍ය වේ. ඇත්ත වශයෙන්ම මෙය උපකල්පනය කරන්නේ ඔබේ පරිශීලකයින් එකම කණ්ඩායමේ සිටින බවයි.

විවිධ කියවීම් / ලිවීම් සහිත විවිධ කණ්ඩායම්වල පරිශීලකයින් කළමනාකරණය කිරීමට මට අවශ්‍ය නම්, මම ගිටෝසිස් සමඟ යන්නෙමි. ශාඛා මට්ටමේ අවසර ලබා දීම සඳහා උපකල්පනය කරන ලද ගිටෝසිස් දෙබලක වන ගිටොලයිට් ( http://github.com/sitaramc/gitolite ) ගැන ද මම අසා ඇත්තෙමි .


9
මෙය නියත වශයෙන්ම නිවැරදි පිළිතුරයි.
ELLIOTTCABLE

4
මට මෙම ගැටළුව ඇති අතර මෙය බොහෝ දුරට හොඳම පිළිතුරයි. එකම ගැටළුව වන්නේ --sharedතර්කය ෂඩාස්රාකාර නොව අෂ්ටකයක ගැනීමයි. Git 1.7.8 ප්‍රභවයෙන් මම මෙය සනාථ කර ඇති අතර දෙවන උදාහරණය විය යුතුය git init --shared=0NNN.
qpingu

3
කුමක්ද NNN-permissions වසං හෝ කණ්ඩායමක් අංකය හෝ වෙන දෙයක්?
ක්‍රේග් මැක්වීන්

22
BTW, ඉහත “කණ්ඩායම” යනු මූල පදයක් මිස ඔබේ කණ්ඩායම් නාමය සඳහා ස්ථාන දරන්නෙකු නොවේ. ඔබ chgrp විධානය භාවිතා කරමින් කණ්ඩායම පවරයි. නව repo සඳහා එය git init --bare --shared=group myprojmyproj යනු ඔබේ repo නම වන අතර ඉන්පසු chgrp -R mygroup myprojmygroup යනු ඔබේ කණ්ඩායම් නාමයයි.
labradort

2
ඔබේ පරිශීලකයින්ගේ පෙරනිමි කණ්ඩායම විය යුතු ප්‍රමාණයට වඩා වෙනස් වූ විට එය සිදු කරන්නේ නම්, එමඟින් දේවල් ඉස්කුරුප්පු කළ හැකිය. මෙම ගැටළුව නිරාකරණය කිරීම සඳහා, එක් එක් පරිශීලකයාට repo හි ඇති සෑම ගොනුවක්ම නිවැරදි කණ්ඩායමට chgrp කිරීමට අවශ්‍ය වේ. කැපවීමට හා තල්ලු කිරීමට පෙර සෑම කෙනෙකුම නිවැරදි කණ්ඩායමට යටින් / නිවැරදි කණ්ඩායමට නව ලිපිගොනු නිර්මාණය කරන්නේ / මාරු කරන්නේ කෙසේදැයි ඔබ සොයා නොගන්නේ නම් මෙය නැවත සිදුවනු ඇත.
ragerdl

55

මෙය පවසා නැත, එබැවින් මට එය ඉක්මණින් එකතු කිරීමට අවශ්‍යය.

අවසර ගැටළු ඔවුන්ගේ කැත හිස කපා නොගන්නා බවට සහතික වීම සඳහා, ඔබගේ git හවුල් ගබඩාවේ වින්‍යාස ගොනුවේ පහත සඳහන් දේ සැකසීමට වග බලා ගන්න:

[core]
    sharedRepository = true

මෙය ඔබගේ පද්ධතියේ "උමාස්ක්" සැකසුම් වලට ගරු කරන බව සහතික කරයි.


6
Git-config (1) ( kernel.org/pub/software/scm/git/docs/git-config.html ) core.sharedRepository ට අනුව, ඔබට මෙය "උමාස්ක්" හෝ "අසත්‍ය" ලෙස සැකසිය යුතුය. පරිශීලකයාගේ උමාස්ක්.
ඩේවිඩ් ෂ්මිට්

14
මෙය සහ පරිශීලක 35117 ගේ පිළිතුර නිවැරදි ය. "සත්‍ය" යනු "සමූහය" ට සමාන බව සලකන්න, මෙය විධානය සමඟ සැකසිය හැකිය git config core.sharedRepository true.
කොලින්එම්

ගොනුවක් දුරස්ථයට තල්ලු කළ විට එය තවමත් එහි හිමිකාරිත්වය වෙනස් කරයිද?
ඩක් ට්‍රාන්

2
ක්ලෝන කිරීමේදී ඔබට මෙය සැකසීමට අවශ්‍ය නම් එය සත්‍යයට පසුව git init --sharedනොවේ git clone --config core.sharedRepository=true. --sharedඑවැනි සමාන විධානයන්හි විවිධ අර්ථයන් සඳහා භාවිතා කිරීමට git හි අමුතුයි .
stevek_mcc

22

මෙම Git පරිශීලක අත්පොත ආකාරය විස්තර නිධිය බෙදා ක්රම කිහිපයකි.

වඩාත් සංකීර්ණ, නිධිය බෙදා ගැනීමට අංග සම්පූර්ණ ක්‍රම වුවද:

සංවර්ධකයින් 6 දෙනෙකුගෙන් යුත් කණ්ඩායමක් සඳහා අපි GitHub භාවිතා කරමු.


1
මම ගිටෝසිස් වලට කැමතියි. පොදු යතුරු මත පදනම්ව ප්‍රවේශය පාලනය කිරීම සඳහා එය ඉතා effective ලදායී ක්‍රමයකි.
මයික් මසූර්

මෙම විසඳුම් වලින් එකක් "බහු පුද්ගලයින් එම ගබඩාවට ඇද ගැනීමට මා කැමතියි" යන ගැටළුව විසඳන්නේ කෙසේද?
ගර්භාෂය

ගිටෝසිස් දෙස බලන්න. එය ඔබේ ගැටලුව විසඳයි.
pilif

3
ඔබ ගබඩාව බෙදා ගන්නා විට, මිනිසුන්ට එයින් ඉවත් වීමට හැකි වේ. ඔවුන්ට එය ක්ලෝන කිරීමට හෝ දුරස්ථ ශාඛාවක් එක් කිරීමට අවශ්‍ය වනු ඇත. මා සම්බන්ධ කළ ලියකියවිලි ඔබේ ගැටලුව විසඳීම තුළින් ඔබව පැහැදිලිවම ගෙන යනු ඇත; Git සමඟ ප්‍රභව කේත සමඟ සහයෝගයෙන් කටයුතු කිරීමට සංවර්ධකයින්ට උදව් කිරීමට මම විස්තර කර ඇති සියලුම ක්‍රම භාවිතා කර ඇත. මගේ දැනුමට අනුව සර්වර්ෆෝල්ට් යනු අත් තබා ගැනීම සඳහා නොවේ.
jtimberman

3
ගිටෝසිස් භාවිතා කිරීමට මා එකඟ විය යුතුය. බහු SSH යතුරු මගින් සත්‍යාපනය කළ තනි ගිණුමක් භාවිතා කිරීමෙන් එය අවසර නිකුතුවට මුහුණ දෙයි. එය මුළුමනින්ම කළමනාකරණය කරනු ලබන්නේ git commits හරහාය.
ජෙරමි බෝස්

9

ඔබේ git නිධිය සඳහා සත්කාරකත්වය සැපයීම සඳහා ගිටොලයිට් දෙස බලන්න . පෙනෙන විදිහට ගිටෝසිස් තවදුරටත් වර්ධනය නොවේ.


4

හවුල් ගබඩාවේ අවසරයන් නිවැරදි කිරීමට එක් ක්‍රමයක් වන බැවින් පරිශීලකයන්ට තල්ලු කිරීමේදී අවසර ගැටළු ඇති නොවනු ඇත, පශ්චාත් යාවත්කාලීන කොකු ස්ක්‍රිප්ටයක් නිර්මාණය කිරීම එය සිදු කරයි. මෙය ඕනෑම git අනුවාදයක ක්‍රියාත්මක විය යුතුය.

ඔබට /myrepo.git හි හවුල් ගබඩාවක් ඇතැයි සිතමු. එම ගබඩාවේ ඇති සියලුම ලිපිගොනු mysharedgroup ට අයත් වේ . එම ගබඩාවට තල්ලු වන සියලුම පරිශීලකයින් mysharedgroup ට අයත් විය යුතුය . දැන් පහත ගොනුව සාදන්න ( mysharedgroup ඔබේ මනාපයන් ලෙස වෙනස් කිරීම):

/myrepo.git/hooks/post-update

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

පරිශීලකයින්ට විවිධ පෙරනිමි කණ්ඩායම් ඇති විට නිවැරදි පිළිතුර
පැට්

ඩිරෙක්ටරියක් මත සෙට්ගිඩ් බිට් සැකසීම මඟින් පරිශීලකයින් විසින් නිර්මාණය කරන ලිපිගොනු නාමාවලියට සමාන කණ්ඩායම් හිමිකම උරුම කර ගැනීමට හේතු වේ (පරිශීලකයින් එම කණ්ඩායමට අයත් නම්). එය පරිශීලකයින්ගේ පෙරනිමි කණ්ඩායම නොවුනත්. එවිට මෙම කොක්ක අවශ්‍ය නොවේ. @ වොම්බල්ගේ පිළිතුර (සහ ඒ පිළිබඳ මගේ අදහස) කරන්නේ මෙයයි.
rescdsk

මගේ සෙන්ටෝස් 7 යන්ත්‍රයේ, මෙම පිටුවේ ලැයිස්තුගත කර ඇති සෑම විසඳුමක්ම උත්සාහ කිරීමෙන් පසු, ඉහත ක්‍රියා කළ එකම විකල්පය වූයේ @ bkmks හි විසඳුමයි.
මයික් ගොඩින්

1
STDER හි වැරදි පණිවිඩ හෝ අනතුරු ඇඟවීම් ලබා දෙන විසඳුමක් ප්‍රවර්ධනය කිරීම නරක උපදෙස් යැයි මම සිතමි /dev/null. කරුණාකර පරිශීලකයාට පළමුව මෙම පණිවිඩ බැලීමට ඉඩ දී ඒවා තනිවම තීරණය කරන්න.
ඩැනියෙල් බූමර්

4

නව repo එකක් සැකසීම පිළිබඳ වෙනත් විවිධ පිළිතුරු සහ අදහස් වලින් හොඳ උපදෙස්වල කොටස් එකතු කිරීම:

ඔබ විසින් නව ප්රති මිලදී පිහිටුවීම නම් myrepoදී /srv/gitමෙම කණ්ඩායම mygroup, මේ ඔබට අවශ්ය දේ වේ:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. පළමු පේළිය මඟින් repo dir නිර්මාණය කරයි
  2. දෙවන පේළිය එහි කණ්ඩායම සකසයි mygroup
  3. තෙවන පේළිය පහත දැක්වෙන වින්‍යාසය සමඟ හිස් රෙපෝවක් ආරම්භ කරයි:
    1. core.bare = true: එය හිස් ගබඩාවක් බවට පත් කරන්න
    2. core.sharedrepository = 1(ලෙස එම core.sharedrepository = group): පසුව එය නිර්මාණය ප්රති බහලුම සහ සියලු බහලුම් GIT විසින් ඉඩ කළමනාකරණය කරනු ලබනවා ඇති mygroup- එසේ කවුරුන් සඳහා භාවිතා කරන්නන් සමඟ වැඩ කිරීමට වශයෙන් කියවීමට, ලිවීමට ඇති sgid ටිකක් කට්ටලයක් සමග මෙන්, සහ අවසර ක්රියාත්මක කරන්න ( mygroupඔවුන්ගේ නෑ ප්‍රාථමික කණ්ඩායම)
    3. receive.denyNonFastforwards = 1: වේගයෙන් ඉදිරියට නොයෑම රෙපෝවට තල්ලු කිරීම ප්‍රතික්ෂේප කරන්න

ඔබට පරිශීලකයා, කණ්ඩායම හෝ වෙනත් පරිශීලකයින්ගේ අවසරයන් මනාව සැකසීමට අවශ්‍ය නම්, භාවිතා කරන්න --shared=0NNN, NNNසම්මත පරිශීලකයා, කණ්ඩායම සහ ලිපිගොනු සඳහා වෙනත් බිටු කොහේද ( ඩිරෙක්ටරි මත ක්‍රියාත්මක කිරීම සහ sgid බිටු නිසි ලෙස කළමනාකරණය කරනු ලබන්නේ git මඟින්). උදාහරණයක් ලෙස, මෙය පරිශීලකයාට කියවීමට හා ලිවීමට ප්‍රවේශය ලබා දෙයි, සහ කණ්ඩායමට කියවීමට පමණක් ප්‍රවේශ විය හැකිය (සහ වෙනත් අයට ප්‍රවේශයක් නොමැත):

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

මෙය පරිශීලකයාට සහ කණ්ඩායමට කියවීමට හා ලිවීමට ප්‍රවේශය ලබා දෙයි (සහ වෙනත් අයට ප්‍රවේශ විය නොහැක):

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

මෙය පරිශීලකයාට සහ කණ්ඩායමට කියවීමට හා ලිවීමට ප්‍රවේශය ලබා දෙයි, සහ වෙනත් අයට කියවීමට පමණක් ප්‍රවේශ විය හැකිය:

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

ඔබ කණ්ඩායමට ලිඛිත ප්‍රවේශයට ඉඩ නොදෙන්නේ නම්, මුලින්ම chownrepo හි හිමිකරු සැකසීමට භාවිතා කිරීමට වග බලා ගන්න , ඉන්පසු git initඑම පරිශීලකයා ලෙස විධානය ක්‍රියාත්මක කරන්න (නිවැරදි හිමිකරු සමඟ repo ආරම්භ කර ඇති බව තහවුරු කර ගැනීමට සියලුම ආරම්භක ලිපිගොනු සහ උප නාමාවලි).


ඉහළ ඡන්ද ප්‍රතිචාර වලට වඩා නිවැරදි ය.
XO01


1

මෙය හරියටම කිරීම මට දැනට පවතින ගබඩාවක් සඳහා වැඩ කළේය. මීට පෙර පිළිතුරු සහ අදහස් කිහිපයකින් උපදෙස් ලබා ගනී:

ඔබේ ගබඩාවේ මව් නාමාවලියෙන්, සේවාදායකයේ:

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

questionstevek_mcc පිළිතුර මම මෙම ප්‍රශ්නය සඳහා ගූගල් කරන විට මා සොයන පිළිතුරයි

git clone --config core.sharedRepository=true
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.