Zmienić wielkość liter pliku w systemie Windows?

209

W naszej bazie kodu kontrolowanej przez git znajduje się kilka plików, których nazwę chciałbym zmienić. W szczególności chcę po prostu zmienić wielkość liter pliku, aby sourceCode.javastało się to SourceCode.javana przykład. Haczyk: korzystam z systemu Windows, a system plików uważa, że ​​są to te same nazwy plików.

Jak sprawić, aby Windows i Git rozpoznały tę zmianę i zarejestrowały ją?

Electrons_Ahoy
źródło
3
Od wersji Git 2.0.1+ (czerwiec 2014 r.) Proste git mvpowinno działać ( stackoverflow.com/a/24979063/6309 ). Nawet w systemie Windows.
VonC

Odpowiedzi:

337

Zajrzyj tutaj, aby uzyskać więcej wskazówek, jak to zrobić:

Jak sprawić, by git ignorował zmiany w przypadku?

Lub:

git mv -f name.java Name.java
Igor Zevaka
źródło
8
Nawiasem mówiąc, nie działa to w systemie plików FAT. Niosę jakiś kod projektu na pendrivie, a zmiany w skrzynkach to prawdziwy ból.
asm
1
Nie działało to dla mnie w systemie NTFS i Windows 10
Roboblob
1
Jest to z pewnością właściwy sposób, aby to zrobić, ale jeśli musisz zmienić nazwę wielu plików, może to być uciążliwe. Jeśli masz już jakąś nazwę w systemie plików i po prostu chcesz zatwierdzić te zmiany, możesz zmienić nazwę folderu nadrzędnego, zrób git addz tego folderu o nowej nazwie, NIE NALEŻY PRZEKAZAĆ, zmień nazwę folderu z powrotem na taki, jaki powinien być , git addto ponownie, a następnie zatwierdzenie.
Okonomiyaki3000
Działa na NTFS i Windows 7.
Hans Goldman
Czy można to zrobić zbiorczo? np. z PowerShell,Get-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
killjoy
49

Jeśli korzystasz z systemu plików FAT, jedynym wyborem jest zmiana nazwy na dwa etapy:

  1. Zmień nazwę sourceCode.javanaanything.you.like
  2. Zmień nazwę anything.you.likenaSourceCode.java

W czasach, gdy korzystaliśmy z Perforce, mieliśmy dokładnie ten problem i było to jedyne rozwiązanie, jakie mogliśmy wymyślić.

ChrisF
źródło
13
Tylko uwaga dla innych: nie jest konieczne dokonywanie pośrodku, ale konieczne jest dodanie do indeksu, aby git zauważył zmianę
arberg
29

Poniższe kroki pozwoliły mi zmienić wielkość liter w systemie Windows:

  • Dodaj ignorecase = falsedo [core]w .git/config;
  • Przenieś pliki, których nazwę chcesz zmienić, z katalogu projektu;
  • Dodaj usunięcia do indeksu;
  • Przenieś wszystkie pliki z powrotem do ich oryginalnej lokalizacji i zmień wielkość liter plików i / lub katalogów;
  • Dodaj wszystkie „nowe” pliki do indeksu;
  • Usuń ignorecase = falsedodane w pierwszym kroku.

W ten sposób masz jeden zatwierdzenie, które zawiera zmianę nazwy i ułatwia zmianę np. Całego katalogu.

Pieter van Ginkel
źródło
5
Zrób to dla globalnych i lokalnych ustawień łaźni: $ gti config --global core.ignorecase false $ gti config core.ignorecase false
Roman Iwanow
6

Bądź ostrożny. Może to doprowadzić do zmian, których scalenie jest niemożliwe. Git jest zdezorientowany podczas łączenia w systemie Windows, ponieważ nie może zdecydować, czy stara nazwa wielkich liter i nowa mała litera są tym samym plikiem, czy nie (w przypadku Git tak nie jest, ale dla systemu plików są). Aby scalić, musisz wykonać ręczne obejście, takie jak usunięcie plików przed scaleniem.

Zobacz problem z Git rebase z plikami o tej samej nazwie, ale innej wielkości

Nie jestem pewien, czy ten problem jest gorszy niż posiadanie niekonwencjonalnie nazwanego pliku w swoim projekcie na zawsze, ale warto wiedzieć, czy jest wielu użytkowników z wieloma oddziałami, które ostatecznie będą musiały zostać scalone.

jwg
źródło
Należy zawsze unikać niekonwencjonalnie nazwanych plików w średnich i dużych projektach, jeśli to możliwe, ze względu na problemy podczas programowania na wiele platform (opóźnienie w naprawie czegoś takiego do późniejszego czasu spowoduje, że problemy z poprawką będą poważniejsze). Czasami programujesz w systemie Windows, ale musisz także wykonać kompilację Linuksa, a dołączenie, które działałoby poprawnie w systemie Windows, powoduje kompilację systemu Linux.
Griffork,
3

Moim zdaniem brakuje jednego prostego sposobu. Możesz to zrobić dla pojedynczego pliku, określonego katalogu lub nawet całego repozytorium:

git rm --cached <file name or directory>
git add <file name or directory>

Jeśli chcesz wpływać również na podkatalogi, musisz użyć -rflagi:

git rm -r --cached <directory>
git add <directory>
Nils-o-mat
źródło
Naprawdę najprostszy.
ranu
Traci to całą historię pliku, ponieważ jest on ustawiony przez git jako zupełnie nowy.
Alejandro
@Alejandro To, co mówisz, jest złe. Właśnie go przetestowałem i bez problemu rozpoznałem zmianę nazwy. Podobnie jak w innych przypadkach, plik jest wyświetlany w indeksie jako usunięty / nowy, ale podczas zatwierdzania git zauważa, że ​​właśnie zmieniono jego nazwę.
Nils-o-mat