git mv ve sadece dizin büyük / küçük harf değişimi


259

Benzer bir soru bulduğum halde, sorunuma bir cevap bulamadım

Ben üzerinden foo dizin foo yeniden adlandırmak çalıştığınızda git mv FOO fooolsun

fatal: renaming 'FOO' failed: Invalid argument

TAMAM. Bu yüzden deniyorumgit mv FOO foo2 && git mv foo2 foo

Ama taahhütte bulunduğum git commit .zaman

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

Dizini git add foohiçbir şeyden eklemediğimde değişiyor ve git commit .bana aynı mesajı veriyor.

Neyi yanlış yapıyorum? Büyük / küçük harfe duyarlı bir sistem (OSX) kullandığımı düşündüm, neden dizini yeniden adlandıramıyorum?


10
OS X'in dosya sistemi büyük / küçük harfe duyarlı değildir.
mipadi

2
@mipadi Büyük / küçük harfe duyarlı modda çalışabilir, ancak bu genellikle varsayılan olarak kapalıdır.
GordonM

1
Bu soru ve cevapları Windows'da da kullanışlıdır. Etiketlemeyi "osx" olarak düşünün
Barett

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

git mv foo FooBir cygwin kabuğu kullanıyorsanız, pencerelerde normal olanı kullanabilirsiniz .
Andrew Scott

Yanıtlar:


410

Bir durumda duyarsız bir ortamtasınız. Dahası, Git'in anladığı gibi -A, kaldırma tarafının kaldırılmasına dikkat mvetmeyecektir. Uyarı! Bunu yaptığınızda başka değişikliklerin veya izlenmeyen dosyaların bulunmadığından emin olun, aksi takdirde bu değişikliğin bir parçası olarak işlenirler! git stash -uönce bunu sonra da git stash popsonra yapın. Devam ediyor: Bu sorunu çözmek için aşağıdakileri yapın:

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

Bu, çalışma dizinini değiştirmenin, taahhütte bulunmanın ve sonra da 2 taahhüdü daraltmanın çizilmiş yoludur. Dosyayı sadece dizinde taşıyabilirsiniz, ancak git için yeni olan birine, ne olduğu konusunda yeterince açık olmayabilir. Kısa sürüm

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

Yorumlardan birinde önerildiği gibi git rebase -i HEAD~5, davayı orada düzeltmek ve tarihin hiçbir yerinde yanlış bir vakanın görünmemesi için etkileşimli bir yeniden taban da yapabilirsiniz ( yanlış vaka 5 taahhüt önce tanıtıldıysa). Bundan sonra taahhüt karmaları farklı olacağından ve diğerlerinin çalışmalarını şubenin yakın geçmişiyle yeniden birleştirmek veya yeniden birleştirmek zorunda kalacağı için bunu yaparsanız dikkatli olmalısınız.

Bu, bir dosyanın adını düzeltmeyle ilgilidir: git büyük / küçük harfe duyarlı değil mi?


1
Teşekkürler. Bu beni delirtiyordu. -A ya da --amend seçeneğini bilmiyordum.
oschrenk

7
İzlenen şeyler de dahil olmak üzere geçerli dizininizdeki tüm içeriği yinelemeli olarak ekleyeceğinden, -A'ya dikkat edin. Sadece daha iyi olabilir git add foo2.
rich. E

2
Bu doğru. Bununla birlikte, hem foo2'nin çıkarılmasını hem de FOO'nun eklenmesini aşamalı olarak yapmanız gerekir. -Aikisine de bakar. İlk adım için tam tersi. Uyarıyı ekleyeceğim. Teşekkürler!
Adam Dymitruk

Ayrıca geçmişinizi etkileşimli bir rebase ile temizleyebilirsiniz git rebase -i HEAD~2. Not: Bunu basitleştirmek için ilk iletinizdeki son iletiyi ayarlayın ve ikincisini düzeltin.
Alex

5
Git mv foo foo2 ile başarılı oldum; git mv foo2 FOO; git commit
Chris

146

