Ответ 1
Вы можете использовать git mv:
git mv -f OldFileNameCase newfilenamecase
Я изменил имя нескольких файлов, разделив первую букву, как в Name.jpg
, на Name.jpg
. Git не распознает эти изменения, и мне пришлось удалить файлы и загрузить их снова. Есть ли способ, который Git может быть чувствителен к регистру при проверке изменений имен файлов? Я не внес никаких изменений в сам файл.
Вы можете использовать git mv:
git mv -f OldFileNameCase newfilenamecase
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, если это необходимо, когда создается репозиторий.
Две самые популярные операционные системы, которые не имеют файловых систем без регистра, которые я знаю, являются
Используя SourceTree, я смог сделать все это из пользовательского интерфейса
FILE.ext
в whatever.ext
whatever.ext
file.ext
в file.ext
Это немного утомительно, но если вам нужно сделать это только с несколькими файлами, это довольно быстро
Это то, что я сделал на OS X:
git mv File file.tmp
git mv file.tmp file
Два шага, потому что в противном случае я получил ошибку "файл существует". Возможно, это можно сделать за один шаг, добавив --cached
или такой.
В OSX, чтобы избежать этой проблемы и избежать других проблем с разработкой в файловой системе без учета регистра, вы можете использовать Disk Utility для создания образа диска с жестким диском/образа диска.
Запустите утилиту диска, создайте новый образ диска и используйте следующие настройки (или измените по своему усмотрению, но сохраните его с учетом регистра):
Обязательно сообщите git, что теперь он находится на чувствительном к регистру FS:
git config core.ignorecase false
Иногда бывает полезно временно изменить чувствительность к регистру в 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>>
- вернуть значение конфигурации к предыдущему значению.Я попробовал следующие решения из других ответов, и они не сработали:
Если ваш репозиторий размещен удаленно (GitHub, GitLab, BitBucket), вы можете переименовать файл в источнике (GitHub.com) и принудительно переименовать файл сверху вниз.
Приведенные ниже инструкции относятся к GitHub, однако общая идея, лежащая в их основе, должна относиться к любой платформе хостинга удаленного репозитория. Помните, что тип файла, который вы пытаетесь переименовать, имеет значение, то есть, является ли он типом файла, который GitHub считает редактируемым (код, текст и т.д.) Или недоступным для редактирования (изображение, двоичный файл и т.д.) В браузере.
branchname
ветки" и нажмите кнопку "Зафиксировать изменения".branchname
ветки" и нажмите кнопку "Зафиксировать изменения".1) переименуйте файл Name.jpg
в name1.jpg
2) зафиксировать удаленный файл Name.jpg
3) переименуйте файл name1.jpg
в Name.jpg
4) добавляет добавленный файл Name.jpg
к предыдущему фиксации
git add
git commit --amend
Подобно ответу @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 также не распознает разницу в регистре, и вам придется делать это вручную и в статическом корневом каталоге.
Я использовал следующие шаги:
git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master
Для меня это простое решение
Mac OSX High Sierra 10.13 это несколько исправляет. Просто создайте виртуальный раздел APFS для ваших проектов git, по умолчанию он не имеет ограничения по размеру и не занимает места.
Sensitive
git
и ln -s /Volumes/Sensitive/git /Users/johndoe/git
Ваш диск будет в /Volumes/Sensitive/
Я несколько раз сталкивался с этой проблемой в 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
Когда вы сделали много переименования файлов, а некоторые из них - просто замена корпуса, трудно вспомнить, что есть. вручную "git перемещение", файл может быть весьма полезной. Итак, что бы я делал в процессе изменения имени файла, выполните следующие действия:
Это устранит все проблемы, не пытаясь определить, какие файлы или папки вы переименовали.
Если ничего не работает, используйте 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()