การรักษาสิทธิ์ของไฟล์ด้วย Git


109

ฉันต้องการควบคุมเวอร์ชันเว็บเซิร์ฟเวอร์ของฉันตามที่อธิบายไว้ใน การควบคุมเวอร์ชันสำหรับเว็บเซิร์ฟเวอร์ของฉันโดยการสร้าง git repo จาก/var/www directoryไฟล์. ความหวังของฉันคือจากนั้นฉันจะสามารถส่งเนื้อหาเว็บจากเซิร์ฟเวอร์ dev ของเราไปยัง github ดึงไปยังเซิร์ฟเวอร์ที่ใช้งานจริงของเราและใช้เวลาที่เหลือทั้งวันที่สระว่ายน้ำ

เห็นได้ชัดว่าข้อบกพร่องในแผนของฉันคือ Git จะไม่เคารพสิทธิ์ของไฟล์ (ฉันยังไม่ได้ลองอ่านตอนนี้เท่านั้น) ฉันเดาว่านี่สมเหตุสมผลแล้วที่กล่องต่างๆมีแนวโน้มที่จะมีการตั้งค่าผู้ใช้ / กลุ่มที่แตกต่างกัน แต่ถ้าฉันต้องการบังคับสิทธิ์ในการเผยแพร่เมื่อรู้ว่าเซิร์ฟเวอร์ของฉันได้รับการกำหนดค่าเหมือนกันฉันมีตัวเลือกใดบ้าง? หรือมีวิธีที่ง่ายกว่าในการเข้าถึงสิ่งที่ฉันพยายามทำ?



1
ใช่เดาอย่างนั้นแม้ว่าวิธีแก้ปัญหาที่พวกเขาชี้ไปที่ฉันไม่แน่ใจว่าจะทำอย่างไร หวังว่าจะได้แนวทางที่ตรงไปตรงมามากขึ้น
Yarin

แล้วสถานการณ์ที่ซอร์สโค้ดมาจากสภาพแวดล้อม Dev (เช่น Windows - XAMPP เป็นต้น) ที่ไม่มีข้อมูลการเป็นเจ้าของไฟล์ล่ะ? ไฟล์ในตอนท้ายของกระบวนการคอมไพล์ต้องตรงกับความเป็นเจ้าของและสิทธิ์สำหรับตำแหน่งเป้าหมาย git-cache-meta สามารถจัดการกับสิ่งนี้ได้หรือไม่? เห็นด้วยกับ Yarin ... แน่นอนว่านี่เป็นกรณีการใช้งานหลัก ๆ ที่น่าจะมีวิธีแก้ปัญหาที่ค่อนข้างตรงไปตรงมา?
user3600150

คำตอบ:


43

git-cache-metaกล่าวถึงใน SO คำถาม " คอมไพล์? - วิธีการกู้คืนสิทธิ์ของแฟ้มคอมไพล์คิดว่าไฟล์ที่ควรจะเป็น " (และคอมไพล์คำถามที่พบบ่อย ) เป็นวิธีที่ staightforward มากขึ้น

แนวคิดคือการจัดเก็บ.git_cache_metaสิทธิ์ของไฟล์และไดเรกทอรีในไฟล์
เป็นไฟล์แยกต่างหากที่ไม่ได้กำหนดเวอร์ชันโดยตรงใน Git repo

นั่นคือเหตุผลที่การใช้งานของมันคือ:

$ git bundle create mybundle.bdl master; git-cache-meta --store
$ scp mybundle.bdl .git_cache_meta machine2: 
#then on machine2:
$ git init; git pull mybundle.bdl master; git-cache-meta --apply

แล้วคุณละ:

  • รวม repo ของคุณและบันทึกการอนุญาตไฟล์ที่เกี่ยวข้อง
  • คัดลอกไฟล์ทั้งสองนี้บนเซิร์ฟเวอร์ระยะไกล
  • คืนค่า repo ที่นั่นและใช้การอนุญาต

2
VonC- ขอบคุณสำหรับสิ่งนี้ฉันจะลองดู - แต่การรวมกลุ่มจำเป็นหรือไม่? ฉันไม่สามารถรักษาเวิร์กโฟลว์ (dev -> github -> production) และเช็คอิน / เช็คเอาต์เมตาไฟล์ได้หรือไม่
Yarin

