Git'te dosya adlarının büyük harf kullanımını değiştirme


473

Ben daha önce vardı farklı büyük harf olması için bir dosyayı yeniden adlandırmak çalışıyorum:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

Gördüğünüz gibi Git buna çok uygun. Ben de sadece düz eski mvkomutunu kullanarak yeniden adlandırmayı denedim , ancak Git yeniden adlandırma (yeniden adlandırma veya yeni bir izlenmemiş dosya olarak) almaz .

Aynı adda büyük harf kullanımı için bir dosyayı nasıl değiştirebilirim? Z kabuk (zsh) 4.3.15 kullanarak Git 1.7.9.1 ile Mac OS X v10.7.3 (Lion) kullanıyorum .


49
çünkü osx dosya sistemi büyük / küçük harf korumalı ve büyük / küçük harfe duyarlı değildir. Sadece iki adımda ilerleyebilirsiniz:git mv myfile foo; git mv foo MyFile
tonio

16
"Git mv --force myfile MyFile" ile çalıştım.
Marcello de Sales


7
Git 2.0.1 (Haziran 2014) 'den itibaren, git mv hello.txt Hello.txtbüyük / küçük harfe duyarlı olmayan işletim sistemi üzerinde çalışacaktır. Aşağıdaki cevabımı
VonC

Yanıtlar:


554

Git 2.0.1'den (25 Haziran 2014) başlayarak git mv, yalnızca büyük / küçük harf duyarsız bir işletim sistemi üzerinde çalışacaktır .

Bkz. Baa37bf , David Turner ( dturner-tw) .

mv: büyük / küçük harfe duyarlı olmayan dosya sistemlerindeki durumu düzeltmek için yeniden adlandırmaya izin ver

" git mv hello.txt Hello.txt" büyük / küçük harfe duyarlı olmayan bir dosya sisteminde her zaman " destination already exists" hatası tetiklenir , çünkü bu iki ad dosya sisteminin bakış açısından aynı yola başvurur ve kullanıcının --forcedizine ve dosyaya kaydedilen yolun durumunu düzeltirken " " vermesini gerektirir sonraki taahhüt.

Bu durumu tespit edin ve " --force" gerektirmeden izin verin .

git mv hello.txt Hello.txtsadece çalışıyor (artık --forcegerekli değil).


Diğer alternatif:

git config --global core.ignorecase false

Ve dosyayı doğrudan yeniden adlandırın; git ekleme ve kaydetme.


2
FWIW bu geriledi veya Windows üzerinde hiç çalışmadı. 2.15.1.windows.2'de ve hala --force
TTimo

1
@Adowrath Harika bir haber!
VonC

Bu, uzantıları büyük harf için de işe yarayacak mı Örneğin, dosya adı image.TXT varsa ve ben image.txt gibi yeniden adlandırmak istiyorum
siluveru kiran kumar

@siluverukirankumar Evet. Bu kullanım ile ilgili herhangi bir sorun yaşadınız mı?
VonC

1
Bu komutu çalıştırarak pencerelerde çalışmak için var vegit config core.ignorecase false
John Targaryen

452

Larsks'ın cevabı göz önüne alındığında , "--force" ile tek bir komutla çalışmasını sağlayabilirsiniz:

 git mv --force myfile MyFile

3
Büyük / küçük harfe duyarlı olmayan bir dosya sistemindeyseniz ve "Geçersiz Argüman" gibi önemli bir hata alıyorsanız bunun yerine şu adımları deneyin: stackoverflow.com/questions/3011625/…
Levi

1
Bu ilk adım için doğru cevap olsa da, diğer dalda eski büyük harf bulunduğunda Mac OS X altında başka bir şubeye geçmeye nasıl devam edersiniz. **** hatası alıyorum: Aşağıdaki izlenmeyen çalışma ağacı dosyaları, kasada geçersiz
kılınır

1
Bu, Windows'taki benim için başarısız oldu:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog

98

