Mengubah kapitalisasi nama file di Git

473

Saya mencoba mengubah nama file agar memiliki kapitalisasi berbeda dari sebelumnya:

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

Seperti yang bisa Anda lihat, Git melakukan ini. Saya mencoba mengubah nama hanya menggunakan mvperintah lama , tetapi Git tidak mengambil nama baru (sebagai nama baru atau sebagai file baru yang tidak bisa dilacak).

Bagaimana saya bisa mengubah file untuk memiliki kapitalisasi berbeda dengan nama yang sama? Saya menggunakan Mac OS X v10.7.3 (Lion) dengan Git 1.7.9.1 menggunakan Z shell (zsh) 4.3.15.

knpwrs
sumber
49
itu karena sistem file osx mempertahankan case andcase tidak sensitif secara default. Anda cukup melanjutkan dalam dua langkah:git mv myfile foo; git mv foo MyFile
tonio
16
Mengerjakannya dengan "git mv --force myfile MyFile".
Marcello de Sales
7
Mulai git 2.0.1 (Juni 2014), git mv hello.txt Hello.txtakan bekerja pada OS yang case-sensitive. Lihat jawaban saya di bawah ini
VonC
1
Menautkan stackoverflow.com/questions/1793735/…
Oleg Estekhin

Jawaban:

554

Mulai Git 2.0.1 (25 Juni 2014), git mvhanya akan bekerja pada OS yang case-sensitive .

Lihat commit baa37bf oleh David Turner ( dturner-tw) .

mv: memungkinkan penggantian nama untuk memperbaiki kasus pada sistem file case sensitif

" git mv hello.txt Hello.txt" pada case filesystem yang tidak sensitif selalu memicu " destination already exists" kesalahan, karena kedua nama ini merujuk ke path yang sama dari sudut pandang filesystem dan mengharuskan pengguna untuk memberikan " --force" ketika memperbaiki case dari path yang direkam dalam indeks dan di komit selanjutnya.

Deteksi kasus ini dan biarkan tanpa memerlukan " --force".

git mv hello.txt Hello.txthanya berfungsi (tidak --forcediperlukan lagi).


Alternatif lainnya adalah:

git config --global core.ignorecase false

Dan ganti nama file secara langsung; git tambah dan komit.

VONC
sumber
2
FWIW ini mengalami kemunduran atau tidak pernah berfungsi pada Windows. Am pada 2.15.1.windows.2 dan masih perlu menggunakan --force
TTimo
1
@Adowrath Berita bagus!
VonC
Apakah ini akan berfungsi untuk kapitalisasi ekstensi juga Sebagai contoh, jika memiliki nama file image.TXT dan saya ingin mengubah nama menjadi image.txt
siluveru kiran kumar
@siluverukirankumar Ya. Apakah Anda memiliki masalah dengan penggunaan tersebut?
VonC
1
Dapatkan ini berfungsi di windows dengan menjalankan perintah ini dangit config core.ignorecase false
John Targaryen
452

Mempertimbangkan jawaban larsks , Anda bisa membuatnya bekerja dengan satu perintah dengan "--force":

 git mv --force myfile MyFile
Marcello de Sales
sumber
3
Jika Anda menggunakan sistem file case-insensitive dan Anda mendapatkan kesalahan fatal "Argumen Tidak Valid" cobalah langkah-langkah ini sebagai gantinya: stackoverflow.com/questions/3011625/…
Levi
1
Meskipun ini adalah jawaban yang benar untuk langkah pertama, bagaimana Anda kemudian melanjutkan untuk beralih ke cabang lain di bawah Mac OS X ketika cabang lainnya memiliki kapitalisasi yang lama. Saya mendapatkan kesalahan ****: File pohon yang tidak terlacak berikut ini akan ditimpa dengan checkout: ****
TJChambers
1
Ini gagal di komit untuk saya di Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog
98

Kadang-kadang Anda ingin mengubah kapitalisasi banyak nama file pada sistem file case sensitif (misalnya pada OS X atau Windows). Melakukan git mvperintah akan cepat lelah. Untuk membuat segalanya lebih mudah, inilah yang saya lakukan:

  1. Pindahkan semua file di luar direktori ke, katakanlah, desktop.
  2. Lakukan git add . -Auntuk menghapus semua file.
  3. Ubah nama semua file di desktop menjadi huruf besar yang semestinya.
  4. Pindahkan semua file kembali ke direktori asli.
  5. Lakukan a git add .. Git akan melihat bahwa file diubah namanya.

Sekarang Anda dapat membuat komit dengan mengatakan Anda telah mengubah kapitalisasi nama file.

Tuan
sumber
3
Ini dilakukan dengan mengorbankan semua riwayat dalam file yang Anda pindahkan dan keluarkan, bukan? Saya kira git mv - memaksa tidak memiliki kekurangan ini.
LOAS
12
Tidak, ini tidak akan menghapus semua sejarah. Perhatikan bahwa tidak ada komit di antara keduanya.
Michael L Perry
63

