Чи git не відрізняється від регістру?


96

У першому зобов'язанні з мого часткового виклику _Electronicsце було написано, починаючи з великих літер, потім я змінив його на _electronics.

Git під cygwin ігнорував випадок після введення нового імені, тому я змінив ім'я вручну в цільовому репо.

Зараз він іноді змінює комітований _electronicsчастковий на _Electronics.

Що я зробив неправильно?


9
В якій ОС ви працюєте?
Кіт Томпсон,

10
Яку файлову систему ви використовуєте?
Ендрю Маршалл

Windows з cygwin. Мій сервер працює під управлінням Ubuntu Linux. Не знаю файлової системи, я думаю, ext3 або ext2 - мій провайдер налаштував мінімальну інсталяцію.
JAkk

Ви не раді, що Windows вирішила не чути регістр?
Каскабель

4
Windows не враховує регістр, але іноді (частіше сьогодні) зберігає регістр .
Арафангіон

Відповіді:


73

Це буде сприйматися як 2 різні речі, але спричинить проблеми у системі, що не враховує регістр. У цьому випадку переконайтеся, що ви заповнюєте вкладки будь-якими шляхами чи іменами файлів. Далі, щоб змінити назву чогось у кожному випадку, зробіть так:

mv file.txt temp.txt
git add -A
git commit -m "renaming..."
mv temp.txt File.txt
git add -A
git commit --amend -m "Renamed file.txt to File.txt"

Це явний спосіб внесення змін, їх фіксація, а згортання комітів. Коротший спосіб зробити це - маніпулювати індексом та робочою папкою все в одному:

git mv file.txt temp.txt
git mv temp.txt File.txt
git commit -m "Renamed file.txt to File.txt"

Це також пов'язано з налаштуванням назв каталогів: git mv і змінювати лише регістр каталогу


виглядає, що це було правильно (за винятком того, що я переходив з великої літери на малі)
JAkk

Я зазирнув у нього, поки я звик до cygwin, просто зручніше використовувати cygwin - дякую за підказку
JAkk

Ви можете просто зробити git mv file.txt File.txt. Не впевнений, чи це нова функція git.
Філ

107

Це буде залежати від core.ignorecaseзначення конфігурації, яке встановлено у помилковій у регістрі файлових системах, що відрізняється від регістру, і true у msysgit в Windows.

core.ignorecase

Якщо значення true, цей параметр дозволяє різним обхідним шляхам дозволити git працювати краще у файлових системах, які не чутливі до регістру, наприклад FAT. Наприклад, якщо список каталогів знаходить "makefile", коли git очікує "Makefile", git буде вважати, що це справді той самий файл, і продовжуватиме пам'ятати його як "Makefile".

За замовчуванням значення false, за винятком того, що git-clone (1) або git-init (1) перевірятимуть і встановлюватимуть core.ignorecase true, якщо це доречно при створенні сховища.

Більш детально у цій відповіді на Зміна великих літер імен файлів у Git .


79
Це правильна відповідь imo. Для майбутнього мене використовуйте git config --unset-all core.ignorecase && git config --system core.ignorecase falseз sudo.
Знаркус

2
так само Джеймсу, @Znarkus визначив вирішення цієї проблеми в OS X, дякую!
Крейг Накамото,

1
@Znarkus працює і в Windows. Гарний.
орладе

9
@ Znarkus, проблема з цим на OSX полягає в тому, що коли ви перейменовуєте файл через пошук і лише змінюєте регістр, git побачить перейменовану версію як абсолютно новий файл, але він не генерує відповідного "видалення" дія для старої версії файлу. Отже, якщо ви скористаєтеся і натисніть на github, github матиме і старовинне ім'я, і ​​недавно названий файл, але ваша локальна система просто матиме новий файл, і git не стане мудрішим.
ivanreese

2
@spiralganglion Для веб-розробника на OSX я дійсно можу порекомендувати створити розділ, що відрізняється від регістру, а потім встановити його як ваш www-каталог.
Знаркус

23

Це набагато простіше:

git mv Electronics electronics -f
git commit -m "That was easy!"

1
Ви пробували це у файловій системі, нечутливій до регістру?
Едвард Томсон

1
Спочатку я читав це як оригінальний плакат, намагаючись виконати перейменування папки, що змінюється регістром, а не файл. Тепер, коли я перечитав це, незрозуміло. Дійсно, mv -fбуде працювати для файлу.
Едвард Томсон


0

У моєму випадку у мене було дві папки testsі Testsякі показали , як дві окремі папки в Github , але однією Testsпапки в Windows. Моєю метою було поєднати їх обох у tests.

Я використав такий підхід:

  1. Створіть нову папку temp
  2. Скопіюйте весь вміст з Testsдоtemp
  3. Видалити Tests
  4. виконати git rm Tests -r
  5. Перейменувати tempнаtests

0

Я намагався вирішити проблему, і вона була успішною в Windows10

Припустимо, на тесті бітбукета TEST і тесті є дві папки, але коли я клоную репо на диску, він створює лише TEST, і я хочу зберегти тест як єдину папку в git, яка містить усі файли.

Мені потрібно буде виконати наступні команди в командному рядку git mv TEST test1 -f git mv text1 test -f git commit -m "перейменування ..." git push

Тепер ви побачите, що ієрархія папок виправлена ​​на bitbucket.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.