วิธีกำหนดค่า git repo ที่มีอยู่เพื่อแชร์โดยกลุ่ม UNIX


98

ฉันมี git repo ที่มีอยู่ (อันเปล่า) ซึ่งถึงจุดนี้เท่านั้นที่ฉันเขียนได้ ฉันต้องการเปิดให้กับกลุ่มผู้ใช้ UNIX บางกลุ่ม foo เพื่อให้สมาชิกทั้งหมดของ foo สามารถผลักดันไปได้ ฉันทราบดีว่าฉันสามารถตั้งค่าgit repo ใหม่ได้อย่างง่ายดายด้วย:

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

แต่ฉันต้องการการดำเนินการที่เทียบเท่าสำหรับrepo dir ที่มีอยู่


4
มีคำตอบที่ยอดเยี่ยมสำหรับคำถามนี้ใน ServerFault (ไซต์ StackOverflow อื่น)
Zearin

คำตอบ:


116

ลองทำเช่นนี้เพื่อสร้างที่เก็บที่มีอยู่ในการrepodirทำงานสำหรับผู้ใช้ในกลุ่ม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
ฉันจะเพิ่มว่าคุณควรตั้งค่า config.sharedRepository = true ใน config ของ repo ด้วย kernel.org/pub/software/scm/git/docs/git-config.html
Pistos

1
นี่ค่อนข้างใกล้เคียงกับสิ่งที่ฉันทำด้วยตัวเอง แต่ฉันต้องการได้รับการยืนยันจากภายนอก ขอบคุณ. :) ฉันยังหวังว่าจะมี git clone --shared = group sort ของสิ่งต่างๆ แต่ตัวเลือก --shared ของ clone ทำสิ่งที่แตกต่างไปจากเดิมอย่างสิ้นเชิง
Pistos

5
คุณสามารถใช้git init --sharedคำสั่งบน repo ที่มีอยู่เพื่อตั้งค่าคอนฟิก คุณต้องทำchmodคำสั่งเพื่อรับสิทธิ์ของไฟล์ที่ถูกต้อง
Spencer

1
เพื่อยืนยันนี้ยังช่วยถ้าคุณอยู่ในระเบียบเพราะมีคนทำgit pullฯลฯ เป็นรากมากกว่าที่จะเป็นหรือสิ่งที่เป็นเจ้าของและเป็นผลให้คุณได้รับwww-data error: insufficient permission for adding an object to repository database .git/objectsฉันคิดว่าฉันจะแก้ไขการเป็นเจ้าของไฟล์ / ไดเร็กทอรีทั้งหมดที่ผิดพลาดโดยใช้findและ-type d/ type -fแต่มีเพียงวิธีนี้เท่านั้นที่กำจัดข้อผิดพลาด (prob. เพราะไฟล์ในไดเร็กทอรีย่อยบางไฟล์ไม่สามารถเขียนเป็นกลุ่มได้?)
William Turrell

2
umask ของผู้ใช้ยังคงใช้กับไฟล์ที่สร้างขึ้นใหม่ นั่นคือสิ่งที่คุณคาดหวังหรือไม่? ฉันคิดว่าเอกสารcore.sharedRepositoryจะกล่าวถึงสิ่งนี้ - ดูเหมือนจะไร้ประโยชน์หากผู้ใช้ไม่สามารถเขียนกลุ่มไฟล์ทั้งหมดได้
Sam Brightman

47

ใน repo dir รันคำสั่งต่อไปนี้:

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

แก้ไข: เพื่อแก้ไขความสับสนที่เกิดขึ้นบ่อยgroupเป็นคำหลักที่แท้จริงคุณไม่ควรแทนที่ด้วยชื่อของกลุ่ม


26
groupไม่ใช่ชื่อของกลุ่มที่ไหน:)
Pierre de LESPINAY

7
ไฟล์ออบเจ็กต์และไฟล์แพ็คควรไม่เปลี่ยนรูป พวกเขาควรมีสิทธิ์ 444 / r - r - r--
CB Bailey

3
หลังจากลองgit config core.sharedRepository devพิมพ์แล้วgit configฉันก็fatal: bad config value for 'core.sharedrepository' in .git/configเข้ามาgit version 1.7.0.4(และอาจเป็นรุ่นหลัง)
Kzqai