@ Yarin: ไม่มัดไม่บังคับ เป็นวิธีที่เรียบร้อยในการถ่ายโอน repo เมื่อไม่มีโปรโตคอลการถ่ายโอนอื่น ๆ
VonC

3
การใช้บันเดิลที่นี่เป็นสิ่งที่ทำให้ไขว้เขวอย่างมากสำหรับฉัน มันทำให้ฉันเข้าใจคำตอบทั้งหมดจริงๆแล้ว (ฉันไม่มีปัญหาในการดึง repo จากเซิร์ฟเวอร์) คำตอบของ @ omid-ariyan ด้านล่างพร้อมตะขอผูกก่อน / โพสต์นั้นเข้าใจได้มากขึ้น ต่อมาฉันรู้ว่าสคริปต์ hook เหล่านั้นทำงานเหมือนกับ git-cache-meta ไปดูสิ่งที่ฉันหมายถึง: gist.github.com/andris9/1978266 git ls-filesพวกเขาจะแยกและจัดเก็บผลตอบแทนจาก
pauljohn32

ลิงก์ไปยัง git-cache-meta หมดแล้ว - คนที่รู้เกี่ยวกับเรื่องนี้สามารถค้นหาและแก้ไขโพสต์ได้หรือไม่?
rosuav

@rosuav Sure: ฉันได้แก้ไขคำตอบและกู้คืนลิงก์แล้ว ขอขอบคุณที่แจ้งให้เราทราบถึงลิงก์ที่ตายแล้วนี้
VonC

63

Git เป็นระบบควบคุมเวอร์ชันที่สร้างขึ้นเพื่อการพัฒนาซอฟต์แวร์ดังนั้นจากชุดโหมดและสิทธิ์ทั้งหมดจะเก็บเฉพาะบิตที่ปฏิบัติการได้ (สำหรับไฟล์ธรรมดา) และบิตซิมลิงค์ หากคุณต้องการจัดเก็บสิทธิ์แบบเต็มคุณต้องมีเครื่องมือของบุคคลที่สามเช่นgit-cache-meta( กล่าวถึงโดย VonC ) หรือMetastore (ใช้โดยetckeeper ) หรือคุณสามารถใช้IsiSetupซึ่ง IIRC ใช้ git เป็นแบ็กเอนด์

ดูอินเทอร์เฟซส่วนหน้าและหน้าเครื่องมือใน Git Wiki


2
ขอบคุณจาคุบ - คุณช่วยอธิบายให้ฉันฟังได้ไหมว่าทำไม Git ถึงใส่ใจกับบิตที่เรียกใช้งานได้
Yarin

5
@ Yarin: บิตเรียกทำงานเท่านั้น? เมื่อคุณโคลนชุดไฟล์ทั้งหมดจากระบบหนึ่งไปยังอีกระบบหนึ่งแนวคิดของ "อ่านอย่างเดียว" หรือ "อ่าน - เขียน" จะไม่เกี่ยวข้องกันทั้งหมด (ดังที่คุณกล่าวไว้ในคำถามของคุณ: ผู้ใช้ / กลุ่มที่แตกต่างกัน) แต่แนวคิดของ "ปฏิบัติการ" ไม่ได้ขึ้นอยู่กับผู้ใช้และกลุ่มและสามารถใช้ซ้ำได้จากระบบไปยังระบบ (ระยะไกล)
VonC

1
Jakub ในกรณีนี้ไม่ควรเปลี่ยนการอนุญาต ฉันหมายความว่าควรปล่อยให้ perms ไว้คนเดียวหรือจัดการ แต่อย่ายุ่งกับพวกเขาถ้ามันจะไม่จัดการ
CommaToast

3
นอกจากนี้ฉันพบ/usr/share/git-core/contrib/hooks/setgitperms.perlในgit-contribแพ็คเกจของฉัน- สคริปต์สำหรับวัตถุประสงค์ที่คล้ายกัน ("สคริปต์นี้สามารถใช้เพื่อบันทึก / กู้คืนสิทธิ์ทั้งหมดและข้อมูลการเป็นเจ้าของภายในโครงสร้างการทำงานของคอมไพล์")
imz - Ivan Zakharyaschev

