Zmiana wielkich liter nazw plików w Git

473

Próbuję zmienić nazwę pliku, aby miał inną wielkość liter niż wcześniej:

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

Jak widać, Git rzuca na to wyzwanie. Próbowałem też zmienić nazwę, używając tylko zwykłego starego mvpolecenia, ale Git nie wybiera nazwy (jako zmiany nazwy lub nowego pliku bez śledzenia).

Jak mogę zmienić plik, aby miał inną wielkość liter o tej samej nazwie? Korzystam z systemu Mac OS X 10.7.3 (Lion) z Git 1.7.9.1, używając powłoki Z (zsh) 4.3.15.

knpwrs
źródło
49
dzieje się tak, ponieważ system plików osx domyślnie zachowuje wielkość liter i nie rozróżnia wielkości liter. Możesz po prostu postępować w dwóch krokach:git mv myfile foo; git mv foo MyFile
tonio
16
Działa z „git mv --force myfile MyFile”.
Marcello de Sales
7
Począwszy od git 2.0.1 (czerwiec 2014), git mv hello.txt Hello.txtbędzie działać na systemie operacyjnym bez rozróżniania wielkości liter. Zobacz moją odpowiedź poniżej
VonC
1
Łączenie stackoverflow.com/questions/1793735/…
Oleg Estekhin

Odpowiedzi:

554

Począwszy od Git 2.0.1 (25 czerwca 2014 r.), Po git mvprostu będzie działać na systemie operacyjnym bez rozróżniania wielkości liter .

Zobacz commit baa37bf autorstwa Davida Turnera ( dturner-tw) .

mv: zezwól na zmianę nazwy, aby naprawić wielkość liter w systemach plików bez rozróżniania wielkości liter

Błąd „ git mv hello.txt Hello.txt” w systemie plików bez rozróżniania wielkości liter zawsze wyzwala destination already existsbłąd, ponieważ te dwie nazwy odnoszą się do tej samej ścieżki z punktu widzenia systemu plików i wymagają od użytkownika podania „ --force” podczas poprawiania wielkości liter ścieżki zapisanej w indeksie i w pliku następne zatwierdzenie.

Wykryj tę skrzynkę i zezwól na nią bez konieczności „ --force”.

git mv hello.txt Hello.txtpo prostu działa (nie --forcejest już wymagane).


Inną alternatywą jest:

git config --global core.ignorecase false

I zmień nazwę pliku bezpośrednio; git dodaj i zatwierdź.

VonC
źródło
2
FWIW zrestartowało się lub nigdy nie działało w systemie Windows. Jestem na 2.15.1.windows.2 i nadal muszę używać --force
TTimo
1
@Adowrath Świetna wiadomość!
VonC
Czy to zadziała także dla wielkich liter dla rozszerzeń Na przykład, jeśli mam nazwę pliku image.TXT i chcę zmienić nazwę tak jak image.txt
siluveru kiran kumar
@siluverukirankumar Tak. Czy miałeś jakiś problem z tą sprawą?
VCC
1
Sprawiło, że działało w systemie Windows, uruchamiając to polecenie igit config core.ignorecase false
John Targaryen
452

Biorąc pod uwagę odpowiedź larska , możesz sprawić, by działała za pomocą jednego polecenia z „--force”:

 git mv --force myfile MyFile
Marcello de Sales
źródło
3
Jeśli korzystasz z systemu plików bez rozróżniania wielkości liter i pojawia się błąd krytyczny „Nieprawidłowy argument”, spróbuj wykonać następujące kroki: stackoverflow.com/questions/3011625/...
Levi
1
Chociaż jest to poprawna odpowiedź na pierwszy krok, jak przejść do innej gałęzi w systemie Mac OS X, gdy druga gałąź ma starą wielkość liter. Występuje błąd ****: Następujące nieśledzone pliki działającego drzewa zostaną nadpisane przez kasę: ****
TJChambers
1
Nie powiodło się przy zatwierdzeniu dla mnie w systemie Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog
97

Czasami chcesz zmienić wielkość liter w wielu nazwach plików w systemie plików bez rozróżniania wielkości liter (np. W OS X lub Windows). Wykonywanie git mvpoleceń szybko się męczy. Aby trochę to ułatwić, robię to:

  1. Przenieś wszystkie pliki poza katalog do, powiedzmy, pulpitu.
  2. Zrób, git add . -Aaby usunąć wszystkie pliki.
  3. Zmień nazwę wszystkich plików na pulpicie na odpowiednią wielkość liter.
  4. Przenieś wszystkie pliki z powrotem do oryginalnego katalogu.
  5. Zrobić git add .. Git powinien zobaczyć, że nazwy plików zostały zmienione.

Teraz możesz dokonać zatwierdzenia, mówiąc, że zmieniłeś wielkie litery nazw plików.

