ชื่อไฟล์ยาวเกินไปใน Git สำหรับ Windows


664

ฉันใช้Git-1.9.0-preview20140217Windows อย่างที่ฉันรู้แล้วการเปิดตัวนี้ควรแก้ไขปัญหาด้วยชื่อไฟล์ที่ยาวเกินไป แต่ไม่ใช่สำหรับฉัน

แน่นอนฉันทำอะไรผิดพลาด: ฉันไม่ได้git config core.longpaths trueและแล้วgit add . git commitทุกอย่างเป็นไปด้วยดี. แต่เมื่อฉันทำตอนนี้git statusฉันจะได้รับรายชื่อไฟล์ด้วยFilename too longเช่น:

node_modules/grunt-contrib-imagemin/node_modules/pngquant-bin/node_modules/bin-wrapper/node_modules/download/node_modules/request/node_modules/form-data/node_modules/combined-stream/node_modules/delayed-stream/test/integration/test-handle-source-errors.js: Filename too long

มันค่อนข้างง่ายที่จะทำซ้ำสำหรับฉัน: เพียงแค่สร้างเว็บแอปพลิเคชันYeomanด้วยเครื่องกำเนิด Angular ("yo angular") และลบออกnode_modulesจาก.gitignoreไฟล์ จากนั้นทำซ้ำคำสั่ง Git ดังกล่าว

ฉันหายไปนี่อะไร


คุณอ่านว่ารุ่นนั้นควรแก้ไขชื่อไฟล์ที่ยาวได้อย่างไร
iveqy

นี่คือคำขอดึงสำหรับแพทช์: github.com/msysgit/git/pull/122
Papa Mufflon

@PapaMufflon คุณสามารถเปลี่ยนคำตอบที่ยอมรับเป็นคะแนนที่มากกว่าได้หรือไม่? มันช่วยฉันได้มาก
v.karbovnichy

@ v.karbovnichy โปรดอ่านคำถามของฉันอย่างระมัดระวัง ฉันรันคำสั่งในคำตอบที่โหวตแล้วที่สุดแล้ว แต่ในเวลาที่ฉันถามคำถามคำตอบที่ยอมรับนั้นถูกต้อง: msys ยังมีข้อ จำกัด ของตัวละครนี้อยู่ ตอนนี้ข้อ จำกัด ได้หายไปแล้วและคอมไพล์ core.longpaths งานจริงอย่างที่ควรจะเป็น
Papa Mufflon

ตกลงฉันเห็นด้วย
v.karbovnichy

คำตอบ:


704

Git มีความยาวได้ไม่เกิน 4096 ตัวอักษรสำหรับชื่อไฟล์ยกเว้นบน Windows เมื่อ Git ถูกคอมไพล์ด้วย msys ใช้เวอร์ชันเก่ากว่าของ Windows API และมีความยาวสูงสุด 260 อักขระสำหรับชื่อไฟล์

ดังนั้นเท่าที่ฉันเข้าใจสิ่งนี้มันเป็นข้อ จำกัด ของ msys และไม่ใช่ของ Git คุณสามารถอ่านรายละเอียดได้ที่นี่: https://github.com/msysgit/git/pull/110

คุณสามารถหลีกเลี่ยงโดยใช้ลูกค้า Git อื่นบน Windows หรือชุดcore.longpathsที่จะtrueได้อธิบายไว้ในคำตอบอื่น ๆ

git config --system core.longpaths true

Git คือการสร้างเป็นชุดของสคริปต์และรหัสที่รวบรวม ด้วยการเปลี่ยนแปลงข้างต้นสคริปต์บางอย่างอาจล้มเหลว นั่นเป็นเหตุผลสำหรับ core.longpath ที่จะไม่เปิดใช้งานโดยค่าเริ่มต้น

เอกสาร windows ที่https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-fileมีข้อมูลเพิ่มเติม:

การเริ่มต้นใน Windows 10 ข้อ จำกัด รุ่น 1607, MAX_PATH ได้ถูกลบออกจากไฟล์ Win32 ทั่วไปและฟังก์ชั่นไดเรกทอรี อย่างไรก็ตามคุณต้องเลือกใช้พฤติกรรมใหม่

รีจิสตรีคีย์ช่วยให้คุณสามารถเปิดใช้งานหรือปิดใช้งานพฤติกรรมพา ธ แบบยาว เมื่อต้องการเปิดใช้งานลักษณะการทำงานของเส้นทางแบบยาวตั้งค่ารีจิสทรีคีย์ที่ HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled (ประเภท: REG_DWORD)