Nama file di bawah OS X tidak peka huruf besar-kecil (secara default). Ini lebih merupakan masalah OS daripada masalah Git. Jika Anda menghapus dan membaca file, Anda harus mendapatkan apa yang Anda inginkan, atau mengganti namanya menjadi sesuatu yang lain dan kemudian mengubah nama file itu kembali.

larsks
sumber
2
Anda juga dapat git clonerepo pada sistem Linux, ganti nama file dan komit hanya untuk situasi ini (jika Anda memiliki sistem Linux di tangan).
gitaarik
4
Sebenarnya, sistem file pada OS X dapat case-sensitive, Anda dapat mengkonfigurasinya saat instalasi. Cara memeriksa apakah partisi OS X case-sensitive
Flimm
2
... maka "(secara default)" dalam jawabannya.
larsks
4
Untuk mengonfirmasi, Anda dapat menggunakan git rm --cached fileorfolderuntuk menghapus file atau folder dari git tanpa menghapus file atau folder dari sistem file. Kemudian Anda cukup menambahkan file atau folder lagi dengan git add fileorfolder.
kas
32

Setel ignorecasekefalse dalam git config

Karena posting asli adalah tentang "Mengubah kapitalisasi nama file di Git":

Jika Anda mencoba mengubah kapitalisasi nama file di proyek Anda, Anda tidak perlu memaksakan mengganti nama dari Git. IMO, saya lebih suka mengubah kapitalisasi dari IDE / editor saya dan memastikan bahwa saya mengkonfigurasi Git dengan benar untuk mengambil penggantian nama.

Secara default, templat Git diatur untuk mengabaikan case (Git case peka). Untuk memverifikasi Anda memiliki templat default, gunakan --getuntuk mengambil nilai untuk kunci yang ditentukan. Gunakan --localdan --globaluntuk menunjukkan kepada Git apakah akan mengambil nilai kunci konfigurasi dari konfigurasi repositori Git lokal Anda atau yang global. Sebagai contoh, jika Anda ingin mencari kunci global Andacore.ignorecase :

git config --global --get core.ignorecase

Jika ini kembali true , pastikan untuk mengaturnya sebagai:

git config --global core.ignorecase false

(Pastikan Anda memiliki izin yang tepat untuk mengubah global.) Dan begitulah; sekarang instalasi Git Anda tidak akan mengabaikan kapitalisasi dan memperlakukannya sebagai perubahan.

Sebagai saran, jika Anda bekerja pada proyek multi-bahasa dan Anda merasa tidak semua proyek diperlakukan sebagai case-sensitive oleh Git, cukup perbarui core.ignorecasefile lokal .

Tersegmentasi
sumber
6
Dan jika git config --global --get core.ignorecasetidak mengembalikan apa pun. Apakah itu true?? karena setelah saya mengaturnya untuk falsemengembalikan false (Windows 10)
fralbo
Dan sepertinya tidak berfungsi seperti yang diharapkan. Maksud saya klien desktop melihat perubahan tetapi setelah melakukan / sinkronisasi, nama file tetap tidak berubah secara online!
fralbo
Bekerja untuk saya (dan lebih baik untuk banyak file daripada menggunakan git mv). Saya juga berasumsi bahwa secara default dianggap benar (yaitu mengabaikan kasus). Entah itu, atau itu cocok dengan kebijakan OS untuk mengajukan casing nama.
Jerry
ITULAH jawabannya. Baru saja menggunakannya.
Dave Everitt
1
Ini harus menjadi jawaban yang dipilih
Dave Everitt
7

Anda dapat membuka direktori ".git" dan kemudian mengedit file "config". Di bawah set [[core] ", set" ignorecase = true "dan Anda selesai;)

Деян Добромиров
sumber
Tampaknya itu harus diubah menjadi false sehingga git akan peka terhadap huruf besar-kecil?
Jonathan
1

Untuk mem-bulk git mvfile ke huruf kecil di macOS:

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

Ini akan mengurangi semua file dalam folder.

softarn
sumber
1

Cuplikan Python ini akan git mv --forcesemua file dalam direktori menjadi huruf kecil. Misalnya, foo / Bar.js akan menjadi foo / bar.js viagit mv foo/Bar.js foo/bar.js --force .

Ubah sesuai keinginan Anda. Saya pikir saya akan berbagi :)

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)
berbaur
sumber
-1

Contoh kerja:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Daniel Batista
sumber
2
Jawaban Anda tidak menyelesaikan pertanyaan awal. Anda mengurangi ekstensi
Tavo
Saya melihat persis ini, tetapi untuk 500 gambar. saya ingin mengganti nama ./src/images/TESTIMAGE.png ke ./src/images/testimage.png on git
Mohak Londhe