git pull bị hủy bỏ với tên tệp lỗi quá dài


114

Tôi đang sử dụng Windows làm hệ điều hành của mình và đang làm việc trong một dự án với một người bạn đang sử dụng máy Mac. Anh ấy đã đăng ký mã vào Github của chúng tôi.

Tôi đã cố gắng git kéo mọi thứ anh ấy đã làm và nó bị hủy với lỗi "tên tệp quá dài" của mã bên thứ ba.

Tôi có thể làm gì?


Vấn đề đó có hai trường hợp cơ bản khác nhau, tùy thuộc vào hoạt động của bạn. Nếu kho lưu trữ đã tồn tại, bạn có thể chỉnh sửa cấu hình của nó. Nhưng nếu không? Để sao chép / kiểm tra với việc tạo một thư mục mới, chỉ có câu trả lời của @AlexRosenfeld sẽ giúp ích.
Gangnus

Câu trả lời:


200

Câu hỏi thường gặp về msysgit trên Git không thể tạo một thư mục lưu trữ với một đường dẫn dài dường như không được cập nhật, vì nó vẫn liên kết đến msysgit vé # 110 cũ . Tuy nhiên, theo phiếu số 122 sau đó, sự cố đã được khắc phục trong msysgit 1.9, do đó:

  1. Cập nhật lên msysgit 1.9 (hoặc mới hơn)
  2. Khởi chạy Git Bash
  3. Truy cập kho lưu trữ Git của bạn, nơi 'bị' sự cố đường dẫn dài
  4. Bật hỗ trợ đường dẫn dài với git config core.longpaths true

Cho đến nay, nó hoạt động rất tốt đối với tôi.

Hãy lưu ý thông báo quan trọng trong bình luận về vé số 122

đừng quay lại đây và phàn nàn rằng nó phá vỡ Windows Explorer, cmd.exe, bash hoặc bất kỳ công cụ nào bạn đang sử dụng.


Có một vài thông tin cập nhật, trông giống như có một số kịch bản bổ sung mà bạn cần phải chạy sau khi cài đặt mysysgit github.com/msysgit/git/pull/122#issuecomment-43653756
Adam Grant

18
Điều gì thực sự làm việc cho là: git config --global core.longpaths đúng
Anton Andreev

@AntonAndreev Yup, nếu bạn muốn đặt nó trong phạm vi toàn cầu, thì không sao. Phạm vi cục bộ trên mỗi kho lưu trữ cũng hoàn toàn hợp lệ.
mloskot

Nó không hoạt động đối với tôi nếu không đặt nó ở cấp độ toàn cầu.
Anton Andreev

1
Cách đó sẽ không hiệu quả để nhân bản / kiểm tra khi tạo một thư mục mới. Chỉ có câu trả lời của @AlexRosenfeld mới có ích.
Gangnus

69

Giải pháp1 - đặt cấu hình chung bằng cách chạy lệnh này:

git config --system core.longpaths true

Solution2 - hoặc bạn có thể chỉnh sửa trực tiếp tệp cấu hình git cụ thể của mình như bên dưới:

YourRepoFolder -> .git -> config:

[core]
    repositoryformatversion = 0
    filemode = false
    ...
    longpaths = true        <-- (add this line under core section)

Giải pháp3 - khi nhân bản một kho lưu trữ mới: tại đây .


1
Cách đó sẽ không hiệu quả để nhân bản / kiểm tra khi tạo một thư mục mới. Chỉ có câu trả lời của @AlexRosenfeld mới có ích.
Gangnus

Tôi đã cập nhật câu trả lời với điều đó, để có ở một nơi, cảm ơn.
Daniel Hári

26

Đã muộn một vài năm, nhưng tôi muốn nói thêm rằng nếu bạn cần làm điều này trong một lần rơi (như tôi đã làm), bạn có thể đặt cài đặt cấu hình trong lệnh sao chép. Thử cái này:

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

1
Cổ vũ người bạn đời! Điều này đã hoạt động tốt khi sao chép một thư mục mới từ github.
Jay Killeen

Không có vấn đề gì vui vì nó đã giúp!
xandermonkey

1
Đúng! Cái này, và để nhân bản - chỉ cái này hoạt động!
Gangnus

