Nama file terlalu lama di Git untuk Windows

665

Saya menggunakan Git-1.9.0-preview20140217untuk Windows. Seperti yang saya tahu, rilis ini harus memperbaiki masalah dengan nama file yang terlalu panjang. Tapi tidak untukku.

Tentunya aku melakukan sesuatu yang salah: saya lakukan git config core.longpaths truedan git add .kemudian git commit. Semuanya berjalan dengan baik. Tetapi ketika saya sekarang melakukan git status, saya mendapatkan daftar file dengan Filename too long, misalnya:

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

Cukup sederhana untuk mereproduksi untuk saya: cukup buat aplikasi web Yeoman dengan generator Angular ("yo angular") dan hapus node_modulesdari .gitignorefile. Kemudian ulangi perintah Git yang disebutkan di atas.

Apa yang kulewatkan di sini?

Papa Mufflon
sumber
Di mana Anda membaca bahwa versi itu harus memperbaiki nama file yang panjang?
iveqy
Ini permintaan tarik untuk tambalan: github.com/msysgit/git/pull/122
Papa Mufflon
@ Paapaufflon, bisakah Anda mengubah jawaban yang diterima menjadi lebih banyak skor? Itu hanya banyak membantu saya.
v.karbovnichy
@ v.karbovnichy tolong baca pertanyaan saya dengan seksama. Saya sudah menjalankan perintah di jawaban pilihan teratas. Tetapi pada saat saya mengajukan pertanyaan, jawaban yang diterima benar: msys masih memiliki keterbatasan karakter ini. Sekarang batasan itu hilang dan git config core. Jalan yang panjang benar-benar berfungsi seperti seharusnya.
Papa Mufflon
Baiklah, saya setuju
v.karbovnichy

Jawaban:

706

Git memiliki batas 4096 karakter untuk nama file, kecuali pada Windows ketika Git dikompilasi dengan msys. Ini menggunakan versi Windows API yang lebih lama dan ada batas 260 karakter untuk nama file.

Jadi sejauh yang saya mengerti ini, ini adalah keterbatasan msys dan bukan dari Git. Anda dapat membaca detailnya di sini: https://github.com/msysgit/git/pull/110

Anda dapat menghindari ini dengan menggunakan klien lain Git pada Windows atau set core.longpathsuntuk trueseperti yang dijelaskan dalam jawaban lainnya.

git config --system core.longpaths true

Git dibuat sebagai kombinasi skrip dan kode yang dikompilasi. Dengan perubahan di atas beberapa skrip mungkin gagal. Itulah alasan untuk core.longpaths tidak diaktifkan secara default.

Dokumentasi windows di https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file memiliki beberapa informasi lebih lanjut:

Mulai di Windows 10, versi 1607, batasan MAX_PATH telah dihapus dari fungsi file dan direktori Win32 yang umum. Namun, Anda harus ikut serta ke perilaku baru.

Kunci registri memungkinkan Anda untuk mengaktifkan atau menonaktifkan perilaku jalur panjang baru. Untuk mengaktifkan perilaku jalur panjang, atur kunci registri di HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled (Tipe: REG_DWORD)

iveqy
sumber
19
Batasan untuk 260 karakter di jalur tidak spesifik untuk MSYS, ini adalah imitasi API Windows umum. Ini dapat dikerjakan dengan menggunakan jalur Unicode, tetapi yang memiliki kelemahan lain, itulah mengapa core.longpathstidak diaktifkan secara default. Perhatikan juga bahwa Git untuk Windows tidak dikompilasi dengan MSYS. Sebagai gantinya, ini adalah aplikasi Windows asli yang dilengkapi dengan lingkungan MSYS yang dilucuti.
sschuberth
3
@sschuberth: Apakah ada kekurangan selain kurangnya kompatibilitas dengan program yang tidak mendukung jalur yang panjang?
JAB
3
@ JAB Kelemahan lain adalah jalan panjang harus selalu absolut; jalur relatif tidak didukung. Untuk perincian lebih lanjut silakan lihat di sini .
sschuberth
4
Atau sebagai perbaikan cepat, coba checkout repo Anda ke C: / pada windows sehingga mengurangi jumlah karakter path folder.
Akshay Lokur
5
FYI, pada saat sekarang masalah ini masih berlanjut. Kami mungkin ingin mempertimbangkan untuk melanjutkan pengembangan pada sistem operasi nyata ...
Géza Török
1034

Anda harus dapat menjalankan perintah

git config --system core.longpaths true

atau menambahkannya ke salah satu file konfigurasi Git Anda secara manual untuk mengaktifkan fungsi ini, setelah Anda berada di versi Git yang didukung. Sepertinya mungkin 1.9.0 dan sesudahnya.

