Я изменил имена нескольких файлов, убрав первую букву с заглавной буквы, как в Name.jpg
на name.jpg
. Git не распознает эти изменения, и мне пришлось удалить файлы и загрузить их снова. Есть ли способ, которым Git может быть чувствительным к регистру при проверке изменений в именах файлов? Я не вносил никаких изменений в сам файл.
Как в Git зафиксировать изменения имен файлов с учетом регистра только с учетом регистра?
Ответы (16)
Если вы просто переименовываете файл, а не папку, вы можете просто использовать git mv:
git mv -f yOuRfIlEnAmE yourfilename
(Начиная с изменения в Git 2.0.1, флаг -f
в приведенном выше заклинании лишнее, но это было необходимо в старых версиях Git.)
fatal: renaming '...' failed: File exists
. Я делаю это на виртуальной машине Ubuntu, которая работает в OSX
- person HEKTO; 28.09.2016
failed: Invalid argument
) с полным путем к файлу и без него. странный.
- person Damon; 24.02.2018
git mv
. Вам нужно будет сделать каждый файл в каталоге, если вы пытаетесь изменить регистр имени каталога.
- person Sam Soffes; 15.09.2018
-f
с последней версией git (2.18), иначе вы можете получить fatal: destination exists
ошибку.
- person DeepSpace101; 15.02.2019
git mv
для каждого файла в каталоге.
- person Chris Charabaruk; 18.11.2020
В Git есть параметр конфигурации, который сообщает ему, следует ли ожидать файловую систему с учетом регистра или нечувствительность к регистру: core.ignorecase
. Чтобы Git учитывал регистр, просто установите для этого параметра значение false
. (Будьте осторожны, если вы уже отправили файлы, вы должны сначала переместить их, учитывая другие ответы).
git config core.ignorecase false
Обратите внимание, что установка для этого параметра значения false в файловой системе без учета регистра, как правило, является плохой идеей. Это приведет к странным ошибкам. Например, переименование файла с изменением только регистра букв приведет к тому, что git сообщит о ложных конфликтах или создаст дубликаты файлов (из комментария Марка Амери).
Документация
core.ignorecase
Если true, этот параметр включает различные обходные пути, позволяющие git лучше работать с файловыми системами, которые не чувствительны к регистру, например FAT. Например, если список каталогов находит
makefile
, когда git ожидаетMakefile
, git предположит, что это действительно тот же файл, и продолжит запоминать его какMakefile
.По умолчанию установлено значение false, за исключением git-clone (1) или git-init (1) проверит и установит
core.ignorecase
true при создании репозитория.
Файловые системы без учета регистра
Две самые популярные операционные системы с файловыми системами без учета регистра, о которых я знаю:
- Окна
- OS X
false
в файловой системе без учета регистра является плохой идеей. Это не обязательно очевидно. Например, я просто попробовал это на своем Mac, думая, что это решит мои проблемы, а затем переименовал файл с productPageCtrl.js
в ProductPageCtrl.js
. git status
увидел новый файл с именем ProductPageCtrl.js
, но не подумал, что productPageCtrl.js
был удален. Когда я добавил новые файлы, зафиксировал их и отправил в GitHub, репозиторий GitHub теперь содержал оба файла, хотя в моем (предположительно обновленном) локальном репозитории был только один.
- person Mark Amery; 09.02.2015
git mv
, чтобы переместить файл и посмотреть, как git управляет им. Если вы переместите файл без git, git ничего не сможет сделать, поскольку файловая система не сообщает git правду. Это проблема ntfs / fat / hfs и т.п., а не git / linux.
- person ohcibi; 03.06.2016
git config core.ignorecase false
бесполезен на Mac. Мне нужно обернуть git push / pull / checkout / status другим инструментом, чтобы обойти эту ошибку git.
- person bronze man; 11.11.2016
FILE_FLAG_POSIX_SEMANTICS
методу, чтобы проверить, существует ли файл, используя его имя с учетом регистра. Файл НЕ будет найден, если установлен этот флаг. Также для поиска файла вы можете использовать FileFirstFileEx
с FIND_FIRST_EX_CASE_SENSITIVE
. Ссылки: mathematica.stackexchange.com/questions/97734 / msdn. microsoft.com/en-us/library/windows/desktop/
- person Jeremy; 28.09.2017
$>git config core.ignorecase
даст вам текущую настройку. В моем случае это было true
. Следовательно, изменения регистра расширения имени файла не были идентифицированы. Запуск $> git config core.ignorecase false
сделал свое дело и сработал как шарм. Обратите внимание, что мне пришлось перезапустить Visual Studio 2017.
- person Dinesh Halpage; 23.01.2020
git config --global core.ignorecase false
- person Abel Wenning; 04.02.2021
ignorecase
на false
в файловой системе без учета регистра нарушает работу и не помогает при все, мне кажется, что этот ответ просто бесполезен ни при каких обстоятельствах. [1/2]
- person Mark Amery; 12.05.2021
Используя SourceTree, я смог сделать все это из пользовательского интерфейса.
- Переименовать
FILE.ext
вwhatever.ext
- Подготовить этот файл
- Теперь переименуйте
whatever.ext
вfile.ext
- Снова обработайте этот файл
Это немного утомительно, но если вам нужно сделать это только с несколькими файлами, это довольно быстро
Вот что я сделал в OS X:
git mv File file.tmp
git mv file.tmp file
Два шага, иначе я получу ошибку «файл существует». Возможно, это можно сделать за один шаг, добавив --cached
или что-то подобное.
-f
(сила) - это флаг, который вы ищете
- person rperryng; 10.07.2015
-f
не помогает, если базовая FS не чувствительна к регистру. Однако у меня сработало двухэтапное решение.
- person HEKTO; 28.09.2016
-f
работало! Спасибо за совет
- person caesarsol; 15.12.2016
-f
.
- person nich; 03.10.2017
git -c "core.ignorecase=false" add .
будет рассматривать файлы, регистр которых был изменен для фиксации.
- person nietonfir; 12.11.2017
Иногда полезно временно изменить чувствительность к регистру в Git.
Метод № 1. Изменение чувствительности к регистру для одной команды:
git -c core.ignorecase=true checkout mybranch
, чтобы отключить чувствительность к регистру для одной checkout
команды. Или в более общем плане: git -c core.ignorecase=
<<true or false>>
<<command>>
. (Благодарим VonC за предложение этого в комментариях.)
Метод № 2. Изменение чувствительности к регистру для нескольких команд:
Чтобы изменить настройку на более длительный срок (например, если необходимо выполнить несколько команд, прежде чем вернуть ее обратно):
git config core.ignorecase
(возвращает текущую настройку, например,false
).git config core.ignorecase
<<true or false>>
- установите желаемый новый параметр.- ... Выполнить несколько других команд ...
git config core.ignorecase
<<false or true>>
- вернуть значение конфигурации к предыдущему значению.
git -c core.ignorecase=<true or false> checkout <<branch>>
? Ничего не сбрасывать после.
- person VonC; 10.07.2018
Я использовал следующие шаги:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
Для меня это простое решение
В OSX, чтобы избежать этой проблемы и избежать других проблем с разработкой в файловой системе без учета регистра, вы можете использовать Дисковую утилиту для создания чувствительного виртуального диска / образа диска.
Запустите дисковую утилиту, создайте новый образ диска и используйте следующие настройки (или измените их по своему усмотрению, но с учетом регистра):
Обязательно сообщите git, что теперь он находится в чувствительной к регистру FS:
git config core.ignorecase false
Мы можем использовать команду git mv. Пример ниже, если мы переименовали файл abcDEF.js в abcdef.js, мы можем запустить следующую команду из терминала
git mv -f .\abcDEF.js .\abcdef.js
Подобно ответу @Sijmen, это то, что сработало для меня в OSX при переименовании каталога (вдохновлено этим ответ из другого сообщения):
git mv CSS CSS2
git mv CSS2 css
Простое выполнение git mv CSS css
дало ошибку неверного аргумента: fatal: renaming '/static/CSS' failed: Invalid argument
возможно, потому что файловая система OSX без учета регистра
p.s Кстати, если вы используете Django, collectstatic также не распознает разницу в регистре, и вам также придется делать это вручную в статическом корневом каталоге
переименовать файл
Name.jpg
вname1.jpg
зафиксировать удаленный файл
Name.jpg
переименовать файл
name1.jpg
вname.jpg
изменить добавленный файл
name.jpg
на предыдущую фиксациюgit add name.jpg git commit --amend
fatal: bad source, source=name1.jpg, destination=name.jpg
на шаге 3. Есть ли у вас предложения? Спасибо
- person Anthony Kong; 30.03.2017
git add
.
- person Alex78191; 03.06.2017
Я попробовал следующие решения из других ответов, и они не сработали:
Если ваш репозиторий размещен удаленно (GitHub, GitLab, BitBucket), вы можете переименовать файл в источнике (GitHub.com) и принудительно переименовать файл сверху вниз.
Приведенные ниже инструкции относятся к GitHub, однако общая идея, лежащая в основе них, должна применяться к любой платформе удаленного хостинга репозитория. Имейте в виду, имеет значение тип файла, который вы пытаетесь переименовать, то есть тип файла, который GitHub считает редактируемым (код, текст и т. Д.) Или нередактируемым (изображение, двоичный и т. Д.) В браузере.
- Посетите GitHub.com
- Перейдите в свой репозиторий на GitHub.com и выберите ветку, в которой вы работаете.
- Используя инструмент навигации по файлам на сайте, перейдите к файлу, который вы собираетесь переименовать.
- Does GitHub allow you to edit the file within the browser?
- a.) Editable
- Click the "Edit this file" icon (it looks like a pencil)
- Измените имя файла в текстовом вводе имени файла
- b.) Uneditable
- Open the "Download" button in a new tab and save the file to your computer
- Переименуйте загруженный файл
- На предыдущей вкладке на GitHub.com щелкните значок «Удалить этот файл» (он выглядит как мусорная корзина)
- Убедитесь, что установлен переключатель «Зафиксировать непосредственно в ветке
branchname
», и нажмите кнопку «Зафиксировать изменения». - В том же каталоге на GitHub.com нажмите кнопку «Загрузить файлы».
- Загрузите переименованный файл со своего компьютера
- a.) Editable
- Убедитесь, что установлен переключатель «Зафиксировать непосредственно в ветке
branchname
», и нажмите кнопку «Зафиксировать изменения». - Локально оформить / получить / вытащить ветку
- Выполнено
Mac OSX High Sierra 10.13 несколько исправляет это. Просто создайте виртуальный раздел APFS для своих проектов git, по умолчанию он не имеет ограничений по размеру и не занимает места.
- В Дисковой утилите нажмите кнопку +, когда выбран диск-контейнер.
- Выберите APFS (с учетом регистра) под форматом
- Назовите это
Sensitive
- Выгода
- Необязательно: создайте в Sensitive папку с именем
git
иln -s /Volumes/Sensitive/git /Users/johndoe/git
.
Ваш диск будет через /Volumes/Sensitive/
Как сделать фиксацию только с учетом регистра изменение имени файла в Git?
Когда вы переименовали много файлов, и некоторые из них просто поменяли регистр, трудно вспомнить, что есть что. вручную "git перемещение" файла может потребовать некоторой работы. Итак, что бы я делал во время задач по изменению имени файла:
- удалите все файлы и папки, отличные от git, в другую папку / репозиторий.
- зафиксировать текущую пустую папку git (это будет отображаться, когда все файлы удалены.)
- добавьте все файлы обратно в исходную папку / репозиторий git.
- зафиксировать текущую непустую папку git.
Это устранит все проблемы с делом, не пытаясь выяснить, какие файлы или папки вы переименовали.
git commmit --amend
в пункте 4? В противном случае произойдет дополнительная фиксация с удалением всех файлов. Или вы можете использовать git rebase -i
с сквошем.
- person Alex78191; 03.06.2017
Я несколько раз сталкивался с этой проблемой на MacOS. Git чувствителен к регистру, но Mac сохраняет только регистр.
Кто-то фиксирует файл: Foobar.java
и через несколько дней решает переименовать его в FooBar.java
. Когда вы вытаскиваете последний код, он терпит неудачу с The following untracked working tree files would be overwritten by checkout...
Единственный надежный способ, который я видел, это исправить:
git rm Foobar.java
- Зафиксируйте его с сообщением, которое нельзя пропустить
git commit -m 'TEMP COMMIT!!'
- Тянуть
- This will pop up a conflict forcing you to merge the conflict - because your change deleted it, but the other change renamed (hence the problem) it
- Accept your change which is the 'deletion'
git rebase --continue
- Теперь оставьте свой обходной путь
git rebase -i HEAD~2
иdrop
TEMP COMMIT!!
- Подтвердите, что файл теперь называется
FooBar.java
git rebase --continue
без выполняющейся перебазировки просто приводит к ошибке Нет перебазирования?, а на шаге 4.2 перебазирование не выполняется, поэтому выполнение этой команды также не имеет смысла.
- person Mark Amery; 03.05.2021
Если ничего не помогло, используйте команду git rm filename, чтобы удалить файл с диска и добавить его обратно.
Я взял ответ @CBarr и написал скрипт Python 3 для этого со списком файлов:
#!/usr/bin/env python3
# -*- coding: UTF-8 -*-
import os
import shlex
import subprocess
def run_command(absolute_path, command_name):
print( "Running", command_name, absolute_path )
command = shlex.split( command_name )
command_line_interface = subprocess.Popen(
command, stdout=subprocess.PIPE, cwd=absolute_path )
output = command_line_interface.communicate()[0]
print( output )
if command_line_interface.returncode != 0:
raise RuntimeError( "A process exited with the error '%s'..." % (
command_line_interface.returncode ) )
def main():
FILENAMES_MAPPING = \
[
(r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
(r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
(r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
]
for absolute_path, oldname, newname in FILENAMES_MAPPING:
run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
run_command( absolute_path, "git add '%s1'" % ( newname ) )
run_command( absolute_path,
"git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
newname ) )
run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
run_command( absolute_path, "git add '%s'" % ( newname ) )
run_command( absolute_path, "git commit --amend --no-edit" )
if __name__ == "__main__":
main()
git mv
. - person VonC   schedule 27.03.2015git
рабочих копий. Я должен признать, что избавляет меня от рассудка ... - person Per Lundberg   schedule 09.02.2017