สิ่งนี้ยังคงถูกต้องหรือไม่หรือ github ทำอะไรบางอย่างกับ git? ฉันเพิ่งเปลี่ยนไฟล์เป็นปฏิบัติการและคอมมิตและการเปลี่ยนแปลงสำหรับคอมมิตจะแสดงขึ้นเมื่อมีการเปลี่ยนแปลง 0 บรรทัดสำหรับไฟล์ แต่มี 100644 → 100755 ข้างชื่อไฟล์ ดูเหมือนว่าสิทธิ์ทั้งหมดจะถูกเก็บไว้ในไฟล์
Cruncher

23

มันค่อนข้างช้า แต่อาจช่วยคนอื่นได้บ้าง ฉันทำในสิ่งที่คุณต้องการทำโดยการเพิ่มเบ็ด git สองตัวในที่เก็บของฉัน

.git / hooks / pre-commit:

#!/bin/bash
#
# A hook script called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if it wants
# to stop the commit.

SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions

# Clear the permissions database file
> $DATABASE

echo -n "Backing-up permissions..."

IFS_OLD=$IFS; IFS=$'\n'
for FILE in `git ls-files --full-name`
do
   # Save the permissions of all the files in the index
   echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done

for DIRECTORY in `git ls-files --full-name | xargs -n 1 dirname | uniq`
do
   # Save the permissions of all the directories in the index
   echo $DIRECTORY";"`stat -c "%a;%U;%G" $DIRECTORY` >> $DATABASE
done
IFS=$IFS_OLD

# Add the permissions database file to the index
git add $DATABASE -f

echo "OK"

.git / hooks / หลังการชำระเงิน:

#!/bin/bash

SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions

echo -n "Restoring permissions..."

IFS_OLD=$IFS; IFS=$'\n'
while read -r LINE || [[ -n "$LINE" ]];
do
   ITEM=`echo $LINE | cut -d ";" -f 1`
   PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
   USER=`echo $LINE | cut -d ";" -f 3`
   GROUP=`echo $LINE | cut -d ";" -f 4`

   # Set the file/directory permissions
   chmod $PERMISSIONS $ITEM

   # Set the file/directory owner and groups
   chown $USER:$GROUP $ITEM

done < $DATABASE
IFS=$IFS_OLD

echo "OK"

exit 0

hook แรกถูกเรียกเมื่อคุณ "กระทำ" และจะอ่านความเป็นเจ้าของและสิทธิ์สำหรับไฟล์ทั้งหมดในที่เก็บและเก็บไว้ในไฟล์ในรูทของที่เก็บที่เรียกว่า. permissions จากนั้นเพิ่มไฟล์. permissions ลงในคอมมิต

เบ็ดตัวที่สองถูกเรียกเมื่อคุณ "ชำระเงิน" และจะเข้าไปดูรายการไฟล์ในไฟล์. permissions และเรียกคืนการเป็นเจ้าของและสิทธิ์ของไฟล์เหล่านั้น

  • คุณอาจต้องทำการคอมมิตและชำระเงินโดยใช้ sudo
  • ตรวจสอบให้แน่ใจว่าสคริปต์ก่อนการคอมมิตและหลังการชำระเงินมีสิทธิ์ดำเนินการ

โอมิด ... ขอบคุณ! ฉันพบว่ารหัสของคุณเป็นโซลูชันที่สมบูรณ์แบบสำหรับฉัน
Ricalsin

@Ricalsin ยินดีเป็นอย่างยิ่ง! ฉันดีใจที่ได้ช่วย :)
Omid Ariyan