sparkym3
sumber
13
Opsi konfigurasi ini memperbaiki masalah bagi saya, bahkan dengan msys sebagaimana disebutkan dalam jawaban yang diterima. (Khususnya, versi 1.9.4.msysgit.2).
Alex Osborn
5
Sourcetree bertindak agak aneh kecuali Anda "juga memastikan bahwa SourceTree menggunakan Git Sistem dan bukan yang tertanam." - Terima kasih kepada Matej Drolc untuk saran itu
bstoney
38
Berikut adalah beberapa informasi latar belakang mengapa ini tidak diaktifkan secara default, dan beberapa detail teknis.
sschuberth
12
dapatkan "tidak dapat mengunci file konfigurasi C: \ Program Files \ Git \ mingw64 / etc / gitconfig" setelah menjalankan perintah di atas. Tapi jawaban Yash bekerja untuk saya
divideByZero
10
@divideByZero menjalankan git bash sebagai administrator mencegah kesalahan itu.
Niek
204

Ini mungkin membantu:

git config core.longpaths true

Penjelasan dasar: Jawaban ini menyarankan agar pengaturan seperti itu tidak diterapkan pada sistem global (untuk semua proyek sehingga menghindari --systematau --globalmenandai) konfigurasi. Perintah ini hanya menyelesaikan masalah dengan menjadi spesifik untuk proyek saat ini.

Sagiruddin Mondal
sumber
13
Orang-orang di sini telah mencatat bahwa pengaturan ini dapat memperkenalkan beberapa perilaku yang tidak dapat diprediksi sehingga tampaknya lebih baik menggunakan perintah di atas sebagai pengaturan lokal pada proyek-proyek yang memerlukannya daripada menambahkan --systemyang akan menerapkannya pada semua proyek
Grant Humphries
4
hei, itu hanya copypasta dari jawaban yang sangat tervvotasikan. paling tidak mungkin menjelaskan mengapa Anda lebih suka menghapus opsi --system ..
Félix Gagnon-Grenier
78

Buat .gitconfig dan tambahkan

[core]
longpaths = true

Anda dapat membuat file di lokasi proyek (tidak yakin) dan juga di lokasi global. Dalam kasus saya lokasinya C:\Users\{name}\.

Yash
sumber
10
Anda juga dapat melakukan ini dengan perintah berikut:git config --global core.longpaths true
Curly
git config --global core.longpaths true berfungsi untuk saya, terima kasih
Rama Krshna Ila
1
Menggunakan Visual Studio solusi bash git di atas tidak bekerja untuk saya, tetapi menemukan file .git / config untuk proyek dan mengedit seperti yang ditunjukkan di atas. Terima kasih yash.
andrew pate
ini bekerja untuk saya, saya menemukan file itu dan memodifikasinya secara manual
Patlatus
1
Jawaban yang disebutkan dan diverifikasi di atas benar tetapi dengan izin yang diberikan kepada file, mungkin tidak mungkin untuk memperbarui file dengan perintah-perintah itu. Pendekatan ini sangat mudah karena ini adalah pendekatan manual dan itu bekerja dengan baik untuk saya. Anda dapat dengan mudah menemukan .gitconfigfile di jalur berikut C:\Users\{username}dan cukup mengeditnya.
Kavindu Narathota
53

Langkah-langkah untuk diikuti:

  1. Jalankan Git Bash sebagai administrator
  2. Jalankan perintah berikut:
git config --system core.longpaths true

Catatan : jika langkah 2 tidak berfungsi atau memberikan kesalahan, Anda juga dapat mencoba menjalankan perintah ini:

git config --global core.longpaths true

Baca lebih lanjut di git config sini .

Saikat
sumber
35

Solusi yang lebih baik adalah mengaktifkan parameter longpath dari Git.

git config --system core.longpaths true

Tetapi solusi yang berfungsi adalah menghapus folder node_modules dari Git:

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

Tambahkan node_modules di baris baru di dalam file .gitignore. Setelah melakukan ini, dorong modifikasi Anda:

$ git add .gitignore
$ git commit -m "node_modules removed"
$ git push
Janderson Silva
sumber
3
Ada alasan bagus untuk menjaga folder node_modules dicentang ke git: Jika Anda ingin perangkat lunak Anda berperilaku sama setelah satu tahun modul berpotensi menghilang dari npm.
cfstras
@cfstras jika beberapa perpustakaan memiliki kerentanan dan Anda tidak memperbarui secara berkala, tentu Anda akan memiliki masalah keamanan.
Janderson Silva
1
Tentu saja Anda harus meningkatkan dependensi Anda. Tetapi hanya ketika Anda ingin, dan jika ada sesuatu yang rusak, Anda ingin cadangan Anda di git ...
cfstras
Adalah benar. Saya akan mengedit anwser saya. Terima kasih atas komentar Anda.
Janderson Silva
1
Tidak perlu komit node_modules: packages.lockfile ada di sini untuk memastikan versi yang diinstal oleh npm installakan selalu sama, sampai Anda membuatnpm update
Pierre-Olivier Vares
32

