ฉันจะลบไฟล์ที่ระบุว่า "โหมดเก่า 100755 โหมดใหม่ 100644" จากการเปลี่ยนแปลงแบบไม่คงที่ใน Git ได้อย่างไร


723

ด้วยเหตุผลบางอย่างเมื่อตอนแรกที่ฉันดึงจากที่เก็บสำหรับโครงการคอมไพล์ของฉันฉันได้รับไฟล์จำนวนมากในสำเนาการทำงานของฉันที่ไม่มีการเปลี่ยนแปลงที่สังเกตเห็นได้ แต่ยังปรากฏในunstaged changesพื้นที่ ของฉัน

ฉันใช้ Git Gui บน Windows xp และเมื่อฉันไปดูไฟล์เพื่อดูว่ามีอะไรเปลี่ยนแปลง ทั้งหมดที่ฉันเห็นคือ:

old mode 100755  
new mode 100644  

ไม่มีใครรู้ว่าสิ่งนี้หมายความว่าอย่างไร

ฉันจะลบไฟล์เหล่านี้ออกจากรายการการเปลี่ยนแปลงแบบไม่จัดเตรียมได้อย่างไร? (น่ารำคาญมากที่ต้องผ่านไฟล์หลายร้อยไฟล์เพียงเพื่อเลือกไฟล์ที่ฉันเพิ่งแก้ไขและต้องการส่ง)

คำตอบ:


1284

นั่นดูเหมือนว่าโหมดอนุญาตให้ใช้ไฟล์ unix สำหรับฉัน ( 755= rwxr-xr-x, 644= rw-r--r--) - โหมดเก่ารวมถึงแฟล็ก + x (ปฏิบัติการ) โหมดใหม่ไม่ได้

คำตอบของปัญหา msysgit นี้แนะนำให้ตั้งค่า core.filemode เป็นเท็จเพื่อกำจัดปัญหา:

git config core.filemode false

132
+1 ซึ่งหมายความว่า git คิดว่าสามารถตั้งค่าบิตที่เรียกใช้งานได้อย่างถูกต้องในไฟล์ที่เช็กเอาต์ แต่เมื่อมันพยายามที่จะทำมันจะไม่ทำงาน (หรืออย่างน้อยก็ไม่สามารถอ่านได้) เมื่อมันอ่านสถานะของไฟล์เหล่านั้นกลับมาดูเหมือนว่าบิตที่เรียกใช้งานได้ถูกยกเลิกการตั้งค่าโดยเจตนา การตั้งค่า core.filemode เป็น false จะบอกให้ git เพิกเฉยต่อการเปลี่ยนแปลงบิตที่เรียกใช้งานได้ของระบบไฟล์ดังนั้นมันจะไม่ถือว่าเป็นการเปลี่ยนแปลง หากคุณจำเป็นต้องเปลี่ยนบิตเรียกใช้งานเป็นระยะหมายความว่าคุณต้องทำgit update-index --chmod=(+|-)x <path>เอง
CB Bailey

7
หากเช่นฉันการเปลี่ยนแปลงโหมดมีความสำคัญคุณสามารถตั้งค่า core.filemode เป็นเท็จยอมรับการเปลี่ยนแปลงรหัสจริงของคุณจากนั้นตั้งค่า core.filemode เป็นจริงและ git จะรักษาการเปลี่ยนแปลงของไฟล์ไว้
Michael T. Smith

8
ฉันมีปัญหาเดียวกัน แต่เกิดจากการใช้ git repro ที่เหมือนกันผ่านทางบรรทัด cmd git SSH และผ่าน Git Extensions บนไดรฟ์ที่แมปใน Windows! . . โซลูชันเหมือนกันถูกเพิ่มเข้าไปใน "config" [core] filemode = false
Ian Vaughan

