Windows için Git'te dosya adı çok uzun


664

Git-1.9.0-preview20140217Windows için kullanıyorum . Bildiğim gibi, bu sürüm sorunu çok uzun dosya adlarıyla düzeltmelidir. Ama benim için değil.

Şüphesiz bir şey yanlış yapıyorum: Ben yaptım git config core.longpaths trueve git add .ardından git commit. Herşey iyi gitti. Ama şimdi bir yaptığımda git status, ile dosyaların bir listesini alıyorum Filename too long, örneğin:

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

Benim için çoğaltmak oldukça basit: Açısal jeneratör ("yo açısal") ile bir Yeoman web uygulaması oluşturun node_modulesve .gitignoredosyadan kaldırın . Daha sonra yukarıda belirtilen Git komutlarını tekrarlayın.

Burada ne eksik?


Bu sürümün uzun dosya adlarını düzeltmesi gerektiğini nereden okuyorsunuz?
iveqy

Yama için çekme isteği: github.com/msysgit/git/pull/122
Papa Mufflon

@PapaMufflon kabul edilen cevabı daha fazla puanla değiştirebilir misiniz? Bana çok yardımcı oldu.
v.karbovnichy

@ v.karbovnichy lütfen sorumu dikkatlice okuyun. En çok oy verilen cevapta zaten komutu çalıştırdım. Ama soruyu sorduğumda, kabul edilen cevap doğruydu: msys hala bu karakter sınırlamasına sahipti. Şimdi bu sınırlama gitti ve git config core.longpaths true olması gerektiği gibi çalışıyor.
Papa Mufflon

Tamam, katılıyorum
v.karbovnichy

Yanıtlar:


705

Git msys ile derlendiğinde Windows dışında, bir dosya adı için Git'in 4096 karakterlik bir sınırı vardır. Windows API'sinin daha eski bir sürümünü kullanır ve dosya adı için 260 karakterle sınırlıdır.

Bunu anladığım kadarıyla, Git'in değil msys'in bir sınırlaması. Ayrıntıları buradan okuyabilirsiniz: https://github.com/msysgit/git/pull/110

Başka Git Windows üzerinde istemci veya dizi kullanarak bu asabilirsiniz core.longpathsiçin truediğer cevaplar açıklandığı gibi.

git config --system core.longpaths true

Git, komut dosyalarının ve derlenmiş kodun birleşimi olarak oluşturulur. Yukarıdaki değişiklikle, bazı komut dosyaları başarısız olabilir. Core.longpath'lerin varsayılan olarak etkinleştirilmemesinin nedeni budur.

Https://docs.microsoft.com/en-us/windows/desktop/fileio/naming-a-file adresindeki Windows belgelerinde daha fazla bilgi bulunmaktadır:

Windows 10'dan itibaren, sürüm 1607, MAX_PATH sınırlamaları ortak Win32 dosya ve dizin işlevlerinden kaldırıldı. Ancak, yeni davranışı kabul etmelisiniz.

Kayıt defteri anahtarı, yeni uzun yol davranışını etkinleştirmenizi veya devre dışı bırakmanızı sağlar. Uzun yol davranışını etkinleştirmek için kayıt defteri anahtarını HKLM \ SYSTEM \ CurrentControlSet \ Control \ FileSystem LongPathsEnabled dizininde ayarlayın (Tür: REG_DWORD)


19
Bir yoldaki 260 karakterle ilgili sınırlama MSYS'ye özgü değildir, genel bir Windows API taklididir. Bu, Unicode yolları kullanılarak çözülebilir, ancak başka dezavantajları vardır, bu nedenle core.longpathsvarsayılan olarak etkinleştirilmez. Ayrıca Windows için Git'in MSYS'ye karşı derlenmediğini unutmayın. Bunun yerine, soyulmuş bir MSYS ortamıyla gelen yerel bir Windows uygulamasıdır.
sschuberth

3
@sschuberth: Uzun yolları desteklemeyen programlarla uyumsuzluktan başka sakıncaları var mı?
JAB

3
@JAB Diğer bir dezavantaj, uzun yolların her zaman mutlak olması gerektiğidir; göreli yollar desteklenmez. Daha fazla ayrıntı için lütfen buraya bakın .
sschuberth

4
Veya hızlı bir düzeltme olarak, repo pencerelerinizde C: / dizinine göz atmayı deneyin, böylece klasör yolu karakter sayısını azaltın.
Akshay Lokur

5
Bilginize, o zamana kadar konu hala devam ediyor. Gerçek bir işletim sisteminde sürekli gelişmeyi düşünebiliriz ...
Géza Török

1034

Komutu çalıştırabilmelisiniz

git config --system core.longpaths true

