Зміна великої літери файлів у Git


473

Я намагаюся перейменувати файл, щоб він відрізнявся з великої літери, ніж раніше:

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

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

Як я можу змінити файл, щоб його було написано з великої літери? Я перебуваю на Mac OS X v10.7.3 (Lion) з Git 1.7.9.1 за допомогою оболонки Z (zsh) 4.3.15.


49
це тому, що файлова система osx зберігає регістр і за замовчуванням має нечутливий випадок. Ви можете просто продовжити в два етапи:git mv myfile foo; git mv foo MyFile
tonio

16
Зробив це, працюючи з "git mv --force myfile MyFile".
Marcello de Sales


7
Починаючи з git 2.0.1 (червень 2014 р.), git mv hello.txt Hello.txtБуде працювати на ОС нечутливих ОС. Дивіться мою відповідь нижче
VonC

Відповіді:


554

Починаючи з Git 2.0.1 (25 червня 2014 р.), Програма git mvпросто працюватиме на ОС, нечутливій до випадку .

Дивіться фіксувати baa37bf від Девіда Тернера ( dturner-tw) .

mv: дозволяють перейменувати, щоб виправити регістр на файлових системах, нечутливих до регістру

" git mv hello.txt Hello.txt" у нечутливій до випадку файловій системі завжди спрацьовує destination already existsпомилка, тому що ці два імені посилаються на один і той же шлях з точки зору файлової системи і вимагає від користувача " --force" виправлення випадку "" шляху, записаного в індексі та в наступна фіксація.

Виявіть цей випадок і дозвольте його, не вимагаючи " --force".

git mv hello.txt Hello.txtпросто працює (більше не --forceпотрібно).


Інша альтернатива:

git config --global core.ignorecase false

І перейменуйте файл безпосередньо; git додати та зробити.


2
FWIW регресував або ніколи не працював у Windows. Я перебуваю на 2.15.1. Windows.2 і все ще потрібно використовувати --force
TTimo

1
@Adowrath Чудова новина!
VonC

Чи буде це спрацьовувати і з великої літери розширень Наприклад, якщо у вас є ім'я файлу image.TXT, і я хочу перейменувати його, як image.txt
siluveru kiran kumar

@siluverukirankumar Так. У вас виникли проблеми з цією скринькою?
VonC

1
Зробив це для роботи над Windows, запустивши цю команду іgit config core.ignorecase false
Джон Таргарієн

452

Враховуючи відповідь ларок , ви можете змусити його працювати з однією командою за допомогою "--force":

 git mv --force myfile MyFile

3
Якщо ви користуєтесь файловою системою, що не враховує регістр, і ви отримуєте фатальну помилку "Недійсний аргумент", спробуйте скористатися цими кроками: stackoverflow.com/questions/3011625/…
Levi

1
Хоча це правильна відповідь на перший крок, як потім перейти до іншої гілки під Mac OS X, коли інша гілка має стару велику літери. Я отримую помилку ****: Наступні незахищені файли робочого дерева будуть перезаписані під замовлення: ****
TJChambers

1
Це не вдалося здійснити для мене в Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog

98

Іноді потрібно змінити великі літери безлічі імен файлів у нечутливій до регістру файловій системі (наприклад, в ОС X або Windows). Виконання git mvкоманд швидко стомлює. Щоб зробити щось легше, це те, що я роблю:

  1. Перенесіть усі файли за межі каталогу, скажімо, на робочий стіл.
  2. Зробіть a git add . -A видалення всіх файлів.
  3. Перейменуйте всі файли на робочому столі до правильного використання великих літер.
  4. Перенесіть усі файли назад у вихідний каталог.
  5. Зробіть a git add .. Git повинен бачити, що файли перейменовані.

Тепер ви можете взяти на себе зобов’язання, сказавши, що ви змінили написання великої літери файлу.


3
Це відбувається за рахунок всієї історії у файлах, які ви переміщуєте і виходите, правда? Я здогадуюсь, git mv --force не має цього недоліку.
ЗОБРАЖЕННЯ

12
Ні, це не вилучило би всю історію. Зауважте, що між двома додатками немає комітів.
Майкл Л Перрі

