Как внести изменения в имена файлов только с учетом регистра в Git?

Я изменил имя нескольких файлов, разделив первую букву, как в Name.jpg, на Name.jpg. Git не распознает эти изменения, и мне пришлось удалить файлы и загрузить их снова. Есть ли способ, который Git может быть чувствителен к регистру при проверке изменений имен файлов? Я не внес никаких изменений в сам файл.

Ответ 1

Вы можете использовать git mv:

git mv -f OldFileNameCase newfilenamecase

Ответ 2

Git имеет параметр конфигурации, который сообщает ему, должен ли быть чувствительным к регистру или нечувствительным: core.ignorecase. Чтобы сообщить Git значение case-senstive, просто установите для этого параметра значение false:

git config core.ignorecase false

Документация

Из git config документация:

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, я смог сделать все это из пользовательского интерфейса

  1. Переименовать FILE.ext в whatever.ext
  2. Подготовьте этот файл
  3. Теперь переименуйте whatever.ext file.ext в file.ext
  4. Поместите этот файл снова

Это немного утомительно, но если вам нужно сделать это только с несколькими файлами, это довольно быстро

Ответ 4

Это то, что я сделал на OS X:

git mv File file.tmp
git mv file.tmp file

Два шага, потому что в противном случае я получил ошибку "файл существует". Возможно, это можно сделать за один шаг, добавив --cached или такой.

Ответ 5

В OSX, чтобы избежать этой проблемы и избежать других проблем с разработкой в ​​файловой системе без учета регистра, вы можете использовать Disk Utility для создания образа диска с жестким диском/образа диска.

Запустите утилиту диска, создайте новый образ диска и используйте следующие настройки (или измените по своему усмотрению, но сохраните его с учетом регистра):

Mac Disk Utility Screenshot

Обязательно сообщите 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 (изменить чувствительность к регистру для нескольких команд):

Чтобы изменить настройку дольше (например, если перед повторным изменением необходимо выполнить несколько команд):

  1. git config core.ignorecase (возвращает текущую настройку, например, false).
  2. git config core.ignorecase <<true or false>> - установите желаемую новую настройку.
  3. ... Выполнить несколько других команд...
  4. git config core.ignorecase <<false or true>> - вернуть значение конфигурации к предыдущему значению.

Ответ 7

Я попробовал следующие решения из других ответов, и они не сработали:

Если ваш репозиторий размещен удаленно (GitHub, GitLab, BitBucket), вы можете переименовать файл в источнике (GitHub.com) и принудительно переименовать файл сверху вниз.

Приведенные ниже инструкции относятся к GitHub, однако общая идея, лежащая в их основе, должна относиться к любой платформе хостинга удаленного репозитория. Помните, что тип файла, который вы пытаетесь переименовать, имеет значение, то есть, является ли он типом файла, который GitHub считает редактируемым (код, текст и т.д.) Или недоступным для редактирования (изображение, двоичный файл и т.д.) В браузере.

  1. Посетите GitHub.com
  2. Перейдите в свой репозиторий на GitHub.com и выберите ветку, в которой вы работаете
  3. Используя инструмент навигации по файлам сайта, перейдите к файлу, который вы собираетесь переименовать
  4. GitHub позволяет вам редактировать файл в браузере?
    • а.) редактируемый
      1. Нажмите значок "Редактировать этот файл" (он выглядит как карандаш)
      2. Изменить имя файла в текстовом вводе имени файла
    • б) не редактируемые
      1. Откройте кнопку "Скачать" в новой вкладке и сохраните файл на свой компьютер
      2. Переименовать загруженный файл
      3. На предыдущей вкладке на GitHub.com щелкните значок "Удалить этот файл" (он выглядит как мусорная корзина)
      4. Убедитесь, что выбран переключатель "Записать непосредственно в branchname ветки" и нажмите кнопку "Зафиксировать изменения".
      5. В том же каталоге на GitHub.com, нажмите кнопку "Загрузить файлы"
      6. Загрузите переименованный файл с вашего компьютера
  5. Убедитесь, что выбран переключатель "Записать непосредственно в branchname ветки" и нажмите кнопку "Зафиксировать изменения".
  6. Локально оформить/извлечь/вытащить ветку
  7. Готово

Ответ 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, по умолчанию он не имеет ограничения по размеру и не занимает места.

  1. В Дисковой утилите нажмите кнопку +, когда выбран контейнерный диск
  2. Выберите APFS (с учетом регистра) в формате
  3. Назовите его Sensitive
  4. прибыльНеобязательно: Создайте папку в Sensitive с именем git и ln -s /Volumes/Sensitive/git /Users/johndoe/git

Ваш диск будет в /Volumes/Sensitive/

enter image description here

Как мне зафиксировать только изменения имени файла в Git?

Ответ 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()