Tên tệp quá dài trong Git cho Windows


663

Tôi đang sử dụng Git-1.9.0-preview20140217cho Windows. Theo tôi biết, bản phát hành này sẽ khắc phục vấn đề với tên tệp quá dài. Nhưng không phải cho tôi.

Chắc chắn tôi đang làm một cái gì đó sai: Tôi đã làm git config core.longpaths truegit add .rồi git commit. Tất cả mọi thứ diễn ra tốt đẹp. Nhưng khi tôi thực hiện một git status, tôi nhận được một danh sách các tệp với Filename too long, ví dụ:

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

Nó khá đơn giản để tạo lại cho tôi: chỉ cần tạo một ứng dụng web Yeoman với trình tạo Angular ("yo angular") và xóa node_moduleskhỏi .gitignoretệp. Sau đó lặp lại các lệnh Git đã nói ở trên.

Tôi đang thiếu gì ở đây?


Bạn đọc phiên bản đó ở đâu để sửa tên tập tin dài?
iveqy

Dưới đây là yêu cầu kéo cho bản vá: github.com/msysgit/git/pull/122
Papa Mufflon

@PapaMufflon bạn có thể thay đổi câu trả lời được chấp nhận thành câu trả lời có nhiều điểm hơn không? Nó chỉ giúp tôi rất nhiều.
v.karbovnichy

@ v.karbovnichy vui lòng đọc kỹ câu hỏi của tôi. Tôi đã chạy lệnh trong câu trả lời bỏ phiếu hàng đầu. Nhưng tại thời điểm tôi đặt câu hỏi, câu trả lời được chấp nhận là chính xác: msys vẫn có giới hạn ký tự này. Bây giờ giới hạn đó đã biến mất và git config core.longpaths hoạt động đúng như nó nên.
Papa Mufflon

Ok, tôi đồng ý rồi
v.karbovnichy

Câu trả lời:


700

Git có giới hạn 4096 ký tự cho tên tệp, ngoại trừ trên Windows khi Git được biên dịch bằng msys. Nó sử dụng phiên bản cũ hơn của API Windows và có giới hạn 260 ký tự cho tên tệp.

Theo như tôi hiểu thì đây là một hạn chế của msys chứ không phải của Git. Bạn có thể đọc chi tiết tại đây: https://github.com/msysgit/git/pull/110

Bạn có thể phá vỡ điều này bằng cách sử dụng ứng dụng khách Git khác trên Windows hoặc được đặt core.longpathsthành truenhư được giải thích trong các câu trả lời khác.

git config --system core.longpaths true

Git được xây dựng dưới dạng kết hợp các tập lệnh và mã được biên dịch. Với sự thay đổi ở trên, một số kịch bản có thể thất bại. Đó là lý do để core.longpath không được bật theo mặc định.

Tài liệu về windows tại https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file có thêm một số thông tin:

Bắt đầu trong Windows 10, phiên bản 1607, các giới hạn MAX_PATH đã bị xóa khỏi các chức năng thư mục và tệp Win32 phổ biến. Tuy nhiên, bạn phải chọn tham gia vào hành vi mới.

Khóa đăng ký cho phép bạn kích hoạt hoặc vô hiệu hóa hành vi đường dẫn mới. Để kích hoạt hành vi đường dẫn dài, hãy đặt khóa đăng ký tại HKLM \ HỆ THỐNG \ CurrentControlset \ Control \ FileSystem LongPathsEnables (Loại: REG_DWORD)


19
Giới hạn đối với 260 ký tự trong một đường dẫn không dành riêng cho MSYS, đó là giả lập API Windows nói chung. Điều này có thể được giải quyết bằng cách sử dụng các đường dẫn Unicode, nhưng nó có những nhược điểm khác, đó là lý do tại sao core.longpathskhông được bật theo mặc định. Cũng lưu ý rằng Git cho Windows, nó không được biên dịch dựa trên MSYS. Thay vào đó, đây là một ứng dụng Windows gốc đi kèm với môi trường MSYS bị loại bỏ.
sschuberth 14/2/2015

3
@sschuberth: Có bất kỳ nhược điểm nào ngoài việc không tương thích với các chương trình không hỗ trợ các đường dẫn dài không?
JAB

3
@JAB Một nhược điểm khác là những con đường dài luôn phải tuyệt đối; đường dẫn tương đối không được hỗ trợ. Để biết thêm chi tiết xin vui lòng xem tại đây .
sschuberth

4
Hoặc như một cách khắc phục nhanh, chỉ cần thử kiểm tra repo của bạn thành C: / trên windows để giảm số lượng ký tự đường dẫn thư mục.
Akshay Lokur

5
FYI, đến thời điểm hiện tại vấn đề vẫn còn tồn tại. Chúng tôi có thể muốn xem xét tiếp tục phát triển trên một hệ điều hành thực sự ...
Géza Török

1033

Bạn sẽ có thể chạy lệnh

git config --system core.longpaths true

