שאלה כיצד ניתן לשתף מאגר Git עם מספר משתמשים במחשב?


יש לי מאגר Git על שרת הזמני אשר מפתחים מרובים צריכים להיות מסוגלים למשוך. git-init נראה שיש דגל קרוב מאוד למה שאני מחפש: --shared, אלא שאני רוצה שאנשים רבים ימשכו לאותו מאגר, גם כן. ה git-clone's --shared הדגל עושה משהו אחר לגמרי.

מהי הדרך הקלה ביותר לשנות את הרשאות המאגר הקיימות?


202
2018-06-17 01:04




אני משתמש "Github עבור Windows" ולעבור בין שני חשבונות Github: stackoverflow.com/questions/18565876/... - Alisa


תשובות:


הרשאות הן מזיקים.

ביסודו של דבר, אתה צריך לוודא כי כל אלה מפתחים יכולים לכתוב לכל דבר git repo.

דלג אל הפתרון החדש- wave עבור השיטה מעולה של מתן קבוצה של מפתחים לכתוב יכולת.

הפתרון הסטנדרטי

אם אתה שם את כל היזמים בקבוצה שנוצרה במיוחד, אתה יכול, באופן עקרוני, פשוט לעשות:

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

ואז לשנות את umask המשתמשים 002, כך קבצים חדשים נוצרים עם הרשאות לכתיבה הקבוצה.

הבעיות עם זה הן הלגיון; אם אתה על הפצה כי מניח umask of 022 (כגון שיש משותף users קבוצה הכוללת את כולם כברירת מחדל), הדבר עלול לפתוח בעיות אבטחה במקומות אחרים. במוקדם או במאוחר, משהו הולך לדפוק את ערכת ההרשאות בקפידה שלך, לשים את ריפו מתוך פעולה עד שאתה מקבל root לגשת ולתקן אותו (כלומר, להפעיל מחדש את הפקודות לעיל).

הפתרון החדש

פתרון מעולה - אם כי פחות מובן היטב, אשר דורש קצת יותר OS / כלי תמיכה - היא להשתמש POSIX המורחבת תכונות. באתי רק לאזור זה לאחרונה, אז הידע שלי כאן הוא לא חם כמו שזה יכול להיות. אבל בעיקרון, ACL מורחבת היא היכולת להגדיר הרשאות על יותר מאשר רק 3 משבצות ברירת המחדל (משתמש / קבוצה / אחרים).

אז שוב, ליצור את הקבוצה שלך, ולאחר מכן להפעיל:

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

זה מגדיר את ACL המורחבת לקבוצה, כך שחברי הקבוצה יכולים לקרוא / לכתוב / לגשת לקבצים שכבר נמצאים שם (השורה הראשונה); לאחר מכן, גם לספר את כל הספריות הקיימות כי קבצים חדשים צריכים להיות זה ACL זהה להחיל (השורה השנייה).

מקווה שזה יוביל אותך בדרך שלך.


172
2018-06-17 06:00



git init יש פרמטר הנקרא --shared שמגדיר את המשתנה core.sharedRepository לעבודה קבוצתית. ניתן גם להגדיר את המשתנה במאגר קיים. זה מסיר את הצורך להגדיר ידנית את umask כמו git יהיה להגדיר אותו ערך שפוי לפני מניפולציה קבצים. - ptman
+1 עבור POSIX תכונות מורחבות - חדשות לי! - RobM
כאשר עשיתי זאת chmod -R g+swX, זה עשה את גית אומלל מאוד והחליט שזה לא היה מאגר git יותר ("ריפו לא נראה להיות מאגר git"). הייתי צריך chmod g-s כל קבצים. פשוט להגדיר את setgid קצת על ספריות, נסה find /path/to/repo -type d -print0 | xargs -0 chmod g+s. עדיין לעשות את chgrp -R thegroup /path/to/repo. - rescdsk
chmod -R g+swX gitrepo יחול את bit setguid לקבצים, המהווה סיכון אבטחה. במקום זאת, אתה יכול להשתמש find . -type d -exec chmod g+s {} + להחיל אותו רק על ספריות. - Ian Dunn
ל- ACL (setfacl) אין הגדרה עבור setgid כדי לאכוף קבצים ותיקיות משנה חדשים שנוצרו בתוך ספריה כדי לרשת את מזהה הקבוצה שלה. לכן, עליך להגדיר setgid בנפרד דרך chmod. האופציה של Git - Shared (git-scm.com/docs/git-init), עם זאת, מאפשר לך setgid לעקוף את umask של המשתמש. - Chase T.