veya Git'in desteklenen bir sürümünde bu işlevi etkinleştirmek için Git yapılandırma dosyalarınızdan birine manuel olarak ekleyin. Belki 1.9.0 ve sonrası gibi görünüyor.


13
Bu yapılandırma seçeneği, kabul edilen yanıtta belirtildiği gibi msys ile bile sorunu benim için düzeltti. (Özellikle, sürüm 1.9.4.msysgit.2).
Alex Osborn

5
Sourcetree, "SourceTree'nin gömülü olanı değil, Sistem'in Git'i kullandığından da emin olmadığınız sürece biraz garip davranır. - Bu tavsiye için Matej Drolc'a teşekkürler
bstoney

38
İşte bunun varsayılan olarak neden etkinleştirilmediğine dair bazı arka plan bilgileri ve bazı teknik ayrıntılar.
sschuberth

12
get "yukarıdaki komutu çalıştırdıktan sonra config dosyası C: \ Program Files \ Git \ mingw64 / etc / gitconfig dosyasını kilitleyemedi". Ama @Yash yanıtı benim için çalıştı
divideByZero

10
@divideByZero git bash'ı yönetici olarak çalıştırırsa bu hata önlenir.
Niek

204

Bu yardımcı olabilir:

git config core.longpaths true

Temel açıklama: Bu cevap, bu ayarın global sistem (kaçınılması --systemveya --globaletiketlenmesi önlenen tüm projelere ) yapılandırmalarına uygulanmamasını önermektedir . Bu komut, sorunu yalnızca geçerli projeye özgü olarak çözer.


13
Buradaki insanlar, bu ayarın öngörülemeyen bazı davranışlar getirebileceğini belirttiler, bu nedenle yukarıdaki komutu, --systemtüm projelere uygulayacak şekilde eklemek yerine, gerektiren projelerde yerel bir ayar olarak kullanmak tercih edilir gibi görünüyor
Grant Humphries

4
hey, bu sadece son derece onaylanmış diğer cevabın bir kopyası. en azından --system seçeneğini kaldırmayı neden tercih ettiğinizi açıklayabilir ..
Félix Gagnon-Grenier

78

.Gitconfig oluşturun ve ekleyin

[core]
longpaths = true

Dosyayı bir proje konumunda (emin değilim) ve global konumda da oluşturabilirsiniz. Benim durumumda konum C:\Users\{name}\.


10
Bunu aşağıdaki komutla da yapabilirsiniz:git config --global core.longpaths true
Curly

git config - global core.longpaths true benim için çalıştı teşekkürler
Rama Krshna Ila

1
Visual git kullanarak yukarıdaki git bash çözümleri benim için çalışmadı, ancak proje için .git / config dosyasını bulma ve yukarıda gösterildiği gibi düzenleme. Teşekkürler yash.
andrew pate

Bu benim için çalıştı, ben bu dosyayı bulundu ve el ile değiştirdim
Patlatus

1
Yukarıda belirtilen ve doğrulanmış cevaplar doğrudur, ancak dosyaya verilen izinlerle, dosyayı bu komutlarla güncellemek mümkün olmayabilir. Bu yaklaşım gerçekten kolaydır, çünkü bu manuel yaklaşımdır ve benim için gerçekten iyi çalıştı. .gitconfigDosyayı aşağıdaki yolda kolayca bulabilir C:\Users\{username}ve düzenleyebilirsiniz.
Kavindu Narathota

53

Takip edilecek adımlar:

  1. Git Bash'ı yönetici olarak çalıştır
  2. Aşağıdaki komutu çalıştırın:
git config --system core.longpaths true

Not : 2. adım işe yaramazsa veya hata verirse, bu komutu çalıştırmayı da deneyebilirsiniz:

git config --global core.longpaths true

git config Burada daha fazla bilgi edinin .


35

Daha iyi çözüm, Git'ten longpath parametresini etkinleştirmektir.

git config --system core.longpaths true

Ancak çalışan bir geçici çözüm, node_modules klasörünü Git'ten kaldırmaktır:

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

.Degignore dosyasının içindeki yeni bir satıra node_modules ekleyin. Bunu yaptıktan sonra değişikliklerinizi yapın:

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

3
Node_modules klasörünü git olarak kontrol altında tutmak için iyi bir neden var: Yazılımınızın npm'den kaybolan bir yıllık modüllerden sonra aynı şekilde davranmasını istiyorsanız.
cfstras

@cfstras bazı kitaplıklarda güvenlik açığı varsa ve düzenli aralıklarla güncelleme yapmıyorsanız, güvenlik sorunlarınız olacaktır.
Janderson Silva