1
$SELF_DIR/../../ไม่จำเป็นต้องเป็นรูทของที่เก็บ ... แต่git rev-parse --show-toplevelเป็น (ไม่แน่ใจว่าทำไมคุณถึงไม่ใช้pwdสำหรับไดเร็กทอรีปัจจุบัน แต่ก็เป็นที่น่า
รังเกียจ

ตามที่กล่าวมาข้างต้นจะแบ่งชื่อไฟล์โดยมีช่องว่างอยู่ ตามคำตอบนี้คุณสามารถตั้งค่าIFS=$'\n'ก่อนforลูปเพื่อหยุดการทำงานนั้น (และunset IFSหลังจากนั้นจึงจะปลอดภัย)
PJSCopeland

สิ่งนี้ไม่อนุญาตให้คุณนำสิทธิ์ไปยังระบบอื่นโดยใช้ระบบปฏิบัติการอื่นโดยที่คุณมีชื่อผู้ใช้อื่น ฉันถามตัวเองว่า "ฉันต้องการอะไรจริงๆ" และตัดลงวิธีการแก้ปัญหาทั้งในchmod 0600 .pgpass post-checkoutใช่ฉันจะต้องอัปเดตด้วยตนเองเมื่อใดก็ตามที่ฉันมีไฟล์ที่ต้องการการอนุญาตเฉพาะ แต่ไฟล์นั้นเป็นช่วงพัก
PJSCopeland

2

ในกรณีที่คุณเข้ามาในตอนนี้ฉันเพิ่งผ่านมันมาในวันนี้และสามารถสรุปได้ว่านี่คือจุดใด หากคุณยังไม่ได้ลองดูรายละเอียดบางอย่างที่นี่อาจช่วยได้

ฉันคิดว่าแนวทางของ @Omid Ariyan เป็นวิธีที่ดีที่สุด เพิ่มสคริปต์ล่วงหน้าและหลังการชำระเงิน อย่าลืมตั้งชื่อให้ตรงกับที่ Omid ทำและอย่าลืมทำให้มันสามารถใช้งานได้ หากคุณลืมอย่างใดอย่างหนึ่งสิ่งเหล่านี้จะไม่มีผลใด ๆ และคุณเรียกใช้ "คอมมิต" ซ้ำแล้วซ้ำอีกโดยสงสัยว่าทำไมไม่มีอะไรเกิดขึ้น :) นอกจากนี้หากคุณตัดและวางออกจากเว็บเบราว์เซอร์ระวังอย่าให้เครื่องหมายคำพูดและเครื่องหมายถูก เปลี่ยนแปลง

หากคุณรันสคริปต์ pre-commit หนึ่งครั้ง (โดยรัน git คอมมิต) ไฟล์. permissions จะถูกสร้างขึ้น คุณสามารถเพิ่มลงในที่เก็บได้และฉันคิดว่าไม่จำเป็นที่จะต้องเพิ่มซ้ำแล้วซ้ำอีกในตอนท้ายของสคริปต์ก่อนการคอมมิต แต่มันไม่เจ็บฉันคิดว่า (หวังว่า)

มีปัญหาเล็กน้อยเกี่ยวกับชื่อไดเร็กทอรีและการมีอยู่ของช่องว่างในชื่อไฟล์ในสคริปต์ของ Omid ช่องว่างเป็นปัญหาที่นี่และฉันมีปัญหากับการแก้ไข IFS สำหรับเร็กคอร์ดสคริปต์พรีคอมมิตทำงานสำหรับฉัน:

#!/bin/bash  

SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions

# Clear the permissions database file
> $DATABASE

echo -n "Backing-up file permissions..."

IFSold=$IFS
IFS=$'\n'
for FILE  in `git ls-files`
do
   # Save the permissions of all the files in the index
   echo $FILE";"`stat -c "%a;%U;%G" $FILE` >> $DATABASE
done
IFS=${IFSold}
# Add the permissions database file to the index
git add $DATABASE

echo "OK"

ทีนี้เราจะได้อะไรจากสิ่งนี้?

ไฟล์. permissions อยู่ในระดับบนสุดของ git repo มีหนึ่งบรรทัดต่อไฟล์นี่คือด้านบนของตัวอย่างของฉัน:

$ cat .permissions
.gitignore;660;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.doc;664;pauljohn;pauljohn
05.WhatToReport/05.WhatToReport.pdf;664;pauljohn;pauljohn

อย่างที่คุณเห็นเรามี

filepath;perms;owner;group

ในความคิดเห็นเกี่ยวกับแนวทางนี้ผู้โพสต์คนหนึ่งบ่นว่าใช้ได้กับชื่อผู้ใช้เดียวกันเท่านั้นและนั่นเป็นความจริงในทางเทคนิค แต่ก็แก้ไขได้ง่ายมาก หมายเหตุสคริปต์หลังการชำระเงินมี 2 ส่วนการดำเนินการ

# Set the file permissions
chmod $PERMISSIONS $FILE
# Set the file owner and groups
chown $USER:$GROUP $FILE

ดังนั้นฉันจึงเก็บไว้เพียงคนแรกนั่นคือทั้งหมดที่ฉันต้องการ ชื่อผู้ใช้ของฉันบนเว็บเซิร์ฟเวอร์แตกต่างกันแน่นอน แต่ที่สำคัญกว่านั้นคือคุณไม่สามารถเรียกใช้ chown ได้เว้นแต่คุณจะรูท อย่างไรก็ตามสามารถเรียกใช้ "chgrp" ได้ มันธรรมดาพอที่จะนำไปใช้

