วิธีสร้างการอนุญาตให้เรียกใช้งานโหมดไฟล์ใน Git บน Windows


378

ฉันใช้ Git ใน Windows และต้องการที่จะผลักดันเชลล์สคริปต์ที่เรียกใช้งานได้ไปสู่ ​​repo Git โดยการคอมมิทหนึ่งครั้ง

โดยปกติฉันต้องทำสองขั้นตอน ( git commit)

$ vi install.sh
$ git add install.sh  
$ git commit -am "add new file for installation" # first commit
[master f2e92da] add support for install.sh
 1 files changed, 18 insertions(+), 3 deletions(-)
 create mode 100644 install.sh
$ git update-index --chmod=+x install.sh
$ git commit -am "update file permission"        # second commit
[master 317ba0c] update file permission
  0 files changed
  mode change 100644 => 100755 install.sh

ฉันจะรวมสองขั้นตอนเหล่านี้เป็นขั้นตอนเดียวได้อย่างไร การกำหนดค่าคอมไพล์? คำสั่ง windows?

เตือน : คำตอบสองข้อดีgit add --chmod=+x fileมีการสนับสนุนในเวอร์ชันคอมไพล์ใหม่

การอ้างอิง: ดูคำถามในการอนุญาตไฟล์ Git บน Windowsสำหรับการส่งครั้งที่สอง


10
ด้วย git 2.9.x / 2.10 (ไตรมาสที่ 3 ปี 2559) git add --chmod=+xเป็นไปได้จริง ดูคำตอบของฉันด้านล่าง , เครดิตให้กับเอ็ดเวิร์ดทอมสัน
VonC

5
มันจะคุ้มค่าที่จะอัปเดตคำตอบสำหรับgit add --chmod=+xรุ่นที่เลือก
mikemaccana

คำตอบ:


590

ไม่จำเป็นต้องทำสิ่งนี้ในสองคอมมิทคุณสามารถเพิ่มไฟล์และทำเครื่องหมายไฟล์ที่เรียกใช้งานได้ในคอมมิทเดียว:

C:\Temp\TestRepo>touch foo.sh

C:\Temp\TestRepo>git add foo.sh

C:\Temp\TestRepo>git ls-files --stage
100644 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

ดังที่คุณทราบหลังจากเพิ่มโหมดคือ 0644 (เช่นไม่สามารถใช้งานได้) อย่างไรก็ตามเราสามารถทำเครื่องหมายเป็นปฏิบัติการก่อนที่จะกระทำ:

C:\Temp\TestRepo>git update-index --chmod=+x foo.sh

C:\Temp\TestRepo>git ls-files --stage
100755 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 0       foo.sh

และตอนนี้ไฟล์คือโหมด 0755 (ปฏิบัติการ)

C:\Temp\TestRepo>git commit -m"Executable!"
[master (root-commit) 1f7a57a] Executable!
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100755 foo.sh

และตอนนี้เรามีการคอมไฟล์หนึ่งไฟล์ที่สามารถเอ็กซีคิ้วท์ได้


147

แน่นอนมันคงจะดีถ้าgit-addมี--modeธง

git 2.9.x / 2.10 (ไตรมาส 3 ปี 2559) จริง ๆ แล้วจะอนุญาต (ขอบคุณEdward Thomson ):

git add --chmod=+x -- afile
git commit -m"Executable!"

ทำให้กระบวนการทั้งหมดนั้นเร็วขึ้นและทำงานได้แม้ว่าcore.filemodeจะถูกตั้งค่าเป็นเท็จ

ดูกระทำ 4e55ed3 (31 พฤษภาคม 2016) โดยเอ็ดเวิร์ดทอมสัน (ethomson )
ช่วยโดย: โยฮันเน Schindelin (dscho )
(ผสานโดยJunio ​​C Hamano - gitster- in c8b080a , 06 Jul 2016)

add: เพิ่ม--chmod=+x/ --chmod=-xตัวเลือก

บิตปฏิบัติการจะไม่ถูกตรวจพบ (และดังนั้นจึงจะไม่เป็นชุด) สำหรับเส้นทางในพื้นที่เก็บข้อมูลที่มีการcore.filemodeตั้งค่าเป็นเท็จ แต่ผู้ใช้ยังอาจต้องการเพิ่มไฟล์ปฏิบัติการสำหรับการทำงานร่วมกันกับผู้ใช้คนอื่น ๆ ที่ทำมีcore.filemode ฟังก์ชั่น
ตัวอย่างเช่นผู้ใช้ Windows ที่เพิ่มเชลล์สคริปต์อาจต้องการเพิ่มเป็นไฟล์ปฏิบัติการเพื่อให้เข้ากันได้กับผู้ใช้ที่ไม่ใช่ Windows

แม้ว่านี่จะสามารถทำได้ด้วยคำสั่งประปา ( git update-index --add --chmod=+x foo), การเรียนการสอนgit-addคำสั่งให้ผู้ใช้สามารถตั้งค่าการปฏิบัติการไฟล์ที่มีคำสั่งที่พวกเขาคุ้นเคยกับ


22

ถ้าไฟล์ที่มีอยู่แล้วมีชุด + x ธงgit update-index --chmod=+xไม่ทำอะไรเลยและคอมไพล์คิดว่าไม่มีอะไรที่จะกระทำแม้ว่าธงไม่ได้ถูกบันทึกลงในซื้อคืน

คุณต้องลบแฟล็กรันคำสั่ง git จากนั้นนำแฟล็กกลับมา:

chmod -x <file>
git update-index --chmod=+x <file>
chmod +x <file>

จากนั้นคอมไพล์เห็นการเปลี่ยนแปลงและจะช่วยให้คุณสามารถยอมรับการเปลี่ยนแปลง


9

หมายเหตุคือก่อนอื่นคุณต้องแน่ใจว่าเกี่ยวกับการfilemodeตั้งค่าfalseในไฟล์ config git หรือใช้คำสั่งนี้:

git config core.filemode false

และจากนั้นคุณสามารถตั้งค่าการอนุญาต 0777 ด้วยคำสั่งนี้:

git update-index --chmod=+x foo.sh

3

ฉันไม่มีtouchและchmodคำสั่งใน cmd.exe ของฉันและgit update-index --chmod=+x foo.shไม่ทำงานสำหรับฉัน

ในที่สุดฉันก็แก้ปัญหาโดยการตั้งค่าskip-worktreeบิต:

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