hoặc thêm nó vào một trong các tệp cấu hình Git của bạn theo cách thủ công để bật chức năng này, khi bạn đang sử dụng phiên bản Git được hỗ trợ. Có vẻ như có thể 1.9.0 và sau đó.


13
Tùy chọn cấu hình này đã khắc phục sự cố cho tôi, ngay cả với msys như được đề cập trong câu trả lời được chấp nhận. (Cụ thể, phiên bản 1.9.4.msysgit.2).
Alex Osborn

5
Sourcetree hoạt động hơi kỳ lạ trừ khi bạn "cũng đảm bảo rằng SourceTree đang sử dụng Git của Hệ thống chứ không phải nhúng." - Cảm ơn Matej Drolc vì lời khuyên đó
bstoney

38
Dưới đây là một số thông tin cơ bản tại sao điều này không được bật theo mặc định và một số chi tiết kỹ thuật.
sschuberth 14/2/2015

12
get "không thể khóa tập tin cấu hình C: \ Program Files \ Git \ mingw64 / etc / gitconfig" sau khi chạy lệnh ở trên. Nhưng câu trả lời @Yash làm việc cho tôi
chiaByZero

10
@divideByZero chạy git bash vì quản trị viên ngăn chặn lỗi đó.
Niek

204

Điều này có thể giúp:

git config core.longpaths true

Giải thích cơ bản: Câu trả lời này cho thấy không áp dụng cài đặt như vậy cho hệ thống toàn cầu (cho tất cả các dự án để tránh --systemhoặc --globalgắn thẻ) cấu hình. Lệnh này chỉ giải quyết vấn đề bằng cách cụ thể cho dự án hiện tại.


13
Mọi người ở đây đã lưu ý rằng cài đặt này có thể đưa ra một số hành vi không thể đoán trước, do đó, có vẻ như nên sử dụng lệnh trên làm cài đặt cục bộ cho các dự án yêu cầu thay vì --systemáp dụng nó cho tất cả các dự án
Grant Humphries

4
này, đó chỉ là một bản sao của câu trả lời được đánh giá cao khác. ít nhất có thể giải thích lý do tại sao bạn thích loại bỏ tùy chọn --system ..
Félix Gagnon-Grenier

78

Tạo .gitconfig và thêm

[core]
longpaths = true

Bạn có thể tạo tệp trong một vị trí dự án (không chắc chắn) và cả ở vị trí toàn cầu. Trong trường hợp của tôi là vị trí C:\Users\{name}\.


10
Bạn cũng có thể thực hiện việc này bằng lệnh sau:git config --global core.longpaths true
Quăn

git config --global core.longpaths thật sự làm việc cho tôi cảm ơn
Rama Krshna Ila

1
Sử dụng Visual Studio, các giải pháp git bash ở trên không hiệu quả với tôi, nhưng việc tìm kiếm tệp .git / config cho dự án và chỉnh sửa như được hiển thị ở trên. Cảm ơn yash.
pate

cái này hiệu quả với tôi, tôi đã định vị tệp đó và sửa đổi nó một cách thủ công
Patlatus

1
Các câu trả lời được đề cập và xác minh ở trên là chính xác nhưng với các quyền được cấp cho tệp, có thể không thể cập nhật tệp bằng các lệnh đó. Cách tiếp cận này thực sự dễ dàng bởi vì đây là cách tiếp cận thủ công và nó thực sự hiệu quả với tôi. Bạn có thể dễ dàng tìm thấy .gitconfigtệp trong đường dẫn sau C:\Users\{username}và chỉ cần chỉnh sửa nó.
Kavindu Narathota

53

Các bước để làm theo:

  1. Chạy Git Bash với tư cách quản trị viên
  2. Chạy lệnh sau:
git config --system core.longpaths true

Lưu ý : nếu bước 2 không hoạt động hoặc có bất kỳ lỗi nào, bạn cũng có thể thử chạy lệnh này:

git config --global core.longpaths true

Đọc thêm về git config đây .


35

Giải pháp tốt hơn là kích hoạt tham số longpath từ Git.

git config --system core.longpaths true

Nhưng một cách giải quyết khác là loại bỏ thư mục node_modules khỏi Git:

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

Thêm node_modules trong một hàng mới bên trong tệp .gitignore. Sau khi làm điều này, đẩy các sửa đổi của bạn:

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

3
Có một lý do chính đáng để giữ thư mục node_modules được kiểm tra trong git: Nếu bạn muốn phần mềm của mình hoạt động tương tự sau một năm các mô-đun có khả năng biến mất từ ​​npm.
cfstras

@cfstras nếu một số thư viện có lỗ hổng và bạn không cập nhật định kỳ, chắc chắn bạn sẽ gặp vấn đề về bảo mật.
Janderson Silva

1
Tất nhiên bạn phải nâng cấp phụ thuộc của bạn. Nhưng chỉ khi bạn muốn và nếu có thứ gì đó bị
hỏng

