Git'te büyük / küçük harfe duyarlı yalnızca dosya adı değişikliklerini nasıl gerçekleştiririm?


1300

Ben bir kaç dosya adı değişmiş olduğu gibi ilk harfi de-yararlanmak Name.jpgiçin name.jpg. Git bu değişiklikleri tanımıyor ve dosyaları silmek ve tekrar yüklemek zorunda kaldım. Git'in dosya adlarındaki değişiklikleri kontrol ederken büyük / küçük harf duyarlı olabilmesinin bir yolu var mı? Dosyanın kendisinde herhangi bir değişiklik yapmadım.


4
@nn bu doğru değilse, Git aslında büyük / küçük harf duyarlılığını yoksayar mı yoksa kontrol edemez.


6
Bkz. Stackoverflow.com/a/24979063/6309 : git 2.0.1'den beri basit bir git mvçalışma.
VonC


Bu gönderiye bakın. Ben taahhüt edebildi ama sadece git command -m "msg" parametre olarak herhangi bir dosya yolu olmadan kullanarak başardı. Dizini güncelledi ve dosyayı teslim etti. [Link] stackoverflow.com/questions/35790113/…
ARKS

Yanıtlar:


1513

Git mv'yi kullanabilirsiniz :

git mv -f OldFileNameCase newfilenamecase

12
bu değilken bana 'kaynak dizin boş' verir
WiseStrawberry

6
MacOS'u burada (büyük-küçük harfe duyarlı olmayan FS) kullanarak ve -f çalıştı!
Tavsiye

49
Son sürümlerde artık -fbayrağa ihtiyacınız yok .
Joshua Pinter

8
Tam dosya yolunu vermeyi unutmayın. Açıkçası, biliyorum, ama bir süre beni yakaladı
rickrizzo

7
Üst yorumunu olarak için: do gerek -faksi takdirde alabilir son GİT (2.18) ile geçiş fatal: destination existshatası.
DeepSpace101

1036

Git harf duyarlı veya duyarsız olmasını ister bunu söyleyen bir yapılandırma ayarı vardır: core.ignorecase. Git'e büyük-küçük harf duyarlılığı bildirmek için bu ayarı şu şekilde yapın false:

git config core.ignorecase false

belgeleme

Gönderen git configbelgeler :

core.ignorecase

True olursa, bu seçenek git'in FAT gibi büyük / küçük harf duyarlı olmayan dosya sistemlerinde daha iyi çalışmasını sağlamak için çeşitli geçici çözümlerin kullanılmasını sağlar. Örneğin, makefilegit beklediğinde bir dizin listesi bulursa Makefile, git dosyanın gerçekten aynı dosya olduğunu varsayar ve bunu hatırlamaya devam eder Makefile.

Git-clone (1) veya git-init (1) sorgucore.ignorecase oluşturulur ve depo oluşturulduğunda uygunsa true olarak ayarlanır , ancak varsayılan false değeridir .

Büyük / küçük harfe duyarlı olmayan dosya sistemleri

Bildiğim büyük / küçük harfe duyarlı olmayan dosya sistemlerine sahip en popüler iki işletim sistemi

  • pencereler
  • OS X

9
Bir yan not olarak, Mac OS X'in kendisinin büyük / küçük harfe duyarlı olmadığını düşünmüyorum. Bunun yerine, büyük / küçük harf duyarlılığını belirleyen dosya sistemidir. HFS + bölümünü biçimlendirirken, kullanıcılar bunu büyük / küçük harfe duyarlı mı yoksa duyarsız mı yapılacağını seçebilir. Büyük / küçük harf büyük / küçük harfe duyarlı değildir.
spaaarky21

225
Bu yanıtta, bu seçeneği büyük / falseküçük harfe duyarlı olmayan bir dosya sistemine ayarlamanın kötü bir fikir olduğunu belirtmek gerekir . Bu her zaman açık değildir. Örneğin, ben sadece o andan itibaren bir dosya adını, benim sorunları gidermek istiyorum düşünerek benim Mac üzerinde denedik productPageCtrl.jsiçin ProductPageCtrl.js. git statusBir testere Yeni adlı dosyayı ProductPageCtrl.jsama vermedi düşünüyorum productPageCtrl.jssilindi edilmişti. Yeni dosyaları eklediğimde, taahhütte bulundum ve GitHub'a aktardığımda, GitHub repo artık (güncel olarak sözde) yerel depomda sadece bir tane olsa bile her iki dosyayı da içeriyordu .
Mark Amery

