วิธีเพิ่มสิทธิ์ chmod ในไฟล์ใน GIT?


182

ฉันต้องการคอมไพล์ยอมรับไฟล์. sh แต่ต้องการให้สามารถเรียกใช้งานได้เมื่อฉันเช็คเอาต์ไฟล์เดียวกันนั้นในเซิร์ฟเวอร์อื่น

มีวิธีการทำเช่นนั้นโดยไม่ต้อง chmod u + x ไฟล์นั้นด้วยตนเองในเซิร์ฟเวอร์ที่เช็คเอาต์ไฟล์หรือไม่?

คำตอบ:


291

ตามเอกสารอย่างเป็นทางการคุณสามารถตั้งค่าหรือลบการตั้งค่าสถานะ "ปฏิบัติการ" ในไฟล์ที่ถูกติดตามโดยใช้update-indexคำสั่งย่อย

ในการตั้งค่าสถานะใช้คำสั่งต่อไปนี้:

git update-index --chmod=+x path/to/file

หากต้องการลบให้ใช้:

git update-index --chmod=-x path/to/file

ภายใต้ประทุน

ขณะนี้ดูเหมือนว่าระบบอนุญาตไฟล์ยูนิกซ์ทั่วไป แต่จริงๆแล้วไม่ใช่ Git รักษา "โหมด" พิเศษสำหรับแต่ละไฟล์ในที่เก็บข้อมูลภายใน:

  • 100644 สำหรับไฟล์ปกติ
  • 100755 สำหรับคนที่ปฏิบัติการได้

คุณสามารถเห็นภาพโดยใช้คำls-fileสั่งย่อยพร้อม--stageตัวเลือก:

$ git ls-files --stage
100644 aee89ef43dc3b0ec6a7c6228f742377692b50484 0       .gitignore
100755 0ac339497485f7cc80d988561807906b2fd56172 0       my_executable_script.sh

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

git config core.fileMode false

การแก้ไขปัญหา

หาก ณ จุดหนึ่งไม่ได้ตั้งค่าโหมดไฟล์ Git แต่ไฟล์มีการตั้งค่าสถานะระบบไฟล์ที่ถูกต้องลองลบโหมดและตั้งค่าอีกครั้ง:

git update-index --chmod=-x path/to/file
git update-index --chmod=+x path/to/file

โบนัส

เริ่มต้นด้วย Git 2.9 คุณสามารถจัดวางไฟล์และตั้งค่าสถานะในคำสั่งเดียว:

git add --chmod=+x path/to/file

เมื่อฉันทำเช่นนั้นเพื่อ test.sh คอมไพล์คอมมิตและพุชและเช็คเอาต์ในเซิร์ฟเวอร์อื่นสิ่งเหล่านี้คือ perms ของไฟล์นั้น: -rw-rw-r-- ผู้ใช้ 1 ราย 12 Dec 5 11:42 test.sh
Henley ชิว

ฉันเพิ่งทำการทดสอบบนหนึ่งในที่เก็บของฉันและทำงานได้ตามที่คาดไว้ การอนุญาตถูกตั้งค่าบนไฟล์โดยใช้คำสั่งที่มีให้ภายใต้ Windows บนหนึ่งในเซิร์ฟเวอร์ของฉัน (Debian) ไฟล์มีสิทธิ์ -rw-r - r-- ก่อนหน้านี้ตั้งค่าเป็น -rwxr-xr-x คุณใช้เวอร์ชัน git รุ่นใดบนเครื่องโลคอลและรีโมท?
Antwane

git รุ่น 1.9.5 ในท้องถิ่นของฉันและ git 1.7.1 ในเซิร์ฟเวอร์ที่ทำการชำระเงิน
Henley Chiu

เพิ่งพยายามโคลนบนเซิร์ฟเวอร์อื่น (เก่ากว่า) ด้วย git 1.7.10 มันยังใช้งานได้ดีไฟล์มีสิทธิ์ x บางทีคุณอาจทำผิดพลาดในบางครั้งหรือคุณมีปัญหาการอนุญาตกับผู้ใช้ที่โคลนบนเซิร์ฟเวอร์ระยะไกล
Antwane

โปรดทราบว่าคุณสามารถเปลี่ยนการอนุญาต (ตั้งค่าหรือล้าง) ได้เท่านั้น Git ไม่ได้ติดตามการอนุญาตอื่น ๆ (เช่นสิทธิ์ในการอ่านหรือเขียน)
Dan Anderson

25

คำตอบของ Antwaneนั้นถูกต้องและนี่ควรเป็นความคิดเห็น แต่ความคิดเห็นมีพื้นที่ไม่เพียงพอและไม่อนุญาตการจัดรูปแบบ :-) ฉันแค่ต้องการเพิ่มว่าใน Git การอนุญาตไฟล์จะถูกบันทึกเพียง1เป็นอย่างใดอย่างหนึ่ง644หรือ755(สะกด ( 100644และ100755; 100ส่วนหมายถึง "ไฟล์ปกติ"):

diff --git a/path b/path
new file mode 100644

อดีต —644— หมายความว่าไฟล์ไม่ควรเรียกใช้งานได้และไฟล์หลังหมายความว่าควรเรียกใช้ไฟล์ได้ วิธีที่เปลี่ยนเป็นโหมดไฟล์จริงภายในระบบไฟล์ของคุณนั้นขึ้นอยู่กับระบบปฏิบัติการ บนระบบที่คล้าย Unix บิตจะถูกส่งผ่านumaskการตั้งค่าของคุณซึ่งโดยปกติจะ022เป็นการลบสิทธิ์การเขียนจาก "กลุ่ม" และ "อื่น ๆ " หรือ002เพื่อลบสิทธิ์การเขียนจาก "อื่น ๆ " เท่านั้น อาจเป็นเพราะ077คุณกังวลเกี่ยวกับความเป็นส่วนตัวโดยเฉพาะและต้องการลบการอ่านเขียนและดำเนินการอนุญาตจาก "กลุ่ม" และ "อื่น ๆ "


1รุ่นล่าสุดของ Git บันทึกสิทธิ์ของกลุ่มเพื่อให้ที่เก็บบางรายการมีรายการต้นไม้ที่มีโหมด664อยู่ Modern Git ไม่ได้ แต่เนื่องจากไม่มีส่วนใดของวัตถุใดสามารถเปลี่ยนแปลงบิตสิทธิ์เก่าเหล่านั้นยังคงอยู่ในวัตถุต้นไม้เก่า

การเปลี่ยนแปลงในการจัดเก็บเพียง 0644 หรือ 0755 คือในการกระทำe44794706eeb57f2ซึ่งอยู่ก่อน Git v0.99 และลงวันที่ 16 เมษายน 2005


"Git รุ่นก่อนหน้า" มีแนวคิดใดบ้างที่รุ่นที่แน่นอนจะได้รับผลกระทบจากสิ่งนี้
user5359531

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