19
ข้อ จำกัด ของ 260 ตัวอักษรในพา ธ นั้นไม่ได้เฉพาะเจาะจงกับ MSYS แต่เป็นการเลียนแบบ Windows API ทั่วไป สิ่งนี้สามารถแก้ไขได้โดยใช้เส้นทาง Unicode แต่มีข้อเสียอื่น ๆ ซึ่งเป็นสาเหตุที่core.longpathsไม่ได้เปิดใช้งานตามค่าเริ่มต้น โปรดทราบด้วยว่า Git สำหรับ Windows ไม่ได้รวบรวมกับ MSYS แต่เป็นแอปพลิเคชัน Windows ดั้งเดิมที่มาพร้อมกับสภาพแวดล้อม MSYS ที่ถูกตัดทอน
sschuberth

3
@sschuberth: มีข้อเสียอื่น ๆ นอกเหนือจากการขาดความเข้ากันได้กับโปรแกรมที่ไม่รองรับเส้นทางยาว?
JAB

3
@JAB ข้อเสียเปรียบอีกประการหนึ่งก็คือเส้นทางยาวนั้นจะต้องสมบูรณ์เสมอ ไม่รองรับเส้นทางที่เกี่ยวข้อง สำหรับรายละเอียดเพิ่มเติมโปรดดูที่นี่
sschuberth

4
หรือแก้ไขอย่างรวดเร็วเพียงลองชำระเงิน repo ของคุณเป็น C: / บนหน้าต่างซึ่งจะเป็นการลดจำนวนตัวอักษรพา ธ ของโฟลเดอร์
Akshay Lokur

5
FYI ตามเวลาในขณะนี้ปัญหายังคงมีอยู่ เราอาจต้องการที่จะต้องพิจารณาการพัฒนาอย่างต่อเนื่องบนระบบปฏิบัติการจริง ...
GézaTörök

1034

คุณควรจะสามารถเรียกใช้คำสั่ง

git config --system core.longpaths true

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


13
ตัวเลือกการกำหนดค่านี้แก้ไขปัญหาสำหรับฉันแม้จะมี msys ตามที่ระบุไว้ในคำตอบที่ยอมรับ (เฉพาะรุ่น 1.9.4.msysgit.2)
Alex Osborn

5
Sourcetree ทำหน้าที่แปลก ๆ เล็กน้อยเว้นแต่คุณจะต้องแน่ใจว่า SourceTree ใช้ Git ของระบบและไม่ใช่แบบฝังตัว - ขอบคุณMatej Drolcสำหรับคำแนะนำนั้น
bstoney

38
นี่คือข้อมูลพื้นหลังบางส่วนที่ว่าทำไมจึงไม่เปิดใช้งานโดยค่าเริ่มต้นและรายละเอียดทางเทคนิคบางอย่าง
sschuberth

12
รับ "ไม่สามารถล็อคไฟล์กำหนดค่า C: \ Program Files \ Git \ mingw64 / etc / gitconfig" หลังจากเรียกใช้คำสั่งด้านบน แต่ @Yash คำตอบใช้ได้ผลสำหรับฉัน
divideByZero

10
@divideByZero กำลังรัน git bash ในฐานะผู้ดูแลระบบป้องกันข้อผิดพลาดนั้น
Niek

204

สิ่งนี้อาจช่วย:

git config core.longpaths true

คำอธิบายพื้นฐาน: คำตอบนี้ไม่แนะนำให้ใช้การตั้งค่าดังกล่าวกับระบบทั่วโลก (สำหรับโครงการทั้งหมดดังนั้นการหลีกเลี่ยง--systemหรือการ--globalแท็ก) คำสั่งนี้จะแก้ปัญหาโดยเฉพาะโครงการปัจจุบัน


13
คนที่นี่ได้ตั้งข้อสังเกตว่าการตั้งค่านี้สามารถนำเสนอพฤติกรรมที่คาดเดาไม่ได้บางอย่างดังนั้นดูเหมือนว่ามันจะดีกว่าที่จะใช้คำสั่งข้างต้นเป็นการตั้งค่าท้องถิ่นในโครงการที่ต้องการมากกว่าการผนวก--systemซึ่งจะนำไปใช้กับโครงการทั้งหมด
Grant Humphries

4
เฮ้นั่นเป็นเพียง copypasta ของคำตอบ upvoted อื่น ๆ อย่างน้อยที่สุดอาจอธิบายได้ว่าทำไมคุณถึงชอบลบตัวเลือก --system ..
Félix Gagnon-Grenier

78

สร้าง. gitconfig และเพิ่ม

[core]
longpaths = true

คุณสามารถสร้างไฟล์ในตำแหน่งโครงการ (ไม่แน่ใจ) และในตำแหน่งส่วนกลาง C:\Users\{name}\ในกรณีของสถานที่คือ


10
นอกจากนี้คุณยังสามารถทำสิ่งนี้ได้ด้วยคำสั่งต่อไปนี้:git config --global core.longpaths true
Curly

