Змінити регістр файлу в Windows?


209

У нашій кодовій базі даних, що контролюється git, є кілька файлів, які я хотів би перейменувати. Зокрема, я просто хочу змінити регістр файлу, щоб він sourceCode.javaстав SourceCode.java, наприклад. Привід: я перебуваю у вікні Windows, і файлова система вважає, що це одне ім’я файлу.

Як я можу змусити Windows та Git розпізнати цю зміну та перевірити її?


3
Оскільки Git 2.0.1+ (червень 2014 року), простий git mvповинен працювати ( stackoverflow.com/a/24979063/6309 ). Навіть у Windows.
VonC

Відповіді:


337

Подивіться тут, щоб дізнатися більше, як це зробити:

Як зробити зміни в ігноруванні git у випадку?

Або:

git mv -f name.java Name.java

8
З іншого боку, це не працює у файловій системі FAT. Я наношу якийсь код проекту на палець, і зміни корпусу - справжня біль.
асм

1
Це не спрацювало для мене в системі NTFS та Windows 10
Roboblob

1
Це, безумовно, правильний спосіб зробити це, але, якщо вам потрібно перейменувати багато файлів, це може бути нудно. Якщо ви вже якось перейменовані у файлову систему, і ви просто хочете здійснити ці зміни, ви можете перейменувати якусь батьківську папку, зробити git addнову перейменовану папку. , git addвін знову, а потім здійснити.
Okonomiyaki3000

Працює над NTFS та Windows 7.
Ганс Голдман

Чи можливо це зробити оптом? наприклад, з повноваженнями,Get-ChildItem '.' | Rename-Item {$_.Name.ToLowerCase()}
вбийте

49

Якщо ви працюєте у файловій системі FAT, ваш єдиний вибір - це перейменування в два етапи:

  1. Перейменувати sourceCode.javaнаanything.you.like
  2. Перейменувати anything.you.likeнаSourceCode.java

Ще в ті часи, коли ми використовували Perforce, у нас була саме ця проблема, і це було єдине рішення, яке ми могли придумати.


13
Лише зауваження для інших: Не потрібно здійснювати між ними, але потрібно додати до індексу для git, щоб помітити зміни
arberg

29

Наступні кроки дозволили мені змінити корпус у Windows:

  • Додати ignorecase = falseдо [core]в .git/config;
  • Перемістіть файли, які ви хочете перейменувати, із каталогу проектів;
  • Додайте делетів до індексу;
  • Перенесіть усі файли назад у їх початкове місце та змініть регістр файлів та / або каталогів;
  • Додайте до індексу всі "нові" файли;
  • Видалити ignorecase = falseдодано на першому кроці.

Таким чином, у вас є одна фіксація, яка містить перейменування, і це дозволяє легко змінювати, наприклад, весь каталог.


5
Зробіть це для глобальних та локальних налаштувань ванни: $ gti config --global core.ignorecase false $ gti config core.ignorecase false
Роман Іванов

6

Будь обережний. Це може призвести до змін, які неможливо об'єднати. Git плутається під час об’єднання в Windows, оскільки він не може вирішити, чи є старе ім'я верхнього регістру та нове мале ім'я одне і те ж файл чи ні (для Git вони не є, але для файлової системи вони є). Для злиття вам потрібно виконати певне вручну, як видалити файли перед об'єднанням.

Див. Проблему з відновленням Git з файлами з однойменною назвою, але інший регістр

Я не впевнений, чи ця проблема гірша, ніж наявність у вашому проекті нетрадиційно названого файлу назавжди і назавжди, але варто знати про те, чи є багато користувачів з великою кількістю гілок, які потрібно буде з часом об'єднати.


Необхідно уникати нетрадиційно названих файлів у середніх та великих проектах, якщо це можливо, через проблеми при розробці для декількох платформ (затягування на виправлення чогось подібного до пізніше зробить проблеми з виправленням більш серйозними). Іноді ви розробляєте для Windows, але також потрібно зробити збірку Linux, і включення, яке б справно працювало на Windows, спричиняє зрив збірки на Linux.
Гриффорк

3

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

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

Якщо ви хочете вплинути також на підкаталоги, вам потрібно використовувати -rпрапор:

git rm -r --cached <directory>
git add <directory>

Воістину найпростіший.
ranu

Це втрачає всю історію файлу, оскільки його встановлює git як абсолютно новий.
Алехандро

@Alejandro Те, що ви говорите, неправильно. Я просто перевірив це і git без проблем визнав перейменування. Як і в інших випадках, файл відображається як видалений / новий в індексі, але, виконуючи це, git помічає, що він щойно перейменований.
Nils-o-mat

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