5
@MarkAmery Git istemcinizde bir hataya çok benziyor. Bir rapor verdiniz mi?
Domi

24
@Domi bu bir hata değil, bu beklenen davranıştır. Aslında, duyarsız bir dosya sisteminde bunu yanlış olarak ayarlamak kötü bir fikirdir, çünkü olan budur. Git küçük harf dosya silinmiş gördü niçin nedeni olarak silinmiş olarak dosya sistemi rapor olmamasıdır görmezden yapar git Bu seçeneğin False seti ile değil iken durum. Dosya adlarının ntfs veya yağda büyük / küçük harfli olması değil, sadece dosya adı araması davayı görmezden geliyor.
ohcibi

15
@Domi git olduğu akıllı yeter. Eğer neden Thats değil bir olgu duyarsız dosya sistemine FALSE bu ayarlayın. git mvDosyayı taşımak ve git'in onu nasıl yönettiğini görmek için kullanın . Dosyayı git olmadan taşırsanız, dosya sistemi git'e doğruyu söylemediği için git'in yapabileceği hiçbir şey yoktur. Bu ntfs / fat / hfs ve thelike ile ilgili bir sorun, git / linux değil.
ohcibi

157

SourceTree kullanarak tüm bunları kullanıcı arayüzünden yapabildim

  1. Şununla yeniden adlandır FILE.ext :whatever.ext
  2. Bu dosyayı sahne al
  3. şimdi yeniden adlandırmak whatever.ext içinfile.ext
  4. Bu dosyayı tekrar sahne al

Biraz sıkıcı, ancak sadece birkaç dosyaya yapmanız gerekiyorsa oldukça hızlı


5
Git bash ile aynı
Alex78191

3
"Bu dosya sahne" önemli bir parçasıdır - yukarıdaki diğer cevapların hiçbiri benim için işe yaramadı. Aslında düz eski Windows komut istemi ile çalıştı.
Vlad Sabev

1
Bunun sahneleme alanı içinde çalıştığını fark etmedim. Ama benim durumumda, klasör adlarını ve bu klasörlerdeki bazı dosyaları değiştirmek istedim. Bu yüzden önce tüm klasörleri geçici isimlerle değiştirdim. Yeni adları (içindeki tüm dosyalar) ve "silinmiş" dosyaları ekledi. Git hepsini "yeniden adlandırıldı" olarak işaretledi. Daha sonra tüm bu klasörleri yeni vaka sürümlerine yeniden adlandırdı ve tekrar işledi. Sonunda, bu 2 taahhüdü birleştirdi. Ama yazdıklarına dayanarak, her şeyi doğrudan sating alanı üzerinden, 2 taahhüt + birleştirme oluşturmadan yapabilirdim.
ThermoX

3
Klasör adında gitkraken ile de çalışır.
Philippe Matray

Bu sıkıcı işi yapmak için bir Python 3 Script yazdım: stackoverflow.com/a/58159822/4934640
kullanıcı

126

OS X'te yaptığım şey bu:

git mv File file.tmp
git mv file.tmp file

Aksi takdirde bir "dosya var" hatası var çünkü iki adım. Belki de ekleyerek --cachedveya böyle bir adımla yapılabilir .


21
üst cevabın önerdiği gibi, -f(kuvvet) aradığınız bayrak
rperryng

5
@rperryng - hayır, -ftemel FS'nin büyük / küçük harfe duyarlı olmaması durumunda bayrak yardımcı olmaz. Ancak, iki aşamalı çözüm benim için çalıştı
HEKTO