3
git config core.sharedRepository group groupไม่ใช่ชื่อกลุ่ม แต่เป็นมูลค่าที่แท้จริง!
kixorz

หากคุณทำผิดพลาดในการใช้ชื่อกลุ่มของคุณแทน "กลุ่ม" เพียงเปิด. git / config ในโปรแกรมแก้ไขข้อความและแก้ไขบรรทัด core.sharedRepository เพื่อพูดว่า "group"
ทอม

46

การรวมคำตอบของ@David Underhillและ@kixorz เข้าด้วยกันฉันสร้างโซลูชัน (ขั้นสุดท้าย) ของตัวเอง

มันเป็นเปลือย Repos และไม่ใช่เปลือย Repos มีความแตกต่างเพียงเล็กน้อยระหว่างกัน แต่ด้วยวิธีนี้ชัดเจนกว่า

BARE REPOSITORY

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

ที่ไหน:

  • <repo.git>คือไดเร็กทอรีที่เก็บเปล่าโดยทั่วไปอยู่บนเซิร์ฟเวอร์ (เช่นmy_project.git/)
  • <group-name>เป็นชื่อกลุ่มสำหรับผู้ใช้ git (เช่นผู้ใช้ )

ไม่ยอมแลก

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

ที่ไหน:

  • <project_dir> คือไดเร็กทอรีโปรเจ็กต์ที่มีไฟล์ .gitโฟลเดอร์
  • <group-name>เป็นชื่อกลุ่มสำหรับผู้ใช้ git (เช่นผู้ใช้ )

ดังที่ Charles กล่าวไว้เช่นกัน: chmod g-w objects/pack/*(ถ้าไม่ใช่พื้นที่เก็บข้อมูลเปล่าให้นำหน้า.git/)
Wernight

เราจะค้นหาชื่อกลุ่มหรือสร้างชื่อกลุ่มได้อย่างไร
Sujithrao

'chmod g + s find . -type d' ทำให้เกิดข้อผิดพลาดunable to execute /bin/chmod: Argument list too long
Dr.X

ตามที่ @ Dr.X กล่าวไว้chmod g+s `find . -type d`ไม่ได้ปรับขนาด ใช้find -type d -exec chmod g+s {} +
hagello

ฉันคิดว่าวัตถุที่หลวมทั้งหมดควรเป็นแบบอ่านอย่างเดียวตามสถานะก่อนการแชร์ chmod g-w objects/*/*บางทีสิ่งที่ต้องการ ฉันไม่แน่ใจเกี่ยวกับไดเรกทอรีย่อยข้อมูลแม้ว่าจะว่างเปล่าสำหรับ repo นี้
Eric

3

สิ่งนี้อาจไม่จำเป็น แต่ก็คุ้มค่าที่จะชี้ให้เห็นว่าgit init --bare --sharedตั้งค่าตัวเลือกdenonFastForwards

git config receive.denyNonFastForwards true

ความหมายของตัวเลือกนี้มีดังนี้:

receive.denyNonFastForwards

หากคุณ rebase ยอมรับว่าคุณได้ผลักดันไปแล้วและพยายามที่จะผลักดันอีกครั้งหรือพยายามที่จะส่งการคอมมิตไปยังสาขาระยะไกลที่ไม่มีข้อผูกมัดที่สาขาระยะไกลชี้อยู่ในปัจจุบันคุณจะถูกปฏิเสธ นี่เป็นนโยบายที่ดีโดยทั่วไป แต่ในกรณีของ rebase คุณอาจพิจารณาได้ว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่และสามารถบังคับอัปเดตสาขาระยะไกลด้วยแฟล็ก -f ไปยังคำสั่ง push

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


1

นอกเหนือจากคำตอบข้างต้นในการอนุญาตให้กลุ่มอ่าน / เขียนแล้วคุณยังต้องเพิ่มผู้ใช้ในกลุ่มด้วย (พูดว่า "foo")

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

หมายเหตุ: คุณจะต้องสร้างผู้ใช้ก่อนหากไม่มีอยู่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.