Seçeneği core.ignorecaseyanlış olarak ayarlamak istersiniz , bu da Git'i yerel olarak desteklemeyen dosya sistemlerinde büyük / küçük harflere dikkat eder. Reponuzda etkinleştirmek için:

$ git config core.ignorecase false

Sonra dosyayı ile yeniden adlandırabilirsiniz git mvve beklendiği gibi çalışacaktır.


1
Bunun başka yerlerde istenmeyen etkileri olabileceğini düşünüyorum. Büyük / küçük harfe duyarlı olmayan sistemler Git'in aynı dizin olduğunu düşünmesine izin vermelidir.
Adam Dymitruk

2
Seçeneğimi global yapılandırmaya ekledim ama işe yaramadı
oschrenk

3
Bunu OSX ile kullanırken garip bir davranış görüyorum. hrm I modified a file that doesn't exist.. hrm error: The following untracked working tree files would be overwritten by checkout:ama ... bu dosyalar mevcut değil.
Skylar Saveland

Tam da aradığım şey buydu. CentOS 5.6 kullanıyorum ve durum değişikliğini yakalamadı.
crmpicco

5
Bu işe yaramıyor! Git 1.8.3'te Git, yeniden adlandırılan dosyayı, kaldırılan + eklenen yerine yeni bir dosya olarak ele alır. Böyle bir taahhütte bulunmak havuzu aynı dosyayla terk edecektir, örneğin foo ve FOO ikisi de mevcuttur! Ancak ödeme yalnızca bir dosya göründüğünde (ancak bir dava diğer davaya
Johnny Wong

68

Geçici bir dosya adı kullanarak git 1.7.7 kullanarak bu sorunu çözmek mümkün:

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"

İlginç. Belki de GIT o zamandan beri bir şeyler geliştirdi. Bu sorunla tekrar karşılaştığımda bunu tekrar deneyeceğim.
oschrenk

bu şekilde yapmak çok daha kolay
olore

MacOS'ta benim için çalıştı.
Mr_Pouet

14

( git mv-ücretsiz varyant.)

Mac OS X 10.9'da Git'te bu sorunla karşılaştım. Aşağıdaki gibi çözdüm:

git rm -r --cached /path/to/directory

Bu, Git'te silinmek üzere dizini aşamalandırır, ancak fiziksel dosyaları ( --cached) gerçekten kaldırmaz . Bu, dizinin, şimdi uygun durumla, izlenmeyen dosyalarda görünmesini sağlar.

Böylece bunu yapabilirsiniz:

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

Git daha sonra dosyaları yeniden adlandırdığınızı anlar ve bunu git statusyaptığınızda bir dizi renamed:satır görmeniz gerekir . Onları inceleyin ve doğru göründüklerinden emin olun, eğer öyleyse değişiklikleri normal şekilde yapabilirsiniz.


mvKomut aslında dizini yeniden adlandırmak için işe yaramadı bulundu ; Finder içinde yeniden adlandırmak zorunda kaldım. Bunun dışında bu düzeltme mükemmel çalışıyor.
Adam S

9

Bu hızlı ve hata korumalı bir çözümdür:

git mv -f path/to/foo/* path/to/FOO/

Uyarı! Her zaman yeniden adlandırılmış klasördeki tüm dosyaları yeniden adlandırın (kullanın /*).

Tek dosyaları yeniden adlandırmayın. Bu, bu cevapta açıklanan bir hataya yol açar .

İlk önce sonucu görmek istiyorsanız, şunu kullanın -n:

git mv -f -n path/to/foo/* path/to/FOO/

Bir yaptıktan sonra mv:

  1. Değişiklikleri yap
  2. Diğer revizyonlara göz atın
  3. Geri ödeme.

Git artık dahili dosyalarında ve dosya sisteminde BOTH klasörünü yeniden adlandırmış olmalıydı.


Bu sadece yukarıdaki soru yorumlarında bahsettiğim gibi Git 2.0.1 için mi? ( stackoverflow.com/a/24979063/6309 ile ilgili )
VonC

8

-F seçeneğiyle zorla:

git mv -f FOO foo

Benim için çalışmıyor. Benim ayarım .git / config "" ignorecase = true "şeklindedir. Yeniden adlandırma, bu şekilde hazırlama alanında sahnelenemez. (Git sürüm 1.8.3.msysgit.0) Adam Dymitruk'un çözümü tek doğru cevaptır.
Johnny Wong

@JohnnyWong ayarınızı değiştirin, falsebenim için çalıştı
Inder Kumar Rathore

Bu durumda, bilgisayarları büyük / küçük harfleri yoksayacak şekilde ayarlanmış olsa bile çekerlerse diğer tüm bilgisayarlarda güncellenir mi?
Bryce

@Bryce Hayır, diğer kullanıcıların değişiklikleri çekebilmesi için değişiklikleri yapmanız ve merkezi repoya aktarmanız gerekir.
konyak

3

İlgili bir sorunum vardı.

Bir klasör 'Pro' (önce oluşturuldu) ve başka bir 'pro' (yanlışlıkla oluşturuldu). Mac'te aynı şey ama git'e göre farklı.

$ git config core.ignorecase false

git config dosyaları doğru klasöre yeniden adlandırır (teşekkürler) ve ayrıca 'pro' (Hayır !!) içinde hayalet dosyaları oluşturdu. Parçaya hayalet dosyası değişiklikleri ekleyemedim ve bu dosyaları yanımda taşımadıkça diğer şubelere ödeme yapamadım ve ayrıca bir şekilde sıfırlayamadım.

Bunun yerine yaptım

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

Ekstra güvenli hale getirmek için, ayrı bir düzeltme dalında yaptım ve daha sonra ana dalla birleştim

Tarafından oluşturulan hayalet dosya sorunu için, herhangi bir guru Nasıl ve Neden açıklayabilir? Şimdiden teşekkürler.


2

Açıkça seçmediğiniz sürece OS X'te büyük / küçük harfe duyarlı bir dosya sistemi kullanmıyorsunuz. HFS + yapabilirsiniz harfe duyarlı olmak, ancak varsayılan harf duyarsızdır.


4
OS X'te büyük / küçük harfe duyarlı dosya sistemini kullanmak iyi bir fikir değildir. Birçok uygulama düzgün çalışmıyor, bunu denemekten öğrendim. Belirli bir sorun, Adobe Photoshop'un büyük / küçük harfe duyarlı dosya sisteminin desteklenmediğini söylemeyi yüklemeyi reddetmesidir.
jpswain

1

İşte bu sayfadaki tüm gitfoo etrafında gerçekten basit bir çözüm.

  1. Dosyaları projenizden manuel olarak kopyalayın.
  2. git rm tüm dosyalar.
  3. normal gibi git.
  4. dosyaları manuel olarak geri ekleyin.
  5. git tüm dosyaları ekleyin.
  6. normal gibi git.
  7. kar.

1
Bu yerel olarak çalışır, ancak bir başkası çekerse, durumlarını değiştirmez.
Jason

Git için çift girişleri farklı durumlarda düzeltmeme yardımcı olduğun için teşekkürler. Bunun bir varyantını kullandım. Sadece üst klasörü yeniden adlandırdık. Bir taahhütte bulundum. Daha sonra üst klasörü orijinal olarak yeniden adlandırdı. Ve ikinci bir taahhütte bulundu. Şimdi farklı vaka ile eski girişler gitti.
dreamerkumar

0

Adam Dymitruk'un cevabını iyileştirmek (SO'nun cevabını yorumlamama izin vermiyor), "git mv" kullanarak otomatik olarak taşınan dosyaları otomatik olarak sahne alacak. Zımbalamaya gerek yoktur ve riskli "git add -A" önlenebilir:

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";

0

Bu Windows'ta benim için harika çalıştı. Powershell aşağıdakilerle kullanılır:

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (isteğe bağlı) git push

Adam'ın yukarıdaki cevabı için teşekkürler.

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.