MrHus
źródło
3
Dzieje się tak kosztem całej historii plików, które wchodzisz i wychodzisz, prawda? Zgaduję, że git mv - force nie ma tej wady.
LOAS
12
Nie, to nie usunie całej historii. Zauważ, że nie ma zatwierdzenia między tymi dwoma dodaniami.
Michael L Perry
63

Nazwy plików w systemie OS X nie rozróżniają wielkości liter (domyślnie). Jest to bardziej problem z systemem operacyjnym niż problem z Git. Jeśli usuniesz i odczytałeś plik, powinieneś dostać to, czego chcesz lub zmienić jego nazwę na inną, a następnie zmienić nazwę z powrotem.

Larsks
źródło
2
Możesz także git clonerepozytorium w systemie Linux, zmienić nazwy plików i zatwierdzić je tylko w tej sytuacji (jeśli masz pod ręką system Linux).
gitaarik
4
W rzeczywistości w systemach plików OS X rozróżniana jest wielkość liter, można to skonfigurować podczas instalacji. Jak sprawdzić, czy na partycji OS X rozróżniana jest
wielkość liter
2
... stąd „(domyślnie)” w odpowiedzi.
larsks
4
Aby potwierdzić, możesz użyć git rm --cached fileorfolderdo usunięcia pliku lub folderu z git bez usuwania pliku lub folderu z systemu plików. Następnie możesz po prostu dodać plik lub folder ponownie za pomocą git add fileorfolder.
kas
32

Ustaw ignorecasena falsegit config

Ponieważ oryginalny post mówi o „Zmienianiu wielkich liter nazw plików w Git”:

Jeśli próbujesz zmienić wielkość liter w nazwie pliku, nie musisz wymuszać zmiany nazwy z Git. IMO, wolałbym zmienić wielkie litery z mojego IDE / edytora i upewnić się, że poprawnie skonfigurowałem Git, aby podjął zmianę nazwy.

Domyślnie szablon Git ignoruje wielkość liter (Git nie rozróżnia wielkości liter). Aby sprawdzić, czy masz szablon domyślny, użyj, --getaby pobrać wartość określonego klucza. Użyj --locali, --globalaby wskazać Gitowi, czy chcesz pobrać klucz-wartość konfiguracji z lokalnej konfiguracji repozytorium Git czy z globalnej. Na przykład, jeśli chcesz sprawdzić swój klucz globalny core.ignorecase:

git config --global --get core.ignorecase

Jeśli to się zwróci true, ustaw go jako:

git config --global core.ignorecase false

(Upewnij się, że masz odpowiednie uprawnienia do zmiany globalnej.) I oto masz; teraz twoja instalacja Git nie ignoruje kapitalizacji i nie traktuje ich jak zmian.

Jako sugestię, jeśli pracujesz nad projektami w wielu językach i uważasz, że nie wszystkie projekty powinny być traktowane przez Git z rozróżnianiem wielkości liter, po prostu zaktualizuj core.ignorecaseplik lokalny .

Segmentowane
źródło
6
A jeśli git config --global --get core.ignorecasenic nie zwróci. Czy to jest true?? ponieważ po ustawieniu go falsezwraca false (Windows 10)
fralbo
I wydaje się, że nie działa zgodnie z oczekiwaniami. Mam na myśli, że klient pulpitu widzi zmianę, ale po zatwierdzeniu / synchronizacji nazwa pliku pozostaje niezmieniona online!
fralbo
Pracował dla mnie (i lepiej dla wielu plików niż przy użyciu git mv). Zakładam również, że domyślnie jest to uważane za prawdziwe (tzn. Ignoruje wielkość liter). Albo to, albo pasuje do zasad systemu operacyjnego do nazw plików.
Jerry,
To jest odpowiedź. Właśnie tego użyłem.
Dave Everitt
1
To powinna być wybrana odpowiedź
Dave Everitt
7

Możesz otworzyć katalog „.git”, a następnie edytować plik „config”. W ustawieniu „[core]” ustaw „ignorecase = true” i gotowe;)

Деян Добромиров
źródło
wydaje się, że należy zmienić na false, aby w git rozróżniana była wielkość liter?
Jonathan
1

Aby zbiorczo git mvpliki na małe litery w systemie macOS:

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

Pomniejszy wszystkie pliki w folderze.

softarn
źródło
1

Ten fragment kodu w języku Python spowoduje, że git mv --forcewszystkie pliki w katalogu będą pisane małymi literami. Na przykład foo / Bar.js zmieni się na foo / bar.js przez git mv foo/Bar.js foo/bar.js --force.

Zmodyfikuj go według własnych upodobań. Pomyślałem, że podzielę się :)

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)
blured
źródło
-1

Przykład roboczy:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png
Daniel Batista
źródło
2
Twoja odpowiedź nie rozwiązuje pierwotnego pytania. Zmniejszasz rozszerzenie
Tavo
Właśnie tego szukam, ale dla 500 zdjęć. Chcę zmienić nazwę ./src/images/TESTIMAGE.png na ./src/images/testimage.png na git
Mohak Londhe