Büyük / küçük harfe duyarlı olmayan bir FS kullanarak (Mac'te) ve -fçalıştı!
Tavsiye

Bu aynı zamanda -fbayrak olmayan pencerelerde bir klasörle çalıştı .
nich

git -c "core.ignorecase=false" add .taahhüt için davası değiştirilen dosyaları dikkate alacaktır.
nietonfir

67

Git'in büyük / küçük harf duyarlılığını geçici olarak değiştirmek bazen yararlı olabilir :

Yöntem # 1 - Tek bir komut için büyük / küçük harf duyarlılığını değiştirme:

git -c core.ignorecase=true checkout mybranchTek bir checkoutkomut için büyük / küçük harf duyarlılığını kapatmak için . Ya da daha genel olarak: . (Bunu yorumlarda önerdiği için VonC'ye teşekkür ederiz.)git -c core.ignorecase= <<true or false>> <<command>>

Yöntem # 2 - Birden çok komut için büyük / küçük harf duyarlılığını değiştirme:

Ayarı daha uzun süre değiştirmek için (örneğin geri değiştirmeden önce birden fazla komutun çalıştırılması gerekiyorsa):

  1. git config core.ignorecase(bu geçerli ayarı döndürür, örn. false).
  2. git config core.ignorecase <<true or false>> - istediğiniz yeni ayarı yapınız.
  3. ... diğer komutları çalıştır ...
  4. git config core.ignorecase <<false or true>> - yapılandırma değerini önceki ayarlarına geri döndürür.

1
Neden doğrudan değil git -c core.ignorecase=<true or false> checkout <<branch>>? Sonra sıfırlanacak bir şey yok.
VonC

2
Ben önerilen core.ignorecase garip bir deneyim yaşadım küçük harf büyük harf, ama büyük harf küçük harf için değil. tek güvenilir çözüm, dosya adı durumunu tanımayan bir işletim sistemi kullanmayı bırakmaktır.
aspiringGuru

Geçici bir değişiklik olması için bir neden var mı? Ayarları büyük / küçük harfe duyarlı olarak değiştirirsem herhangi bir soruna neden olur mu?
cytsunny

Bu, özellikle hedef dosya sisteminin büyük / küçük harfe duyarlı olup olmadığı gibi birkaç faktöre bağlı olabilir - bkz. En.wikipedia.org/wiki/Case_sensitivity#In_filesystems . Dağıtım dosya sistemi, geliştirme için kullanılan dosya sisteminden farklı büyük / küçük harfe duyarlılığa sahipse geçici değişiklik gerekebilir. Ayrıca benim durumumda, herkesin aynı Git ayarlarına (yani büyük / küçük harfe duyarlı) sahip olması beklenen bir ekipte çalışıyorum, bu yüzden kapatırsam geçici olması gerekir.
Steve Chambers

44

OSX altında, bu sorunu önlemek ve büyük / küçük harfe duyarlı olmayan bir dosya sisteminde geliştirme ile ilgili diğer sorunları önlemek için, büyük / küçük harfe duyarlı bir sanal sürücü / disk görüntüsü oluşturmak için Disk İzlencesi'ni kullanabilirsiniz .

Disk yardımcı programını çalıştırın, yeni disk görüntüsü oluşturun ve aşağıdaki ayarları kullanın (veya istediğiniz gibi değiştirin, ancak büyük / küçük harfe duyarlı tutun):

Mac Disk Utility Ekran Görüntüsü

Git'in büyük / küçük harfe duyarlı bir FS'de olduğunu belirttiğinizden emin olun:

git config core.ignorecase false

15
Hayır, nükleer OSX'de tamamen büyük / küçük harfe duyarlı bir önyükleme sürücüsü çalıştırıyor. Kötü yazılmış (ahem, Adobe) uygulamalar olmadan yaşamak veya bunları kendi büyük aptal VM'lerinde çalıştırmak zorunda kalacaksınız, ancak öncelikle * nix sistemleri için kod yazarsanız buna değer.
Mike Marcacci

1
Düzgün çalışan tek seçenek budur. Geri kalanını denedim ve bir şekilde turşu yapıyorsun. Bunu yaparak sorunu doğru bir şekilde çözün.
John Hunt

2
Disk İzlencesi'nin OS X 10.11 hatası olduğunu unutmayın. Büyük / küçük harfe duyarlı görüntüler oluşturmaz. Hdiutil komut satırı aracını kullanmanız gerekir. apple.stackexchange.com/questions/217915/…
dellsala

7
High Sierra'daki APFS ile bu daha da kolay. Artı içeren bir sürücünün simgesini tıklayın ve boyut sınırlaması olmayan büyük / küçük harfe duyarlı bir birim ekleyin. Sadece ana birim ile alan paylaşır ve / Volumes / birim adına bağlanır.
Michael Fox

21

Diğer cevaplardan aşağıdaki çözümleri denedim ve işe yaramadı:

Deponuz uzaktan barındırılıyorsa (GitHub, GitLab, BitBucket), dosyayı başlangıç ​​noktasına göre yeniden adlandırabilir (GitHub.com) ve dosyayı yeniden adlandırmayı yukarıdan aşağıya doğru zorlayabilirsiniz.

Aşağıdaki talimatlar GitHub ile ilgilidir, ancak arkasındaki genel fikir herhangi bir uzak depo barındırma platformuna uygulanmalıdır. Yeniden adlandırmaya çalıştığınız dosya türünü, yani GitHub'ın tarayıcıda düzenlenebilir (kod, metin vb.) Veya düzenlenemez (resim, ikili vb.) Olarak gördüğü bir dosya türü olduğunu unutmayın.

  1. GitHub.com adresini ziyaret edin
  2. GitHub.com'daki deponuza gidin ve içinde çalıştığınız şubeyi seçin
  3. Sitenin dosya gezinme aracını kullanarak yeniden adlandırmak istediğiniz dosyaya gidin
  4. GitHub dosyayı tarayıcıda düzenlemenize izin veriyor mu?
    • a.) Düzenlenebilir
      1. "Bu dosyayı düzenle" simgesini tıklayın (kurşun kalem gibi görünüyor)
      2. Dosya adı metin girişindeki dosya adını değiştirme
    • b.) Düzenlenemez
      1. "İndir" düğmesini yeni bir sekmede açın ve dosyayı bilgisayarınıza kaydedin
      2. İndirilen dosyayı yeniden adlandırın
      3. GitHub.com'daki önceki sekmede "Bu dosyayı sil" simgesini tıklayın (çöp tenekesi gibi görünüyor)
      4. "Doğrudan branchname şubeye gönder" radyo düğmesinin seçili Değişiklikleri kesinleştir" düğmesini tıklayın
      5. GitHub.com'daki aynı dizinde "Dosyaları yükle" düğmesini tıklayın
      6. Yeniden adlandırılan dosyayı bilgisayarınızdan yükleyin
  5. "Doğrudan branchname şubeye gönder" radyo düğmesinin seçili Değişiklikleri kesinleştir" düğmesini tıklayın
  6. Yerel olarak, şubeyi ödeme / alma / çekme
  7. Bitti