63

Назви файлів у ОС X не відрізняються від регістру (за замовчуванням). Це скоріше проблема ОС, ніж проблема Git. Якщо ви вилучите та прочитаєте файл, вам слід отримати те, що ви хочете, або перейменувати його на щось інше, а потім перейменувати його.


2
Ви також можете git cloneзробити репо в системі Linux, перейменувати файли та зробити їх саме для цієї ситуації (якщо у вас є система Linux).
gitaarik

4
Насправді, файлові системи на OS X можуть бути чутливими до регістру, ви можете налаштувати її під час встановлення. Як перевірити, чи є розділ OS X чутливим до регістру
Flimm

2
... звідси "(за замовчуванням)" у відповіді.
larsks

4
Для підтвердження ви можете git rm --cached fileorfolderвидалити файл або папку з git, не видаляючи файл або папку з файлової системи. Тоді ви можете просто додати файл або папку знову за допомогою git add fileorfolder.
kas

32

набір ignorecaseдляfalse в мерзотника конфігурації

Оскільки в початковому дописі йдеться про "Зміна великої літери файлів у Git":

Якщо ви намагаєтесь змінити великі літери імені файлу у своєму проекті, не потрібно змушувати його перейменовувати у Git. IMO, я б скоріше змінив написання великої літери на моєму IDE / редакторі та переконався, що я правильно налаштував Git, щоб вибрати перейменування.

За замовчуванням для Git-шаблону встановлено ігнорувати регістр (нечутливий регістр Git). Щоб перевірити, чи є у вас шаблон за замовчуванням, використовуйте--get для отримання значення для вказаного ключа. Використовуйте --localта --globalвказуйте Git, чи потрібно підбирати значення конфігураційного ключа з локальної конфігурації сховища Git або глобального. Наприклад, якщо ви хочете знайти свій глобальний ключ core.ignorecase:

git config --global --get core.ignorecase

Якщо це повернеться true, обов’язково встановіть його як:

git config --global core.ignorecase false

(Переконайтеся, що у вас є належні дозволи на зміну глобального.) А там у вас є; тепер ваша установка Git не ігнорує капіталізацію та трактує їх як зміни.

Як пропозиція, якщо ви працюєте над багатомовними проектами і вважаєте, що не всі проекти повинні розглядатись як Git з урахуванням регістру, просто оновіть локальний core.ignorecaseфайл.


6
І якщо git config --global --get core.ignorecaseнічого не поверне. Чи це true?? тому що після того, як я його встановив, falseвін повертає false (Windows 10)
fralbo

І, здається, працює не так, як очікувалося. Я маю на увазі настільний клієнт бачити зміни, але після фіксації / синхронізації ім'я файлу залишається незмінним в Інтернеті!
fralbo

Працював для мене (і краще для декількох файлів, ніж використання git mv). Я також припускаю, що за замовчуванням це вважається істинним (тобто це ігнорування випадку). Або це, або це відповідає політиці ОС щодо створення корпусу імен.
Джеррі

ЦЕ ТЕБЕ відповідь. Просто його використав.
Дейв Еверітт

1
Це має бути обрана відповідь
Дейв Еверітт

7

Ви можете відкрити каталог ".git", а потім відредагувати файл "config". У розділі "[core]" встановіть "ignorecase = true", і ви закінчите;)


видається, що його слід змінити на помилкове, щоб git залежав від регістру?
Джонатан

1

Щоб розмістити git mvфайли у малі регістри на macOS:

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

Це дозволить зменшити регістр усіх файлів у папці.


1

Цей фрагмент Python дозволить git mv --forceусім файлам у каталозі мати малі літери. Наприклад, foo / Bar.js стане foo / bar.js черезgit mv foo/Bar.js foo/bar.js --force .

Змініть його на свій смак. Я просто зрозумів, що поділюсь :)

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)

-1

Робочий приклад:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
Ваша відповідь не вирішує оригінального питання. Ви lowcasing розширення
TAVO

Я дивлюсь саме це, але на 500 зображень. я хочу перейменувати ./src/images/TESTIMAGE.png в ./src/images/testimage.png на git
Mohak Londhe
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.