Uwaga! Trwają prace nad nową wersją serwisu. Mogą występować przejściowe problemy z jego funkcjonowaniem. Przepraszam za niedogodności!
⛔ Potrzebujesz wsparcia? Oceny CV? A może Code Review? ✅ Dołącz do Discorda!
To problem który może zaatakować w najmniej spodziewanym momencie, na przykład podczas rekrutacji! Czy nazwy plików lub katalogów zmieniasz za pomocą zwykłego „Rename”? Zła wiadomość jest taka, że Git może nie zauważyć tych zmian, a Ty skończysz z masą błędów. Dobra wiadomość jednak też jest: możemy temu zapobiec!
Systemy plików mają różne domyślne ustawienia wrażliwości na wielkość liter (case sensitivity). Przykładowo system plików na Linuksie jest wrażliwy, a na Mac OS-ie i Windowsie nie.
Wrażliwość: Helper.js i helper.js to dla systemu dwa różne pliki.
Niewrażliwość: Helper.js, helper.js, a nawet HeLpEr.js to dla systemu te same pliki.
Pomyślisz: co Cię to obchodzi, gdy pracujesz tylko na jednym systemie? Oto parę możliwych problemów:
Poniżej widzisz przykład: pierwotnie katalog z fontami nazywał się Overpass. Autor projektu pracujący na Windowsie zmienił pierwszą literę nazwy katalogu na małą, zaktualizował ścieżki importu i pushował zmiany na repo. W podpiętych GitHub Pages wszystkie importy fontów się wysypały, ponieważ Git nie zarejestrował zmiany nazwy katalogu, a tym samym nie została ona uwzględniona w repozytorium zdalnym.
Git został pierwotnie zbudowany jako system kontroli wersji jądra Linuksa, więc rozróżnia wielkość liter. Potrafi jednak wykryć domyślne ustawienia wrażliwości na wielkość liter w systemie i przechowuje tę informację w opcji core.ignoreCase repozytorium. Gdy opcja ta jest ustawiona na true (tak stanie się np. na Windowsie), Git nie wykrywa zmiany nazwy pliku lub katalogu po zmianie wielkości liter.
Jak możemy zapisać w historii Gita coś, czego on „nie zauważył”?
Aby zmienić wielkość liter w nazwie jednego pliku, użyj polecenia git mv:
git mv Helper.js helper.js
Jak widzisz, zmiana nazwy z Helper.js na helper.js została zarejestrowana (R oznacza Renamed).
Załóżmy, że mamy teraz katalog Overpass z przykładu z fontami.
Teoretycznie – zgodnie z dokumentacją – zmiany nazwy katalogu na małe litery dokonasz komendą:
git mv Overpass overpass
Może to jednak nie zadziałać, a w konsoli zobaczysz błędy, na przykład:
W przypadku pierwszego błędu nie wiemy nawet, dlaczego proces się nie powiódł. Możesz wówczas spróbować obejść problemy z rozróżnianiem wielkości liter, nadając katalogowi nazwę tymczasową. Uruchom po kolei komendy:
git mv Styles tmp git mv tmp styles
Słowo tmp to nazwa tymczasowa – nie ma znaczenia w kontekście komendy, możesz wybrać inną.
W przypadku drugiego błędu sprawdź, czy katalog został dodany do Gita. Zweryfikuj też, czy używasz prawidłowej ścieżki. Obie te rzeczy sprawdzisz komendą:
git ls-files
W ten sposób zobaczysz pliki i katalogi zarządzane przez Gita oraz ścieżki do nich prowadzące.
U mnie ten błąd wyświetlił się po polsku: proces nie może uzyskać dostępu do pliku ponieważ jest on używany przez inny proces. W przypadku tego błędu pozamykaj wszystkie procesy, które mogą korzystać z katalogu Twojego projektu. Problem może sprawiać nawet otwarty eksplorator plików (menedżer plików).
Czwarty błąd mówi o tym, że albo Git jest w trakcie jakiegoś procesu, albo jakiś proces nie zakończył się prawidłowo (ang. gracefully) – co jest prawdopodobne, jeśli od dłuższej chwili walczymy komendami.
Plik index.lock tworzony jest tymczasowo podczas każdego procesu w Gicie. Zabezpiecza on nas przed tym, by wiele procesów nie zmieniało tych samych elementów repozytorium w jednym czasie.
Jeżeli zdarzy się, że plik index.lock nie został usunięty po przeprowadzeniu procesu, możemy usunąć go ręcznie:
rm .git/index.lock
Jeżeli chcesz zmienić wielkie litery na małe w nazwach kilku plików jednocześnie, to w Visual Studio Code w terminalu (powershell) zadziała pętla:
foreach ($f in (git ls-files -- '*.js')) { $newName = $f.ToLower() git mv -k $f $newName }
Zwróć uwagę, że akurat ta pętla dotyczy wszystkich plików z rozszerzeniem .js zarejestrowanych przez Gita. Jeżeli chodzi Ci o pliki w konkretnym podkatalogu, dodaj odpowiednią ścieżkę do komendy, na przykład:
foreach ($f in (git ls-files -- './helpers/*.js')) { $newName = $f.ToLower() git mv -k $f $newName }
Gdyby komenda ta rzucała błędami, zerknij powyżej do błędów omówionych w przypadku zmiany nazwy katalogu – część z nich może się powielać.
Możesz napotkać źródła, które zalecają wyłączenie (czyli ustawienie na false) opcji core.ignoreCase dla repozytorium lub nawet globalnie. Spowoduje to, że Git wykryje zmiany wielkości liter na systemach plików niewrażliwych na wielkość liter, ale niestety może doprowadzić do niepożądanych zachowań, jak ostrzega dokumentacja Gita:
Git relies on the proper configuration of this variable for your operating and file system. Modifying this value may result in unexpected behavior.
Więcej o niepożądanych działaniach przeczytasz na Slack Overflow.
Jeśli używasz Windowsa albo MacOS-a, pozostaje pamiętać, by po decyzji dotyczącej zmiany wielkości liter w nazwie pliku lub katalogu, zadbać o to, by Git „dowiedział się” o modyfikacji nazwy. Teraz już wiesz, jak to zrobić i jak poradzić sobie z błędami!
Udostępnij ten artykuł:
Potrzebujesz cotygodniowej dawki motywacji?
Zapisz się i zgarnij za darmo e-book o wartości 39 zł!
PS. Zazwyczaj rozsyłam 1-2 wiadomości na tydzień. Nikomu nie będę udostępniał Twojego adresu email.
Chcesz zostać (lepszym) programistą i lepiej zarabiać?
🚀 Porozmawiajmy o nauce programowania, poszukiwaniu pracy, o rozwoju kariery lub przyszłości branży IT!
Umów się na ✅ bezpłatną i niezobowiązującą rozmowę ze mną.
Chętnie porozmawiam o Twojej przyszłości i pomogę Ci osiągnąć Twoje cele! 🎯