2
นั่นคือการช่วยชีวิตขอขอบคุณคุณ! สิ่งนี้เกิดขึ้นกับฉันใน OSX หลังจากที่ฉันแชร์ที่เก็บโคลนในโฟลเดอร์สาธารณะและเปลี่ยนการอนุญาตสำหรับไฟล์
Thiago Ganzarolli

8
@robsch คุณสามารถใช้git config --global ...เพื่อตั้งค่าตัวเลือกในไฟล์กำหนดค่าส่วนกลางของคุณ
เหลืองอำพัน

98

การตั้งค่าcore.filemodeเป็นเท็จใช้งานได้ แต่ตรวจสอบให้แน่ใจว่าการตั้งค่า~/.gitconfigไม่ถูกแทนที่โดยสิ่ง.git/configต่อไปนี้


3
เคยทำมาแล้ว น่าเศร้าที่ฉันพบความคิดเห็นของคุณหลังจากแก้ไขปัญหาด้วยตัวเองแล้วเท่านั้น ยัง +1!
David Schmitt

1
หากผู้ใช้รายอื่นกำลังโคลนโครงการนี้อยู่บน Windows อาจเป็นการดีที่สุดที่จะใช้การเปลี่ยนแปลงกับ~/.gitconfigไฟล์จริง!
Ian Vaughan

หากคุณต้องการตรวจสอบ Windows Powershell หรือบนลินุกซ์git config --list --show-origin | sls filemode git config --list --show-origin | grep filemodeสิ่งนี้จะแสดงให้คุณเห็นว่าคุณต้องทำการปรับเปลี่ยนที่ใด
Frank Fu

คุณจับมัน !! ทำได้ดี.
Kim

27

ฉันพบปัญหานี้เมื่อคัดลอก git repo กับไฟล์ทำงานจากฮาร์ดไดรฟ์เก่าสองสามครั้ง ปัญหาเกิดขึ้นจากข้อเท็จจริงที่ว่าเจ้าของและการอนุญาตเปลี่ยนจากไดรฟ์ / เครื่องเก่าเป็นใหม่ ความยาวและความสั้นของมันคือรันคำสั่งต่อไปนี้เพื่อยืดสิ่งต่างๆออก ( ขอบคุณคำตอบของ superuser นี้ ):

sudo chmod -R -x . # remove the executable bit from all files

อดีตคำสั่งจริงจะแก้ปัญหาความแตกต่างที่คอมไพล์ diff รายงาน แต่จะเพิกถอนความสามารถของคุณที่จะแสดงรายการไดเรกทอรีจึงล้มเหลวด้วยls ./ ls: .: Permission deniedในการแก้ไขปัญหา:

sudo chmod -R +X . # add the executable bit only for directories

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

chmod +x ./build.sh # where build.sh is the file you want to make executable again

2
ขอบคุณช่วยฉันมาก! หนึ่งควรตรวจสอบว่าgit config core.filemodeมีการตั้งค่าtrueมิฉะนั้นการเปลี่ยนแปลงการอนุญาตจะไม่ถูกตรวจพบ ฉันต้องรีเฟรชดัชนี git หลังจากการเปลี่ยนแปลงทุกครั้งเพื่อรับมัน
pat-s

วิธีนี้เป็นวิธีที่ปลอดภัยที่สุดหากคุณกังวลเกี่ยวกับการพึ่งพาที่ได้รับผลกระทบ
Jin

9

มักเกิดขึ้นเมื่อ repo ถูกโคลนระหว่างเครื่อง Windows และ Linux / Unix

เพียงบอกคอมไพล์ให้ละเว้นการเปลี่ยนแปลงโหมดไฟล์นี่คือหลายวิธี:

  1. กำหนดค่าสำหรับ repo ปัจจุบันเท่านั้น:

    git config core.filemode false
    
  2. กำหนดค่าทั่วโลก:

    git config --global core.filemode false
    
  3. เพิ่มใน ~ / .gitconfig:

    [core]
         filemode = false
    

เพียงเลือกหนึ่งในนั้น


