ในกรณีที่คุณเข้ามาในตอนนี้ฉันเพิ่งผ่านมันมาในวันนี้และสามารถสรุปได้ว่านี่คือจุดใด หากคุณยังไม่ได้ลองดูรายละเอียดบางอย่างที่นี่อาจช่วยได้
ฉันคิดว่าแนวทางของ @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 ให้กลับมาเหมือนเดิม! คุณสามารถดูได้ว่าเหตุใดเซสชันเชลล์จึงทำงานได้ไม่ดีหากคุณปล่อยให้ $ เป็นตัวคั่นเดียว