אם יצרת את המאגר (או לשכפל ריפו חשוף חדש קיים) עם

$ git init --shared=group 

או

$ git init --shared=0NNN

Git אמורה להתמודד עם הרשאות מעל ומעבר למה umask ברירת המחדל שלך מספק. סוף סוף זה נכון על הגירסה שלי של Git (1.6.3). כמובן זה מניח שהמשתמשים שלך נמצאים באותה קבוצה.

אם הייתי צריך ניהול משתמשים בקבוצות מרובות עם דרגות שונות של קריאה / כתיבה עם זאת, הייתי הולך עם גיטוזה. שמעתי גם אזכור של gitolite (http://github.com/sitaramc/gitolite), מזלג גיטוזיס כי הוא suppossed לספק הרשאות ברמת הסניף, לא יכול להגיד שאני כבר השתמשו בו אישית אף.


113
2018-02-17 05:40



זו בהחלט התשובה הנכונה. - ELLIOTTCABLE
היתה לי בעיה זו וזו התשובה הטובה ביותר. הבעיה היחידה היא כי --shared הטיעון לוקח באוקטלי, לא הקסדצימלי. אני אישר את זה במקור של גית 1.7.8 ואת הדוגמה השנייה צריכה להיות git init --shared=0NNN. - qpingu
מה זה NNNמסכה או מספר קבוצה או משהו אחר? - Craig McQueen
BTW, "group" לעיל היא מילת מפתח, לא מציין מיקום עבור שם הקבוצה שלך. אתה מקצה את הקבוצה באמצעות הפקודה chgrp. עבור ריפו חדש זה git init --bare --shared=group myproj שבו myproj שלי הוא שם ריפו שלך, ואחריו chgrp -R mygroup myproj שבו mygroup הוא שם הקבוצה שלך. - labradort
ראשי מעלה כי אם המשתמשים שלך לבצע התחייבויות כאשר קבוצת ברירת המחדל שלהם שונה ממה שהיא צריכה להיות, זה יכול לדפוק את הדברים. כדי לתקן בעיה זו, תזדקק לכל משתמש ל- chgrp בכל קובץ שבבעלותו בריפו לקבוצה הנכונה. זה יחזור אלא אם כן להבין איך לגרום לכל אחד ליצור / לעבור קבצים חדשים תחת / לקבוצה הנכונה לפני ביצוע ודחיפה. - ragerdl


זה לא נאמר, אז אני רוצה להוסיף אותו במהירות.

כדי לוודא שהבעיות בהרשאות אינן חותכות את הראש המכוער שלהן, הקפד להגדיר את הפרטים הבאים בקובץ ההגדרות של מאגר הנתונים המשותף של git:

[core]
    sharedRepository = true

זה יבטיח כי המערכת שלך "umask" הגדרות מכובדות.


50
2018-03-09 05:52



לפי git-config (1) (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository, אתה צריך להגדיר את זה כדי "umask" או "שקר" יש git כבוד umask של המשתמש. - David Schmitt
תשובה זו של המשתמש ושל המשתמש 35357 נכונה. שים לב כי "נכון" הוא זהה "קבוצה", וזה יכול להיות מוגדר עם הפקודה git config core.sharedRepository true. - ColinM
האם זה עדיין משנה את הבעלות על קובץ כאשר הוא נדחק לשלט רחוק? - Duc Tran
אם אתה רוצה להגדיר את זה כאשר שיבוט ולא אחרי העובדה, המקבילה של git init --shared J git clone --config core.sharedRepository=true. מוזר להשתמש בו --shared עבור משמעויות שונות כאלה פקודות דומות כאלה. - stevek_mcc


ה מדריך למשתמש של Git מתאר כיצד לשתף מאגר בכמה דרכים.

דרכים מורכבות יותר, אם כי תכונות מלאות לשתף מאגרים הם:

אנו משתמשים ב- GitHub עבור צוות של 6 מפתחים.


21
2018-06-17 07:35



אני אוהב גיטוזה. זוהי דרך יעילה למדי לשלוט על גישה המבוססת על המפתחות הציבוריים. - Mike Mazur
איך כל אחד מהפתרונות הללו פותר את הבעיה של "אני רוצה שאנשים רבים ימשכו לאותו מאגר"? - womble♦
יש להסתכל על גיטוזה. כי אחד פותר את הבעיה שלך. - pilif
כאשר אתה משתף את המאגר, אנשים יוכלו למשוך ממנו. הם כנראה יצטרכו לשכפל אותו, או להוסיף ענף מרוחק. התיעוד שאליו קישרתי יוביל אותך בבהירות רבה לפתרון הבעיה שלך; השתמשתי בכל השיטות שתוארו כדי לעזור למפתחים לשתף קוד מקור עם Git. למיטב ידיעתי ServerFault אינו עבור אחזקת יד. - jtimberman
אני חייב להסכים עם שימוש ב- Gitosis. זה מסתובב בעיה הרשאות באמצעות חשבון יחיד מאומת על ידי מספר מפתחות SSH. זה גם הצליח לחלוטין את עצמו באמצעות git מבצעת. - Jeremy Bouse


גם להסתכל גיטוליט אירוח המאגר שלך Git. גיטוזה כנראה לא מתפתחת עוד.


9
2018-01-19 08:55





אחת הדרכים לתקן הרשאות במאגר המשותף, כך שלמשתמשים לא יהיו בעיות הרשאה בעת דחיפה, היא ליצור סקריפט וו לאחר עדכון אשר יעשה בדיוק את זה. זה אמור לעבוד בכל גרסה 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

4
2017-09-27 14:35



את התשובה הנכונה כאשר למשתמשים יש קבוצות ברירת מחדל שונות - Pat
הגדרת bit setgid בספריה תגרום קבצים שמשתמשים ליצור כדי לרשת את אותה בעלות בקבוצה כמו הספרייה (אם משתמשים שייכים לקבוצה זו). גם אם היא אינה קבוצת ברירת המחדל של המשתמשים. אז זה וו לא נחוץ. זה מה @ תשובה של womble (ואת ההערה שלי על זה) לעשות. - rescdsk
על מכונת centos7 שלי, לאחר שניסה את כל הפתרונות המפורטים בדף זה, גרסה של הפתרון של bmks @ לעיל היתה האופציה היחידה שבאמת עבדה (הגדרה שלאחר המיזוג שלאחר הקופה ווים במקום שלאחר עדכון כאמור). - Mike Godin


כדי לצרף את חתיכות חתיכות של עצות טובות מן התשובות השונות אחרות והערות על הגדרת ריפו חדש:

אם אתה מגדיר ריפו חדש myrepo in /srv/git עבור הקבוצה mygroup, זה מה שאתה רוצה:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. השורה הראשונה יוצרת את ריפו דיר
  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 bits ב ספריות ינוהל כראוי על ידי 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

שים לב שאם אינך מתכוון לאפשר גישה לכתיבה לקבוצה, הקפד להשתמש תחילה chown כדי להגדיר את הבעלים של ריפו, ולאחר מכן להפעיל את git init כמו המשתמש (כדי לוודא את ריפו הוא מאותחל עם הבעלים הנכון עבור כל הקבצים הראשוניים ותתי ספריות).


3
2018-05-26 01:24



נכון יותר מהתגובת ההצבעה הגבוהה יותר. - XO01


ניתן להשתמש ב- git-daemon כדי לשתף את המאגר. קרא את התיעוד עבור git-daemonלמידע נוסף.

עריכה:

גם לבדוק את המאמר הזה 8 דרכים לשתף את מאגר Git שלך.


2
2018-06-17 02:58