Я изменил имя нескольких файлов, разделив первую букву, как в Name.jpg
, на Name.jpg
. Git не распознает эти изменения, и мне пришлось удалить файлы и загрузить их снова. Есть ли способ, который Git может быть чувствителен к регистру при проверке изменений имен файлов? Я не внес никаких изменений в сам файл.
Как внести изменения в имена файлов только с учетом регистра в Git?
Ответ 1
Вы можете использовать git mv:
git mv -f OldFileNameCase newfilenamecase
Ответ 2
Git имеет параметр конфигурации, который сообщает ему, должен ли быть чувствительным к регистру или нечувствительным: core.ignorecase
. Чтобы сообщить Git значение case-senstive, просто установите для этого параметра значение false
:
git config core.ignorecase false
Документация
core.ignorecase
Если значение true, этот параметр позволяет использовать различные способы обхода, чтобы Git работал лучше в файловых системах, которые не чувствительны к регистру, например FAT. Например, если список каталогов обнаруживает
makefile
, когда Git ожидаетmakefile
, Git будет считать, что это действительно тот же файл, и продолжать запоминать его какmakefile
.Значение по умолчанию - false, кроме git -clone (1) или git -init (1) будет проверять и устанавливать
core.ignorecase
true, если это необходимо, когда создается репозиторий.
Нечувствительные к регистру файловые системы
Две самые популярные операционные системы, которые не имеют файловых систем без регистра, которые я знаю, являются
- для Windows
- OS X
Ответ 3
Используя SourceTree, я смог сделать все это из пользовательского интерфейса
- Переименовать
FILE.ext
вwhatever.ext
- Подготовьте этот файл
- Теперь переименуйте
whatever.ext
file.ext
вfile.ext
- Поместите этот файл снова
Это немного утомительно, но если вам нужно сделать это только с несколькими файлами, это довольно быстро
Ответ 4
Это то, что я сделал на OS X:
git mv File file.tmp
git mv file.tmp file
Два шага, потому что в противном случае я получил ошибку "файл существует". Возможно, это можно сделать за один шаг, добавив --cached
или такой.
Ответ 5
В OSX, чтобы избежать этой проблемы и избежать других проблем с разработкой в файловой системе без учета регистра, вы можете использовать Disk Utility для создания образа диска с жестким диском/образа диска.
Запустите утилиту диска, создайте новый образ диска и используйте следующие настройки (или измените по своему усмотрению, но сохраните его с учетом регистра):
Обязательно сообщите git, что теперь он находится на чувствительном к регистру FS:
git config core.ignorecase false
Ответ 6
Иногда бывает полезно временно изменить чувствительность к регистру в 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>>
- вернуть значение конфигурации к предыдущему значению.
Ответ 7
Я попробовал следующие решения из других ответов, и они не сработали:
Если ваш репозиторий размещен удаленно (GitHub, GitLab, BitBucket), вы можете переименовать файл в источнике (GitHub.com) и принудительно переименовать файл сверху вниз.
Приведенные ниже инструкции относятся к GitHub, однако общая идея, лежащая в их основе, должна относиться к любой платформе хостинга удаленного репозитория. Помните, что тип файла, который вы пытаетесь переименовать, имеет значение, то есть, является ли он типом файла, который GitHub считает редактируемым (код, текст и т.д.) Или недоступным для редактирования (изображение, двоичный файл и т.д.) В браузере.
- Посетите GitHub.com
- Перейдите в свой репозиторий на GitHub.com и выберите ветку, в которой вы работаете
- Используя инструмент навигации по файлам сайта, перейдите к файлу, который вы собираетесь переименовать
- GitHub позволяет вам редактировать файл в браузере?
- а.) редактируемый
- Нажмите значок "Редактировать этот файл" (он выглядит как карандаш)
- Изменить имя файла в текстовом вводе имени файла
- б) не редактируемые
- Откройте кнопку "Скачать" в новой вкладке и сохраните файл на свой компьютер
- Переименовать загруженный файл
- На предыдущей вкладке на GitHub.com щелкните значок "Удалить этот файл" (он выглядит как мусорная корзина)
- Убедитесь, что выбран переключатель "Записать непосредственно в
branchname
ветки" и нажмите кнопку "Зафиксировать изменения". - В том же каталоге на GitHub.com, нажмите кнопку "Загрузить файлы"
- Загрузите переименованный файл с вашего компьютера
- а.) редактируемый
- Убедитесь, что выбран переключатель "Записать непосредственно в
branchname
ветки" и нажмите кнопку "Зафиксировать изменения". - Локально оформить/извлечь/вытащить ветку
- Готово
Ответ 8
1) переименуйте файл Name.jpg
в name1.jpg
2) зафиксировать удаленный файл Name.jpg
3) переименуйте файл name1.jpg
в Name.jpg
4) добавляет добавленный файл Name.jpg
к предыдущему фиксации
git add
git commit --amend
Ответ 9
Подобно ответу @Sijmen, это то, что у меня сработало в OSX при переименовании директории (вдохновлено этим ответом из другого поста):
git mv CSS CSS2
git mv CSS2 css
Простое выполнение git mv CSS css
выдало ошибку неверного аргумента: fatal: renaming '/static/CSS' failed: Invalid argument
возможно, потому что файловая система OSX нечувствительна к регистру
PS Кстати, если вы используете Django, collectstatic также не распознает разницу в регистре, и вам придется делать это вручную и в статическом корневом каталоге.
Ответ 10
Я использовал следующие шаги:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
Для меня это простое решение
Ответ 11
Mac OSX High Sierra 10.13 это несколько исправляет. Просто создайте виртуальный раздел APFS для ваших проектов git, по умолчанию он не имеет ограничения по размеру и не занимает места.
- В Дисковой утилите нажмите кнопку +, когда выбран контейнерный диск
- Выберите APFS (с учетом регистра) в формате
- Назовите его
Sensitive
- прибыльНеобязательно: Создайте папку в Sensitive с именем
git
иln -s /Volumes/Sensitive/git /Users/johndoe/git
Ваш диск будет в /Volumes/Sensitive/
Ответ 12
Я несколько раз сталкивался с этой проблемой в 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!!'
- Прицепные
- Это вызовет конфликт, который заставит вас объединить конфликт - потому что ваше изменение удалило его, но другое изменение было переименовано (следовательно, проблема).
- Примите ваше изменение, которое является "удалением"
-
git rebase --continue
- Теперь оставьте свое обходное решение
git rebase -i HEAD~2
иdrop
TEMP COMMIT!!
- Подтвердите, что файл теперь называется
Foobar.java
Ответ 13
Когда вы сделали много переименования файлов, а некоторые из них - просто замена корпуса, трудно вспомнить, что есть. вручную "git перемещение", файл может быть весьма полезной. Итак, что бы я делал в процессе изменения имени файла, выполните следующие действия:
- удалите все файлы и папки без git в другую папку/репозиторий.
- фиксировать текущую пустую папку git (это будет отображаться по мере удаления всех файлов.)
- добавить все файлы обратно в исходную папку git/репозиторий.
- фиксировать текущую непустую папку git.
Это устранит все проблемы, не пытаясь определить, какие файлы или папки вы переименовали.
Ответ 14
Если ничего не работает, используйте git rm filename, чтобы удалить файл с диска и добавить его обратно.
Ответ 15
Я взял @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()