Doğrudan BitBucket üzerinde yeniden adlandırdım ve işe yaradı. Teşekkürler.
rsc

Bunu bildiğim iyi oldu. Bu teknik teorik olarak herhangi bir depo barındırma platformunda çalışmalıdır, ancak bunun işe yaramayacağı herhangi bir şey olup olmadığını bilmek isterim.
GMeben

Görüntülerde veya PDF gibi tarayıcıda düzenlenemeyen dosyalar için çalışmaz; Açıkçası, düzenleme seçeneği yok.
Abhijit Sarkar

@AbhijitSarkar İyi bir nokta. Bu durumlar için cevabımı güncelledim. Bu talimatların çalıştığını test ettim ve doğruladım.
gmeben

Bir dizini bu şekilde yeniden adlandırmayı başaran var mı?
Solvitieg

20

@ Sijmen'in cevabına benzer şekilde, bir dizini yeniden adlandırırken OSX'te benim için işe yarayan şey buydu ( başka bir gönderiden bu yanıttan esinlenerek ):

git mv CSS CSS2
git mv CSS2 css

Basitçe yapmak git mv CSS cssgeçersiz argüman hatası verdi: fatal: renaming '/static/CSS' failed: Invalid argumentbelki OSX'in dosya sistemi büyük / küçük harfe duyarsız olduğundan

ps BTW, Django kullanıyorsanız, collectstatic de büyük / küçük harf farkını tanımaz ve yukarıdakileri statik kök dizininde manuel olarak da yapmanız gerekir


18

1) yeniden adlandırma dosya Name.jpgiçinname1.jpg

2) Kaldırılan dosyayı teslim et Name.jpg

3) yeniden adlandırma dosya name1.jpgiçinname.jpg

4) name.jpgönceki taahhütte dosya eklendi

git add
git commit --amend

2
Bunu fatal: bad source, source=name1.jpg, destination=name.jpg3. adımda alıyorum. Öneriniz var mı? Teşekkürler
Anthony Kong

1
Sadece bir taahhütte bulunamazsın git add.
Alex78191

Çok acayip görünüyor, değil mi? Veya maymun yaması.
jeromej

18

Aşağıdaki adımları kullandım:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master

Benim için basit bir çözüm


Bu çözüm. Ve diğer cevapların aksine, toplu isimleri yaparken iyi çalışır. Glamourphilly.org adresinde her .Jpg dosyasını .jpg olarak değiştirmemiz gerekiyordu. Finder'da böyle toplu isimleri yapabilirsiniz ve bu cevap kontrol etmenizi sağlar.
William Entriken

11

Git mv komutunu kullanabiliriz. Aşağıdaki örnekte abcDEF.js dosyasını abcdef.js olarak yeniden adlandırırsak, terminalden aşağıdaki komutu çalıştırabiliriz

git mv -f .\abcDEF.js  .\abcdef.js

8