git config --logo core.longpath จริง ๆ แล้วฉันขอบคุณ
พระราม Krshna Ila

1
การใช้ Visual Studio โซลูชัน gash bash ด้านบนไม่ได้ผลสำหรับฉัน แต่การค้นหาไฟล์. git / config สำหรับโครงการและการแก้ไขตามที่แสดงด้านบน ขอบคุณ yash
andrew pate

นี้ทำงานสำหรับฉันฉันอยู่แฟ้มที่และแก้ไขได้ด้วยตนเอง
Patlatus

1
คำตอบดังกล่าวข้างต้นและตรวจสอบแล้วถูกต้อง แต่ด้วยสิทธิ์ที่มอบให้กับไฟล์อาจไม่สามารถอัปเดตไฟล์ด้วยคำสั่งเหล่านั้น วิธีนี้ง่ายมากเพราะเป็นแนวทางแบบแมนนวลและใช้งานได้ดีสำหรับฉันจริงๆ คุณสามารถค้นหา.gitconfigไฟล์ในพา ธ ต่อไปนี้C:\Users\{username}และแก้ไขได้อย่างง่ายดาย
Kavindu Narathota

53

ขั้นตอนในการปฏิบัติตาม:

  1. เรียกใช้Git Bashในฐานะผู้ดูแลระบบ
  2. รันคำสั่งต่อไปนี้:
git config --system core.longpaths true

หมายเหตุ : หากขั้นตอนที่ 2 ไม่ทำงานหรือให้ข้อผิดพลาดใด ๆ คุณสามารถลองใช้คำสั่งนี้:

git config --global core.longpaths true

อ่านเพิ่มเติมเกี่ยวกับที่นี่git config


35

ทางออกที่ดีกว่าคือเปิดใช้งานพารามิเตอร์ longpath จาก Git

git config --system core.longpaths true

แต่วิธีแก้ปัญหาที่ใช้งานได้คือลบโฟลเดอร์ node_modules ออกจาก Git:

$ git rm -r --cached node_modules
$ vi .gitignore

เพิ่ม node_modules ในแถวใหม่ภายในไฟล์. gitignore หลังจากทำสิ่งนี้แล้วให้กดการปรับเปลี่ยนของคุณ:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push

3
มีเหตุผลที่ดีที่จะทำให้โฟลเดอร์ node_modules ถูกตรวจสอบในคอมไพล์: หากคุณต้องการให้ซอฟต์แวร์ของคุณทำงานเหมือนเดิมหลังจากหนึ่งปีของโมดูลที่อาจหายไปจาก npm
cfstras

@cfstras หากห้องสมุดบางแห่งมีช่องโหว่และคุณไม่ได้อัปเดตเป็นระยะ ๆ แน่นอนว่าคุณจะมีปัญหาด้านความปลอดภัย
Janderson Silva

1
แน่นอนคุณต้องอัพเกรดการพึ่งพาของคุณ แต่เฉพาะเมื่อคุณต้องการและถ้ามีอะไรบางอย่างที่จะทำลายคุณจะต้องสำรองข้อมูลของคุณในระบบ ...
cfstras

เป็นความจริง. ฉันจะแก้ไข anwser ของฉัน ขอบคุณสำหรับความคิดเห็น
Janderson Silva

1
ไม่จำเป็นต้องผูกมัดnode_modules: packages.lockไฟล์อยู่ที่นี่เพื่อให้แน่ใจว่าเวอร์ชั่นที่ติดตั้งโดยnpm installจะเหมือนเดิมจนกว่าคุณจะสร้างnpm update
Pierre-Olivier Vares

32

เพื่อให้แน่ใจโดยสมบูรณ์ว่าจะมีผลทันทีหลังจากที่ที่เก็บเริ่มต้น แต่ก่อนที่จะดึงข้อมูลประวัติระยะไกลหรือไฟล์ใด ๆ ที่ตรวจสอบแล้วจะปลอดภัยกว่าที่จะใช้วิธีนี้:

git clone -c core.longpaths=true <repo-url>

-c key = value

ตั้งค่าตัวแปรการกำหนดค่าในพื้นที่เก็บข้อมูลที่สร้างขึ้นใหม่ สิ่งนี้จะมีผลทันทีหลังจากที่ที่เก็บเริ่มต้น แต่ก่อนที่จะดึงข้อมูลประวัติระยะไกลหรือไฟล์ใด ๆ คีย์อยู่ในรูปแบบเดียวกับที่คาดไว้โดย git-config 1 (เช่น core.eol = true) หากมีการกำหนดหลายค่าสำหรับคีย์เดียวกันแต่ละค่าจะถูกเขียนไปยังไฟล์ปรับแต่ง สิ่งนี้ทำให้ปลอดภัยตัวอย่างเช่นเมื่อต้องการเพิ่มการเรียก refspecs เพิ่มเติมไปยังรีโมทต้นทาง