Bazen, büyük / küçük harfe duyarlı olmayan bir dosya sisteminde (örneğin OS X veya Windows'ta) çok sayıda dosya adının büyük harf kullanımını değiştirmek istersiniz. git mvKomutların yapılması çabuk yorulur. İşleri biraz daha kolaylaştırmak için yaptığım şey bu:

  1. Tüm dosyaları dizinin dışına taşıyalım, diyelim ki masaüstüne.
  2. git add . -ATüm dosyaları kaldırmak için a yapın.
  3. Masaüstündeki tüm dosyaları uygun büyük / küçük harfle yeniden adlandırın.
  4. Tüm dosyaları orijinal dizine geri taşıyın.
  5. Yapın git add .. Git, dosyaların yeniden adlandırıldığını görmelidir.

Artık dosya adının büyük harf kullanımını değiştirdiğinizi söyleyerek bir taahhütte bulunabilirsiniz.


3
Bu, içeri ve dışarı taşıdığınız dosyalardaki tüm geçmişin pahasına gelir, değil mi? Git mv --force'un bu eksikliği yok sanırım.
LOAS

12
Hayır, bu tüm tarihi kaldırmaz. İki ek arasında hiçbir taahhüt olmadığına dikkat edin.
Michael L Perry

63

OS X altındaki dosya adları büyük / küçük harfe duyarlı değildir (varsayılan olarak). Bu bir Git probleminden çok bir işletim sistemi problemidir. Dosyayı kaldırır ve okuduysanız, istediğinizi almanız veya başka bir adla yeniden adlandırmanız ve ardından yeniden adlandırmanız gerekir.


2
Ayrıca git clonebir Linux sistemi üzerinde repo yapabilir , dosyaları yeniden adlandırabilir ve yalnızca bu durum için taahhütte bulunabilirsiniz (elinizde bir Linux sisteminiz varsa).
gitaarik

4
Aslında, OS X'teki dosya sistemleri büyük / küçük harfe duyarlı olabilir, yükleme sırasında yapılandırabilirsiniz. Bir OS X bölümünün büyük / küçük harfe duyarlı olup olmadığını kontrol etme
Flimm

2
... dolayısıyla yanıttaki "(varsayılan olarak)".
larsks

4
Onaylamak için, git rm --cached fileorfolderdosyayı veya klasörü dosya sisteminden kaldırmadan dosyayı veya klasörü git'ten kaldırmak için kullanabilirsiniz . Sonra ile dosyayı veya klasörü tekrar ekleyebilirsiniz git add fileorfolder.
kas

32

Set ignorecaseiçin falsegit config

Orijinal yazı "Git'teki dosya adlarının büyük harf kullanımını değiştirme" ile ilgili olduğundan:

Projenizde bir dosya adının büyük harf kullanımını değiştirmeye çalışıyorsanız, dosyayı Git adını yeniden adlandırmaya zorlamanız gerekmez . IMO, büyük / küçük harf kullanımını IDE / düzenleyicimden değiştirmek ve Git'i yeniden adlandırmayı almak için doğru şekilde yapılandırmamı tercih ederim.

Varsayılan olarak Git şablonu büyük / küçük harf yoksayılır (Git büyük / küçük harfe duyarlı değildir). Varsayılan şablona sahip olduğunuzu doğrulamak --getiçin, belirtilen bir anahtarın değerini almak üzere kullanın . Git'e yerel Git depo yapılandırmanızdan mı yoksa genel anahtardan mı bir yapılandırma anahtarı değeri alıp almayacağınızı belirtmek için --localve tuşlarını kullanın --global. Örnek olarak, global anahtarınızı aramak istiyorsanız core.ignorecase:

git config --global --get core.ignorecase

Bu geri dönerse true, şu şekilde ayarladığınızdan emin olun:

git config --global core.ignorecase false

(Global değişikliği yapmak için uygun izinlere sahip olduğunuzdan emin olun.) Ve işte orada; Artık Git kurulumunuz büyük harfleri yoksayar ve değişiklik olarak kabul etmez.

Bir öneri olarak, çok dilli projeler üzerinde çalışıyorsanız ve tüm projelerin Git tarafından büyük / küçük harfe duyarlı olarak görülmemesi gerektiğini düşünüyorsanız, yerel core.ignorecasedosyayı güncelleyin .


6
Ve eğer bir git config --global --get core.ignorecaseşey dönmezse. Öyle mi true? çünkü onu ayarladıktan sonra falseyanlış döndürür (Windows 10)
fralbo

Ve beklendiği gibi çalışmıyor gibi görünüyor. Yani masaüstü istemcisi değişikliği görüyor ancak taahhüt / senkronizasyondan sonra dosya adı çevrimiçi olarak değişmeden kalıyor!
fralbo

Benim için çalıştı (ve kullanmaktan çok dosya için daha iyi git mv). Ayrıca varsayılan olarak doğru kabul varsayıyorum (yani, durumu görmezden geliyor). Ya bu ya da işletim sisteminin ilkesini dosya adı kasasıyla eşleştirir.
Jerry

Cevap budur. Sadece kullandým.
Dave Everitt

1
Seçilen cevap bu olmalı
Dave Everitt

7

".Git" dizinini açıp "config" dosyasını düzenleyebilirsiniz. "[Çekirdek]" kümesi altında, "ignorecase = true" ayarını yapın ve işiniz bitti;)


git, büyük / küçük harf duyarlı olacak şekilde false olarak değiştirilmelidir mi?
Jonathan

1

Toplu için git mvdosyalar MacOS üzerinde küçük harfe:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

Bir klasördeki tüm dosyaları küçük harfe çevirir.


1

Bu Python snippet'i git mv --forcebir dizindeki tüm dosyaların küçük harf olmasını sağlar. Örneğin, foo / Bar.js, üzerinden foo / bar.js olur git mv foo/Bar.js foo/bar.js --force.

Beğeninize göre değiştirin. Sadece paylaşacağımı düşündüm :)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)

-1

Çalışma örneği:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
Cevabınız orijinal soruyu çözmüyor. Eklentiyi indiriyorsunuz
Tavo

Tam olarak bakıyorum ama 500 görüntü için. Git ./src/images/TESTIMAGE.png adını ./src/images/testimage.png olarak git
Mohak Londhe
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.