Mac OSX High Sierra 10.13 bunu biraz düzeltir. Git projeleriniz için sanal bir APFS bölümü yapın, varsayılan olarak boyut sınırı yoktur ve yer kaplamaz.

  1. Disk İzlencesi'nde, Konteyner diski seçili durumdayken + düğmesini tıklayın
  2. Biçim altında APFS'yi (Büyük / Küçük Harfe Duyarlı) seçin
  3. Adını sen koy Sensitive
  4. kâr
  5. İsteğe bağlı: Hassas klasörde bir klasör oluşturun gitveln -s /Volumes/Sensitive/git /Users/johndoe/git

Sürüşünüz /Volumes/Sensitive/

resim açıklamasını buraya girin

Git'te büyük / küçük harfe duyarlı yalnızca dosya adı değişikliklerini nasıl gerçekleştiririm?


Bu öneriyi seviyorum, zarif ve acısız bir şekilde çirkin geçici çözümlere başvurmadan sorunu çözüyor. Teşekkürler!
Phil Gleghorn

4

Bu sorunla MacOS'ta birkaç kez karşılaştım. Git büyük / küçük harfe duyarlıdır, ancak Mac yalnızca büyük / küçük harf korumalıdır.

Birisi bir dosyayı yürütür: Foobar.javave birkaç gün sonra dosyayı yeniden adlandırmaya karar verir.FooBar.java . En son kodu aldığınızda başarısız olurThe following untracked working tree files would be overwritten by checkout...

Bunu düzelttiğini gördüğüm tek güvenilir yol:

  1. git rm Foobar.java
  2. Kaçırmayacağınız bir mesajla taahhüt edin git commit -m 'TEMP COMMIT!!'
  3. Çek
  4. Bu, sizi çatışmayı birleştirmeye zorlayan bir çatışmaya neden olur - çünkü değişikliğiniz sildi, ancak diğer değişiklik yeniden adlandırıldı (dolayısıyla sorun)
    1. 'Silme' olan değişikliğinizi kabul edin
    2. git rebase --continue
  5. Şimdi geçici çözümü damla git rebase -i HEAD~2vedropTEMP COMMIT!!
  6. Dosyanın şimdi çağrıldığını doğrulayın FooBar.java

3

Çok fazla dosya yeniden adlandırma yaptığınızda ve bunların bazıları yalnızca kasa değişikliği olduğunda, hangisinin hangisi olduğunu hatırlamak zor. manuel olarak "git hareketli" dosya oldukça işe yarayabilir. Dosya adı değişikliği görevlerim sırasında ne yapacağım:

  1. git olmayan tüm dosyaları ve klasörleri farklı bir klasöre / depoya kaldırın.
  2. geçerli boş git klasörünü tamamla (tüm dosyalar silindiğinde gösterilir.)
  3. tüm dosyaları orijinal git klasörüne / deposuna geri ekleyin.
  4. geçerli boş olmayan git klasörünü tamamla.

Bu, yeniden adlandırdığınız dosya veya klasörleri anlamaya çalışmadan tüm vaka sorunlarını düzeltir.


Neden git commmit --amendparagraf 4'te değil? Aksi takdirde, tüm dosyaların kaldırılması için ekstra bir taahhüt olacaktır. Veya git rebase -ikabak ile kullanabilirsiniz .
Alex78191

1

Hiçbir şey işe yaramadıysa, dosyayı diskten silmek ve geri eklemek için git rm dosya adını kullanın.


0

Aldığım @CBarr cevabını ve dosyaların bir listesini yapmak Python 3 Komut yazdı:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import shlex
import subprocess

def run_command(absolute_path, command_name):
    print( "Running", command_name, absolute_path )

    command = shlex.split( command_name )
    command_line_interface = subprocess.Popen( 
          command, stdout=subprocess.PIPE, cwd=absolute_path )

    output = command_line_interface.communicate()[0]
    print( output )

    if command_line_interface.returncode != 0:
        raise RuntimeError( "A process exited with the error '%s'..." % ( 
              command_line_interface.returncode ) )

def main():
    FILENAMES_MAPPING = \
    [
        (r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
    ]

    for absolute_path, oldname, newname in FILENAMES_MAPPING:
        run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
        run_command( absolute_path, "git add '%s1'" % ( newname ) )
        run_command( absolute_path, 
             "git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
              newname ) )

        run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
        run_command( absolute_path, "git add '%s'" % ( newname ) )
        run_command( absolute_path, "git commit --amend --no-edit" )

if __name__ == "__main__":
    main()
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.