Là đúng. Tôi sẽ chỉnh sửa anwser của tôi. Cảm ơn bạn đã bình luận.
Janderson Silva

1
Không cần phải cam kết node_modules: packages.locktệp ở đây để đảm bảo phiên bản được cài đặt npm installsẽ luôn giống nhau, cho đến khi bạn thực hiệnnpm update
Pierre-Olivier Vares

32

Để hoàn toàn chắc chắn rằng nó có hiệu lực ngay sau khi kho được khởi tạo, nhưng trước khi lịch sử từ xa được tìm nạp hoặc bất kỳ tệp nào được kiểm tra, sử dụng theo cách này sẽ an toàn hơn:

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

-c khóa = giá trị

Đặt một biến cấu hình trong kho lưu trữ mới được tạo; điều này có hiệu lực ngay sau khi kho được khởi tạo, nhưng trước khi lịch sử từ xa được tìm nạp hoặc bất kỳ tệp nào được kiểm tra. Khóa có cùng định dạng như mong đợi của git-config 1 (ví dụ: core.eol = true). Nếu nhiều giá trị được cung cấp cho cùng một khóa, mỗi giá trị sẽ được ghi vào tệp cấu hình. Điều này làm cho nó an toàn, ví dụ, để thêm các phần bổ sung tìm nạp vào điều khiển từ xa gốc.

Thêm thông tin


24

Thực hiện git config --system core.longpaths truemột lỗi ném cho tôi:

"lỗi: không thể khóa tệp cấu hình C: \ Tệp chương trình (x86) \ Git \ mingw32 / etc / gitconfig: Quyền bị từ chối"

Đã sửa lỗi với việc thực thi lệnh ở cấp độ toàn cầu:

git config --global core.longpaths true

Cài đặt chung chỉ ảnh hưởng đến người dùng hiện tại, trong khi cài đặt hệ thống ảnh hưởng đến tất cả người dùng trên máy. Nếu đây là máy trạm của bạn thì chúng cũng giống như bạn chỉ có thể sử dụng một người dùng.
khăn

4
Nếu bạn là ứng dụng dòng lệnh Ran với tư cách Quản trị viên, lệnh đầu tiên sẽ hoạt động!
Sachith Dickwella

12

Bạn cũng có thể thử kích hoạt đường dẫn tệp dài.

Nếu bạn chạy Windows 10 Home Edition, bạn có thể thay đổi Registry để kích hoạt các đường dẫn dài.

Tới HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemnăm regeditvà sau đó thiết lập LongPathsEnabledđể 1.

Nếu bạn có Windows 10 Pro hoặc Enterprise, bạn cũng có thể sử dụng Chính sách nhóm cục bộ.

Chuyển đến Cấu hình máy tínhMẫu quản trịHệ thốngHệ thốnggpedit.msc tệp trong , mở Bật đường dẫn dài Win32 và đặt thành Kích hoạt .


5
Tôi tin rằng điều này phải được thực hiện kết hợp với cấu hình git và đáng chú ý là nó không hoạt động với Windows Explorer vì những lý do được đề cập ở đây .
Neo

11
git config --global core.longpaths true

Các lệnh trên đã làm việc cho tôi. Sử dụng '--system' đã cho tôi tệp cấu hình không bị khóa lỗi


2
Đối với người dùng Github Desktop, đây là người duy nhất hoạt động vì Github Desktop sử dụng cấu hình Git của riêng họ.
Csaba

4

Di chuyển kho lưu trữ đến root ổ đĩa của bạn (sửa chữa tạm thời)

Bạn có thể cố gắng tạm thời di chuyển kho lưu trữ cục bộ (toàn bộ thư mục) vào thư mục gốc của ổ đĩa hoặc càng gần gốc càng tốt.

Vì đường dẫn nhỏ hơn ở gốc ổ đĩa, đôi khi nó khắc phục được sự cố.

Trên Windows, tôi sẽ chuyển cái này sang C:\gốc của ổ đĩa khác.


2
Đây là điều duy nhất giải quyết vấn đề của tôi. Đó là tôi có quá nhiều thư mục trong đường dẫn.
Jangu

2

Tôi cũng gặp lỗi này, nhưng trong trường hợp của tôi, nguyên nhân là do sử dụng phiên bản lỗi thời của npm, v1.4.28.

Cập nhật lên npm v3 theo sau

rm -rf node_modules
npm -i

đã làm cho tôi. vấn đề npm 2697 có chi tiết về cấu trúc thư mục "tối đa phẳng" có trong npm v3 (phát hành 2015-06-25).


1

Nếu bạn đang làm việc với phân vùng được mã hóa của mình, hãy xem xét việc chuyển thư mục sang phân vùng không được mã hóa, ví dụ: a / tmp , đang chạy git pullvà sau đó di chuyển trở lại.


0

Trong một cửa sổ Máy

Chạy Command Prompt với tư cách quản trị viên, sau đó chạy bên dưới lệnh

git config - hệ thống core.longpaths đúng

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.