Điều này không hiệu quả, nhân bản của tôi vẫn bị hủy bỏ. Tôi đang sử dụng git version 1.8.4.msysgit.0, bất kỳ ý tưởng?
Giải pháp đơn giản

Có vẻ như nó không được dùng nữa . Có lẽ hãy thử sử dụng git-scm? lỗi gì bạn nhận được?
xandermonkey

12

Mở tệp your.gitconfig để thêm thuộc tính longpaths. Vì vậy, nó sẽ giống như sau:

[core]
symlinks = false
autocrlf = true
longpaths = true

1
Cách đó sẽ không hiệu quả để nhân bản / kiểm tra khi tạo một thư mục mới. Chỉ có câu trả lời của @AlexRosenfeld mới có ích.
Gangnus

6

Vì ai đó đã gặp phải sự cố này liên tục với kho java trên Windows, giải pháp tốt nhất là cài đặt Cygwin ( https://www.cygwin.com/ ) và sử dụng cài đặt git của nó trong all> devel> git.

Lý do đây là giải pháp tốt nhất mà tôi đã tìm thấy là vì Cygwin quản lý các tên đường dẫn dài nên các lệnh được cung cấp khác có lợi. Ví dụ: tìm, cp và rm. Tin tôi đi, vấn đề thực sự bắt đầu khi bạn phải xóa tên đường dẫn quá dài trong Windows.


4

Cố gắng giữ các tệp của bạn gần với tệp gốc của hệ thống tệp hơn. Thông tin chi tiết: vì lý do kỹ thuật, Git cho Windows không thể tạo tệp hoặc thư mục khi đường dẫn tuyệt đối dài hơn 260 ký tự .


Nó có vẻ như nó chỉ có thể đi đến 130 [có lẽ cửa sổ sử dụng đôi ký tự byte unicode bên dưới] theo mặc định [?]
rogerdpack

5
Nhiều người nên thúc đẩy Microsoft thay đổi hạn chế này (và sửa các API kế thừa mà họ bị hỏng). Không có lý do gì chúng ta vẫn phải sống với những ngày còn sót lại khi tên tệp bị hạn chế ở các ký tự <8>. <3>. Bằng cách không sửa chữa nó ngay lập tức, một cái hố lớn hơn đang được đào. Sửa hướng gạch chéo khi bạn đang ở đó.
cchamberlain

@cchamberlain C: / foo / bar / baz là hoàn toàn hợp lệ, mặc dù trong khi \ foo \ bar \ baz cũng hợp lệ (nó sẽ tham chiếu đến bất kỳ ổ đĩa logic nào mà thư mục làm việc hiện tại đang sử dụng) / foo / bar / baz có thể gây ra sự mơ hồ với cờ dòng lệnh.
JAB

@JAB - Đúng là đôi khi dấu gạch chéo hoạt động nhưng như bạn đã chỉ ra, nó không đáng tin cậy. cmd.exe sẽ phản ứng theo một cách và quyền hạn khác. Tự động hoàn thành ngắt. API cơ bản hiểu điều đó nhưng cmd.exe không phải trong mọi trường hợp và việc sử dụng dấu gạch chéo ngược an toàn hơn khiến các chuỗi đôi khi cần thoát. Đã có đủ rác dấu gạch chéo ngược dòng lệnh với số lượng khoảng trắng và dấu ngoặc đơn tồn tại trong các đường dẫn Windows phổ biến.
cchamberlain

2
Nó không phải là một giải pháp. Công nghệ phải là đầy tớ của con người, không phải con người phải là đầy tớ của công nghệ.
Daniel Hári

4

Trên windows, hãy chạy "cmd" với tư cách quản trị viên và thực thi lệnh.

"C:\Program Files\Git\mingw64\etc>"
"git config --system core.longpaths true"

hoặc bạn phải chmod cho thư mục khi git được cài đặt.

hoặc manullay cập nhật tệp của bạn theo cách thủ công bằng cách đi tới đường dẫn "Git \ mingw64 \ etc"

[http]
    sslBackend = schannel
[diff "astextplain"]
    textconv = astextplain
[filter "lfs"]
    clean = git-lfs clean -- %f
    smudge = git-lfs smudge -- %f
    process = git-lfs filter-process
    required = true
[credential]
    helper = manager
**[core]
    longpaths = true**
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.