ข้อมูลเพิ่มเติม


24

การดำเนินการgit config --system core.longpaths trueโยนข้อผิดพลาดให้ฉัน:

"ข้อผิดพลาด: ไม่สามารถล็อคไฟล์กำหนดค่า C: \ Program Files (x86) \ Git \ mingw32 / etc / gitconfig: ปฏิเสธการอนุญาต"

แก้ไขด้วยการดำเนินการคำสั่งในระดับโลก:

git config --global core.longpaths true

การตั้งค่าทั่วโลกส่งผลกระทบต่อผู้ใช้ปัจจุบันเท่านั้นในขณะที่การตั้งค่าระบบส่งผลกระทบต่อผู้ใช้ทั้งหมดในเครื่อง หากนี่คือเวิร์กสเตชันของคุณพวกเขาจะได้อย่างมีประสิทธิภาพเช่นเดียวกับคุณอาจใช้ผู้ใช้เพียงคนเดียว
ผ้าเช็ดตัว

4
หากคุณใช้แอปพลิเคชันบรรทัดคำสั่ง Ran เป็นผู้ดูแลระบบคำสั่งแรกก็ใช้ได้
Sachith Dickwella

12

คุณสามารถลองเปิดใช้งานไฟล์พา ธ ที่ยาว

หากคุณใช้งาน Windows 10 Home Edition คุณสามารถเปลี่ยน Registry เพื่อเปิดใช้งานพา ธ แบบยาว

ไปHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemในregeditนั้นตั้งค่าไปLongPathsEnabled1

หากคุณมี Windows 10 Pro หรือ Enterprise คุณสามารถใช้นโยบายกลุ่มท้องถิ่นได้

ไปที่การกำหนดค่าคอมพิวเตอร์แม่แบบการดูแลระบบระบบแฟ้มในgpedit.mscเปิดเปิดใช้ Win32 เส้นทางยาวและตั้งค่าให้เปิดใช้งาน


5
ผมเชื่อว่านี่จะต้องทำร่วมกับการกำหนดค่าคอมไพล์และเป็นที่น่าสังเกตก็ไม่ได้ทำงานร่วมกับ Windows Explorer ด้วยเหตุผลที่กล่าวถึงที่นี่
Neo

11
git config --global core.longpaths true

คำสั่งดังกล่าวทำงานให้ฉัน การใช้ '--system' ให้ไฟล์ config ฉันไม่ได้ล็อคข้อผิดพลาด


2
สำหรับผู้ใช้ Github Desktop นี่เป็นสิ่งเดียวที่ทำงานได้เนื่องจาก Github Desktop ใช้ Git config ของตัวเอง
Csaba

4

ย้ายที่เก็บไปที่รูทของไดรฟ์ของคุณ (การแก้ไขชั่วคราว)

คุณสามารถลองย้ายที่เก็บโลคัล (ทั้งโฟลเดอร์) ไปยังรูทของไดรฟ์ของคุณหรือใกล้กับรูทมากที่สุด

เนื่องจากเส้นทางมีขนาดเล็กกว่าที่รูทของไดรฟ์บางครั้งจึงสามารถแก้ไขปัญหาได้

ใน Windows ฉันจะย้ายสิ่งนี้ไปC:\ยังรากของไดรฟ์อื่น


2
นี่เป็นสิ่งเดียวที่แก้ไขปัญหาของฉัน เป็นเพราะฉันมีโฟลเดอร์มากเกินไปในเส้นทาง
J Brune

2

ฉันมีข้อผิดพลาดนี้เช่นกัน แต่ในกรณีของฉันสาเหตุคือการใช้เวอร์ชันเก่าของ npm, v1.4.28

กำลังอัปเดตเป็น npm v3 ตามด้วย

rm -rf node_modules
npm -i

ทำงานให้ฉัน ปัญหา npm 2697 มีรายละเอียดเกี่ยวกับโครงสร้างโฟลเดอร์ "maximally flat" ที่รวมอยู่ใน npm v3 (เปิดตัว 2015-06-25)


1

หากคุณทำงานกับพาร์ติชันที่เข้ารหัสของคุณให้พิจารณาย้ายโฟลเดอร์ไปยังพาร์ติชันที่ไม่ได้เข้ารหัสเช่น a / tmpทำงานgit pullและจากนั้นย้ายกลับ


0

ในเครื่องที่ใช้ windows

เรียกใช้พรอมต์คำสั่งในฐานะผู้ดูแลระบบจากนั้นเรียกใช้คำสั่งด้านล่าง

git config - ระบบ core.longpaths จริง

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