ในคำตอบแรกในโพสต์นี้คำตอบที่ได้รับการยอมรับมากที่สุดข้อเสนอแนะคือให้ใช้ git-cache-meta ซึ่งเป็นสคริปต์ที่ทำงานแบบเดียวกับที่สคริปต์ pre / post hook ที่นี่กำลังทำอยู่ (แยกวิเคราะห์ผลลัพธ์จากgit ls-files) . สคริปต์เหล่านี้ง่ายกว่าสำหรับฉันที่จะเข้าใจโค้ด git-cache-meta นั้นค่อนข้างซับซ้อนกว่า เป็นไปได้ที่จะเก็บ git-cache-meta ไว้ในพา ธ และเขียนสคริปต์ pre-commit และ post-checkout ที่จะใช้

ช่องว่างในชื่อไฟล์เป็นปัญหากับสคริปต์ของ Omid ทั้งสอง ในสคริปต์หลังการชำระเงินคุณจะรู้ว่าคุณมีช่องว่างในชื่อไฟล์หากคุณเห็นข้อผิดพลาดเช่นนี้

$ git checkout -- upload.sh
Restoring file permissions...chmod: cannot access  '04.StartingValuesInLISREL/Open': No such file or directory
chmod: cannot access 'Notebook.onetoc2': No such file or directory
chown: cannot access '04.StartingValuesInLISREL/Open': No such file or directory
chown: cannot access 'Notebook.onetoc2': No such file or directory

ฉันกำลังตรวจสอบวิธีแก้ปัญหาสำหรับสิ่งนั้น นี่คือสิ่งที่ดูเหมือนจะใช้ได้ แต่ฉันได้ทดสอบในกรณีเดียวเท่านั้น

#!/bin/bash

SELF_DIR=`git rev-parse --show-toplevel`
DATABASE=$SELF_DIR/.permissions

echo -n "Restoring file permissions..."
IFSold=${IFS}
IFS=$
while read -r LINE || [[ -n "$LINE" ]];
do
   FILE=`echo $LINE | cut -d ";" -f 1`
   PERMISSIONS=`echo $LINE | cut -d ";" -f 2`
   USER=`echo $LINE | cut -d ";" -f 3`
   GROUP=`echo $LINE | cut -d ";" -f 4`

   # Set the file permissions
   chmod $PERMISSIONS $FILE
   # Set the file owner and groups
   chown $USER:$GROUP $FILE
done < $DATABASE
IFS=${IFSold}
echo "OK"

exit 0

เนื่องจากข้อมูลการอนุญาตมีทีละบรรทัดฉันจึงตั้งค่า IFS เป็น $ ดังนั้นการแบ่งบรรทัดจึงถูกมองว่าเป็นสิ่งใหม่เท่านั้น

ฉันอ่านแล้วว่าเป็นสิ่งสำคัญมากที่จะตั้งค่าตัวแปรสภาพแวดล้อม IFS ให้กลับมาเหมือนเดิม! คุณสามารถดูได้ว่าเหตุใดเซสชันเชลล์จึงทำงานได้ไม่ดีหากคุณปล่อยให้ $ เป็นตัวคั่นเดียว


2

เราสามารถปรับปรุงคำตอบอื่น ๆ ได้โดยการเปลี่ยนรูปแบบของ.permissionsไฟล์ให้เป็นchmodคำสั่งที่เรียกใช้งานได้และใช้-printfพารามิเตอร์เป็นfind. นี่คือ.git/hooks/pre-commitไฟล์ที่ง่ายกว่า:

#!/usr/bin/env bash

echo -n "Backing-up file permissions... "

cd "$(git rev-parse --show-toplevel)"

find . -printf 'chmod %m "%p"\n' > .permissions

git add .permissions

echo done.

... และนี่คือ.git/hooks/post-checkoutไฟล์แบบง่าย:

#!/usr/bin/env bash

echo -n "Restoring file permissions... "

cd "$(git rev-parse --show-toplevel)"

. .permissions

echo "done."

โปรดจำไว้ว่าเครื่องมืออื่น ๆ อาจกำหนดค่าสคริปต์เหล่านี้ไว้แล้วดังนั้นคุณอาจต้องรวมเข้าด้วยกัน ตัวอย่างเช่นนี่คือpost-checkoutสคริปต์ที่มีgit-lfsคำสั่งด้วย:

#!/usr/bin/env bash

echo -n "Restoring file permissions... "

cd "$(git rev-parse --show-toplevel)"

. .permissions

echo "done."

command -v git-lfs >/dev/null 2>&1 || { echo >&2 "\nThis repository is configured for Git LFS but 'git-lfs' was not found on you
r path. If you no longer wish to use Git LFS, remove this hook by deleting .git/hooks/post-checkout.\n"; exit 2; }
git lfs post-checkout "$@"

1

ในการกระทำล่วงหน้า / หลังการชำระเงินตัวเลือกคือการใช้ยูทิลิตี้ "mtree" (FreeBSD) หรือ "fmtree" (Ubuntu) ซึ่ง "เปรียบเทียบลำดับชั้นของไฟล์กับข้อกำหนดสร้างข้อกำหนดสำหรับลำดับชั้นของไฟล์หรือปรับเปลี่ยน ข้อกำหนด "

ชุดเริ่มต้นคือแฟล็ก gid ลิงก์โหมด nlink ขนาดเวลาประเภทและ uid สิ่งนี้สามารถติดตั้งเพื่อวัตถุประสงค์เฉพาะด้วยสวิตช์ -k


1

ฉันทำงานบน FreeBSD 11.1 แนวคิด freebsd jail virtualization ทำให้ระบบปฏิบัติการดีที่สุด Git เวอร์ชันปัจจุบันที่ฉันใช้คือ 2.15.1 ฉันชอบที่จะรันทุกอย่างบนเชลล์สคริปต์ด้วย ด้วยเหตุนี้ฉันจึงแก้ไขคำแนะนำข้างต้นดังนี้:

git push: .git / hooks / pre-commit

#! /bin/sh -
#
# A hook script called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if it wants
# to stop the commit.

SELF_DIR=$(git rev-parse --show-toplevel);
DATABASE=$SELF_DIR/.permissions;

# Clear the permissions database file
> $DATABASE;

printf "Backing-up file permissions...\n";

OLDIFS=$IFS;
IFS=$'\n';
for FILE in $(git ls-files);
do
   # Save the permissions of all the files in the index
    printf "%s;%s\n" $FILE $(stat -f "%Lp;%u;%g" $FILE) >> $DATABASE;
done
IFS=$OLDIFS;

# Add the permissions database file to the index
git add $DATABASE;

printf "OK\n";

git pull: .git / hooks / post-merge

#! /bin/sh -

SELF_DIR=$(git rev-parse --show-toplevel);
DATABASE=$SELF_DIR/.permissions;

printf "Restoring file permissions...\n";

OLDIFS=$IFS;
IFS=$'\n';
while read -r LINE || [ -n "$LINE" ];
do
   FILE=$(printf "%s" $LINE | cut -d ";" -f 1);
   PERMISSIONS=$(printf "%s" $LINE | cut -d ";" -f 2);
   USER=$(printf "%s" $LINE | cut -d ";" -f 3);
   GROUP=$(printf "%s" $LINE | cut -d ";" -f 4);

   # Set the file permissions
   chmod $PERMISSIONS $FILE;

   # Set the file owner and groups
   chown $USER:$GROUP $FILE;

done < $DATABASE
IFS=$OLDIFS

pritnf "OK\n";

exit 0;

หากด้วยเหตุผลบางประการคุณต้องสร้างสคริปต์ขึ้นใหม่เอาต์พุตไฟล์. permissions ควรมีรูปแบบต่อไปนี้:

.gitignore;644;0;0

สำหรับไฟล์. gitignore ที่มีการอนุญาต 644 ให้กับ root: wheel

สังเกตว่าฉันต้องทำการเปลี่ยนแปลงเล็กน้อยกับตัวเลือกสถิติ

สนุก,


1

อีกหนึ่งคำตอบของ @Omid Ariyan คือสิทธิ์ในไดเรกทอรี เพิ่มสิ่งนี้หลังจากforวนซ้ำdoneในpre-commitสคริปต์ของเขา

for DIR in $(find ./ -mindepth 1 -type d -not -path "./.git" -not -path "./.git/*" | sed 's@^\./@@')
do
    # Save the permissions of all the files in the index
    echo $DIR";"`stat -c "%a;%U;%G" $DIR` >> $DATABASE
done

ซึ่งจะช่วยประหยัดการอนุญาตไดเรกทอรีด้วย

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