การกำหนดค่าระดับโลกไม่ทำงานเพราะ (ฉันเดา) คอมไพล์สร้าง repo ด้วยตัวเลือกนี้ตั้งค่าเป็นจริง (ฉันได้สร้าง repo ใน linux)
Herrgott

4

ดูเหมือนว่าคุณมีการเปลี่ยนแปลงสิทธิ์ของไดเรกทอรี ฉันทำตามขั้นตอนต่อไปนี้เพื่อกู้คืน

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .

3

คุณสามารถลอง git reset - hard HEAD เพื่อรีเซ็ต repo เป็นสถานะเริ่มต้นที่คาดไว้


8
หาก git ไม่สามารถตั้งค่าบิตที่สามารถใช้งานได้อย่างถูกต้อง / สม่ำเสมอหลังจากการดึงข้อมูลจะไม่ดีขึ้นหลังจากการรีเซ็ต
CB Bailey

2
ฉันย้ายบางโครงการไปยังไดรฟ์ usb (fat32) และกลับไปที่เครื่องอูบุนตู (ext4) ของฉันอีกครั้งและจบลงด้วยไฟล์ที่มีการเปลี่ยนแปลงมากมายคุณสมบัติ git reset --hard HEADทำงานอย่างสมบูรณ์แบบสำหรับฉัน ขอบคุณ
cirovladimir

7
-1 OP ระบุ "เพื่อเลือกไฟล์ที่ฉันเพิ่งแก้ไขและต้องการยอมรับ" นี่จะเป็นการลบการแก้ไขเหล่านั้นด้วย
whitfin

9
-1 การแนะนำคำสั่งนี้ในคอมไพล์ก็เหมือนกับการพูดว่า "คุณสามารถ rm -rf ./ ได้ฉันแน่ใจว่ามันจะไม่เกิดผลที่ไม่ตั้งใจ"
Kzqai

1
ไม่ไม่ได้ช่วยอะไรได้และนี่เป็นปัญหา คุณรีเซ็ตและล้างและสถานะ git ยังคงแสดงการเปลี่ยนแปลงโหมด นี่เป็นปัญหาที่ร้ายแรงกับ windows git และฉันคิดว่ามันควรได้รับการแก้ไขไม่ใช่แค่หลีกเลี่ยงโดยละเว้นโหมดไฟล์
vezenkov


1

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

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

คุณอาจต้องทำ:

chmod -x <file> // Removes execute bit

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


1

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อเปลี่ยนโหมดไฟล์ของคุณกลับ git add --chmod=+x -- filename จากนั้นส่งไปที่สาขา


0

ฉันมีเพียงไฟล์เดียวที่มีปัญหากับการอนุญาตที่เปลี่ยนแปลง เมื่อต้องการย้อนกลับทีละรายการฉันเพิ่งลบมันด้วยตนเองrm <file>และจากนั้นทำการเช็คเอาต์เพื่อดึงสำเนาใหม่

โชคดีที่ฉันยังไม่ได้จัดฉาก

ถ้าฉันมีฉันจะได้ทำงานgit reset -- <file>ก่อนที่จะทำงานgit checkout -- <file>


0

ฉันเพิ่งพบปัญหานี้เมื่อแยกสาขากับเจ้านาย Git กลับข้อผิดพลาด 'โหมด' หนึ่งเมื่อฉันคาดว่าสาขาของฉันจะเหมือนกับอาจารย์ ฉันแก้ไขโดยการลบไฟล์แล้วผสานหลักอีกครั้ง

ครั้งแรกที่ฉันวิ่งแตกต่าง:

git checkout my-branch
git diff master

สิ่งนี้คืน:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

จากนั้นฉันก็รันสิ่งต่อไปนี้เพื่อแก้ไข:

rm bin/script.sh
git merge -X theirs master

หลังจากนี้git diffไม่มีความแตกต่างระหว่าง my-branch และมาสเตอร์

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