Git chmod ปัญหา: สกรูเช็คเอาต์บิต exec


10

ภายใต้ Ubuntu และ Debian ไฟล์ที่คอมมิทล่าสุดได้รับชุดบิตเรียกใช้งานเมื่อฉันลองเช็คเอาต์หลังจากนั้น มันค่อนข้างแปลกและขับฉันถั่ว:

$ ls -l file
-rw-r--r-- ... file

# on branch master:
$ git commit -m 'mode is 644' file
[master 0123456] mode is 644
 1 files changed, 1 insertions(+), 1 deletions(-)
# All ok

$ git checkout dev-branch
Switched to branch 'dev-branch'
# Seemingly all ok, but file now has the exec bit set

$ git merge master
Updating 6543210..0123456
error: Your local changes to 'file' would be overwritten by merge.  Aborting.
Please, commit your changes or stash them before you can merge.
# Oops...

$ ls -l file
-rwxr-xr-x ... file

มีใครมีความคิดบ้างเมื่อใดและเพราะเหตุใดบิตการดำเนินการจึงลื่นไหล มีการตั้งค่าcore.filemodetrue

ฉันมีไฟล์ที่เปิดเป็นกลุ่มในระหว่างการสลับสาขาหากเป็นสิ่งสำคัญ

ภาคผนวก 1:นั่นคือการชำระเงินซึ่งจะมีการอนุญาตให้ใช้สิทธิ์มากเกินไป ฉันสามารถเล่นเกมบนและบน:

$ git br
* master
  dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout dev-branch

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

$ chmod 644 file

$ git diff

$ git checkout master

$ git diff
diff --git a/file b/file
old mode 100644
new mode 100755

# ...and so on ad inf.

ภาคผนวก 2:สิ่งนี้เกิดขึ้นตามจริงสำหรับทุก ๆ ไฟล์ในที่เก็บที่ฉันยอมรับ หลังจากความสำเร็จที่ได้รับมอบหมายฉันไม่สามารถสลับสาขาได้หากไม่ได้รับอนุญาต


คุณได้ตรวจสอบสิทธิ์ที่ขั้นตอน #seemingly ทั้งหมด ok ...
RobotHumans

ฉันเห็นด้วยที่นี่ บน dev-branch 'git-log master ... HEAD - file' และดูว่ามีอะไรเปลี่ยนแปลงระหว่างสาขาและตอนนี้ในไฟล์นั้น
yuriismaster

@ aking1012: ใช่แล้ว ณ จุดนั้นโหมดไฟล์จะเปลี่ยนไป ฉันจะอัปเดตคำถาม
Boldewyn

@yuriismaster: git-logแสดงให้เห็นว่าการส่งออกที่ทุกคนสำหรับการรวมกันของค่าmaster, dev-branchหรือHEAD(? ซึ่งเป็นที่แปลกประหลาดไม่ได้ก็ไม่ควรสั่งพิมพ์สุดท้ายกระทำข้อความจากmaster?)
Boldewyn

2
คุณใช้ระบบแฟ้มอะไรอยู่
bitmask

คำตอบ:


12

ไม่ใช่ผู้ใช้ Git แต่ฉันเชื่อว่า Git เก็บรูปแบบการอนุญาตไฟล์ทั้งหมด

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

ในการทำให้ Git ไม่สนใจการเปลี่ยนแปลงดังกล่าวให้ใช้

git config core.filemode false

จากgit-config (1) :

   core.fileMode
       If false, the executable bit differences between the index and the
       working copy are ignored; useful on broken filesystems like FAT.
       See git-update-index(1). True by default.

1
ที่จริงแล้วฉันพยายามอย่างหนักที่จะส่งไฟล์ที่มีสิทธิ์ที่ถูกต้อง ฉันยังมุ่งมั่นไฟล์ทั้งหมดอีกครั้งหลังจาก chmod'ing พวกเขา เนื่องจากฉันทำงานบน Windows เป็นครั้งคราว (ไม่ใช่กับ repo นี้) ฉันรู้core.fileModeแต่ฉันหวังว่าจะสามารถทิ้งไว้trueได้
Boldewyn

มันอาจจะเป็นข้อผิดพลาดในคอมไพล์เมื่อทำงานกับสิ่งที่พวกเขาเรียกว่า "ระบบแฟ้มที่ใช้งานไม่ได้" ไม่มีระบบไฟล์ที่ใช้งานไม่ได้ซอฟต์แวร์ที่เสียเท่านั้น
harrymc

4
ฉันต้องเห็นด้วยกับนักพัฒนาคอมไพล์ที่ไขมันแตก
RobotHumans

3
ตกลงมันเป็นระบบไฟล์ ฉันไม่สามารถทำซ้ำบนเครื่องอื่นซึ่งมีการติดตั้งไดเรกทอรีผ่าน NFS บนเครื่องหลักมันเป็นอย่างที่ฉันพูด CIFS เมื่อฉันถามในรายชื่อส่งเมล git ฉันได้รับคำตอบว่า CIFS นั้นผิดปกติเกี่ยวกับบิตการดำเนินการ ยี้!
Boldewyn


3

คุณตรวจสอบหรือไม่ว่ามี hook แบบกำหนดเองที่ดำเนินการระหว่างการยืนยันหรือชำระเงิน อาจมีตะขอที่กำหนดเองที่ดัดแปลงด้วยไฟล์ของคุณ เช็คเอาท์githooks manpage

Hooks นั้นเป็นโปรแกรมเล็ก ๆ ที่ถูกเรียกโดย git ในบางเหตุการณ์ (การกระทำการชำระเงิน ฯลฯ )


ลองดี แต่.git/hooksไดเรกทอรีของฉันไม่ถูกแตะต้อง
Boldewyn

1

คุณได้ลองคอมไพล์โหมด m คือไฟล์ 644 ใน branch dev-branch

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


1
ที่จริงฉันไม่เคยสัมผัสสิทธิ์ในสถานการณ์เดิม การเปลี่ยนแปลงการอนุญาตทั้งหมดทำได้โดย git ในขั้นตอน 'checkout'
Boldewyn

... นั่นคือฉันทำบางchmodครั้งในไฟล์ แต่ฉันจำไม่ได้ว่าถ้าปัญหาเริ่มเกิดขึ้นในภายหลัง ฉันคิดว่ามันไม่ได้
Boldewyn

ฉันพยายามทำซ้ำปัญหาของคุณและฉันทำไม่ได้
RobotHumans

นั่นเป็นเพราะคุณไม่ได้ทำงานกับ CIFS ;-) ที่เมาท์ ฉันลืม +1 เพื่อลองขอบคุณ!
Boldewyn

1

มีคำตอบที่ดีที่ลิงค์เหล่านี้

/programming/9027584/how-to-change-the-file-mode-on-github

และ

/programming/1611211/how-do-i-make-git-accept-mode-changes-without-accepting-all-text-changes

เป็นหลักคุณจำเป็นต้องgit update-index --chmod=(+|-)x <file>และสิ่งนี้จะเพิ่มการเปลี่ยนแปลงที่คุณต้องยอมรับและผลักดันให้มีการเพิ่ม / ลบสิทธิ์

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