Untuk sepenuhnya yakin bahwa itu akan segera berlaku setelah repositori diinisialisasi, tetapi sebelum riwayat jarak jauh diambil atau file apa pun diperiksa, lebih aman untuk menggunakannya dengan cara ini:

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

-c key = value

Setel variabel konfigurasi di repositori yang baru dibuat; ini berlaku segera setelah repositori diinisialisasi, tetapi sebelum riwayat jarak jauh diambil atau file apa pun diperiksa. Kuncinya ada dalam format yang sama seperti yang diharapkan oleh git-config 1 (misalnya, core.eol = true). Jika beberapa nilai diberikan untuk kunci yang sama, setiap nilai akan ditulis ke file konfigurasi. Ini membuatnya aman, misalnya, untuk menambahkan refspec fetch tambahan ke remote asal.

Info lebih lanjut

Tukang arloji
sumber
24

Eksekusi git config --system core.longpaths truemembuat kesalahan kepada saya:

"error: tidak dapat mengunci file config C: \ Program Files (x86) \ Git \ mingw32 / etc / gitconfig: Izin ditolak"

Diperbaiki dengan menjalankan perintah di tingkat global:

git config --global core.longpaths true
Arpit Aggarwal
sumber
Pengaturan global hanya memengaruhi pengguna saat ini, sedangkan pengaturan sistem memengaruhi semua pengguna pada mesin. Jika ini adalah workstation Anda, mereka secara efektif sama dengan Anda hanya dapat menggunakan satu pengguna.
handuk
4
Jika Anda aplikasi baris perintah Berlari sebagai Administrator, perintah pertama akan berhasil!
Sachith Dickwella
12

Anda juga dapat mencoba mengaktifkan jalur file yang panjang.

Jika Anda menjalankan Windows 10 Home Edition Anda bisa mengubah Registry Anda untuk mengaktifkan jalur panjang.

Pergi ke HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemdalam regeditdan kemudian mengatur LongPathsEnableduntuk 1.

Jika Anda memiliki Windows 10 Pro atau Enterprise Anda juga dapat menggunakan Kebijakan Grup Lokal.

Pergi ke Konfigurasi KomputerTemplate AdministratifSistemFilesystem di gpedit.msc, buka Aktifkan Win32 jalur panjang dan atur ke Diaktifkan .

Julian Veerkamp
sumber
5
Saya percaya ini harus dilakukan dalam kombinasi dengan konfigurasi git, dan perlu dicatat itu tidak berfungsi dengan Windows Explorer karena alasan yang disebutkan di sini .
Neo
11
git config --global core.longpaths true

Perintah di atas bekerja untuk saya. Menggunakan '--system' memberi saya file konfigurasi bukan kesalahan terkunci

amalik2205
sumber
2
untuk pengguna Github Desktop, ini adalah satu-satunya yang berfungsi karena Github Desktop menggunakan konfigurasi Git sendiri.
Csaba
4

Pindahkan repositori ke root drive Anda (perbaikan sementara)

Anda dapat mencoba memindahkan sementara repositori lokal (seluruh folder) ke root drive Anda atau sedekat mungkin dengan root.

Karena jalurnya lebih kecil di root drive, kadang-kadang memperbaiki masalah.

Di Windows, saya akan memindahkan ini ke C:\atau root drive lain.

Dheeraj Bhaskar
sumber
2
Ini adalah satu-satunya hal yang menyelesaikan masalah saya. Itu karena saya memiliki terlalu banyak folder di jalur.
J Brune
2

Saya memiliki kesalahan ini juga, tetapi dalam kasus saya penyebabnya adalah menggunakan versi lama dari npm, v1.4.28.

Memperbarui ke npm v3 diikuti oleh

rm -rf node_modules
npm -i

bekerja untukku. npm issue 2697 memiliki detail struktur folder "maksimal datar" yang termasuk dalam npm v3 (dirilis 2015-06-25).

James Green
sumber
1

Jika Anda bekerja dengan partisi terenkripsi Anda, pertimbangkan untuk memindahkan folder ke partisi tidak terenkripsi, misalnya a / tmp , berjalan git pull, dan kemudian pindah kembali.

augustowebd
sumber
0

Di Mesin windows

Jalankan Command Prompt sebagai administrator kemudian jalankan perintah di bawah ini

git config --system core.longpaths true

kartick shaw
sumber