1
Tabii ki bağımlılıklarınızı yükseltmelisiniz. Ama sadece zaman sen istiyor ve bir şeyler kırmak olsaydı, GIT'de Yedeğinizi isteyeyim ...
cfstras

Doğru. Kurucumu düzenleyeceğim. Yorumunuz için teşekkürler.
Janderson Silva

1
Taahhüt etmeye gerek yok node_modules: packages.lockdosya, yüklenene kadar yüklü sürümün npm installher zaman aynı olmasını sağlamak için buradanpm update
Pierre-Olivier Vares

32

Depo başlatıldıktan hemen sonra yürürlüğe gireceğinden tamamen emin olmak için, ancak uzak geçmiş getirilmeden veya herhangi bir dosya teslim alınmadan önce, bu şekilde kullanılması daha güvenlidir:

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

-c tuşu = değer

Yeni oluşturulan depoda bir yapılandırma değişkeni ayarlayın; bu, havuz başlatıldıktan hemen sonra, ancak uzak geçmiş getirilmeden veya herhangi bir dosya teslim alınmadan önce geçerli olur. Anahtar git-config 1 tarafından beklenilen formatta (ör. Core.eol = true). Aynı anahtar için birden çok değer verilirse, her değer yapılandırma dosyasına yazılır. Bu, örneğin, kaynak uzaktan kumandaya ek getirme refspec'leri eklemeyi güvenli hale getirir.

Daha fazla bilgi


24

Yürütme git config --system core.longpaths truebana bir hata verdi:

"hata: yapılandırma dosyası kilitlenemedi C: \ Program Files (x86) \ Git \ mingw32 / etc / gitconfig: İzin verilmedi"

Komutun global düzeyde yürütülmesi düzeltildi:

git config --global core.longpaths true

Genel ayarlar yalnızca geçerli kullanıcıyı etkilerken, sistem ayarları makinedeki tüm kullanıcıları etkiler. Bu iş istasyonunuzsa, yalnızca bir kullanıcı kullanabileceğinizle aynıdır.
havlu

4
Eğer komut satırı uygulaması Yönetici olarak Ran iseniz, ilk komut işe yarayacak!
Sachith Dickwella

12

Uzun dosya yollarını etkinleştirmeyi de deneyebilirsiniz.

Windows 10 Home Edition'ı çalıştırırsanız, uzun yolları etkinleştirmek için Kayıt Defterinizi değiştirebilirsiniz.

Git HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FileSystemde regeditve daha sonra belirlenen LongPathsEnabledetmek 1.

Windows 10 Pro veya Enterprise kullanıyorsanız Yerel Grup İlkeleri'ni de kullanabilirsiniz.

Git Bilgisayar YapılandırmasıYönetim ŞablonlarıSistemDosya Sistemi içinde gpedit.msc, açık Win32 uzun yolları etkinleştirme ve ayarlayın Etkin .


5
Bunun git config ile birlikte yapılması gerektiğine inanıyorum ve burada belirtilen nedenlerle Windows Gezgini ile çalışmadığını belirtmek gerekir .
Neo

11
git config --global core.longpaths true

Yukarıdaki komut benim için çalıştı. '--System' kullanmak bana yapılandırma dosyası kilitli değil hatası verdi


2
Github Desktop kullanıcıları için, Github Desktop kendi Git yapılandırmasını kullandığı için çalışan tek kişi budur.
Csaba

4

Havuzu sürücünüzün kök dizinine taşıma (geçici düzeltme)

Yerel depoyu (tüm klasör) geçici olarak sürücünüzün kök dizinine veya olabildiğince kök dizinine taşımaya çalışabilirsiniz.

Yol sürücünün kökünde daha küçük olduğundan, bazen sorunları düzeltir.

Windows'da bunu C:\veya başka bir sürücünün köküne taşıyacağım .


2
Sorunumu çözen tek şey bu. Yolda çok fazla klasörüm vardı.
J Brune

2

Ben de bu hatayı vardı, ama benim durumumda neden npm, v1.4.28 eski bir sürümünü kullanıyordu.

Npm v3'e güncelleme ve ardından

rm -rf node_modules
npm -i

benim için çalıştı. npm sayı 2697, npm v3'te yer alan "maksimum düz" klasör yapısının ayrıntılarına sahiptir (2015-06-25 yayınlandı).


1

Şifreli bölümünüzle çalışıyorsanız, klasörü şifrelenmemiş bir bölüme taşımayı düşünün, örneğin a / tmp , çalışıyor git pullve sonra geri taşıyın .


0

Bir Windows Makinesi'nde

Komut İstemi'ni yönetici olarak çalıştırın ve ardından komutun altında çalıştırın

git config - sistem çekirdeği. longpaths true

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.