массовое переименование файлов в строчные в git - PullRequest
4 голосов
/ 28 сентября 2011

У меня есть целое git-репо, где я хочу переименовать все файлы и директории в нижний регистр.

Работая на Win7, я добавил igorecase = false в gitconfig и переименовал несколько файлов через eclipse. Результирующий коммит теперь имеет два файла, один со строчными буквами и один с прописными и строчными буквами.

Удаление «нежелательного» файла приведет к сбросу истории версий, которая не идеальна ...

Итак, каков потенциальный метод для достижения моей цели - вариант «думать только» - это пакет / оболочка (не знаю, как там выполнять рекурсивные операции с каталогами, но, надеюсь, кто-то будет добрым;))

Любые советы, полученные с огромной благодарностью и объятиями.

Ответы [ 3 ]

3 голосов
/ 15 ноября 2012

Когда мне нужно было изменить регистр файлов в git-репо, я просто использую два переименования:

git mv aNiceClass.inc aniceclass.inc_
git mv aniceclass.inc_ aniceclass.inc

Git затем с радостью записывает изменение имени:

# Changes to be committed:
#
#   renamed:    aNiceClass.inc -> aniceclass.inc

Попыткапрямое переименование выдает эту ошибку:

fatal: destination exists, source=aNiceClass.inc, destination=aniceclass.inc

Вот пример сценария оболочки, который будет в нижнем регистре имен любого файла ниже текущего каталога, который имеет расширение inc или txt:

#! /bin/bash

find -E . -regex '.*(inc|txt)$' | while read f
do
   lc=$(echo ${f} | tr A-Z a-z)
   git mv $f ${lc}_
   git mv ${lc}_ $lc
done

Это также можно растереть в уродливой маленькой строчке:

find -E . -regex '.*(inc|txt)$' | while read f; do lc=$(echo ${f} | tr A-Z a-z); git mv $f ${lc}_; git mv ${lc}_ $lc; done
2 голосов
/ 06 декабря 2016

Поскольку в заголовке или тегах ничего не говорится об ОС, это работает в macOS. Это делает git mv в нижнем регистре для всех файлов в папке. Если вам нужен флаг силы, просто добавьте его после git mv.

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
0 голосов
/ 28 сентября 2011

Для начинающих core.ignorecase по умолчанию ложно.

И в вашем коммите должны быть указаны два файла, но один для удаления и один для добавления.
После коммита Git обнаружит, что одно было переименовано в другое
(поскольку Git по своей сути является провайдером контента ).
История будет сохранена (даже если вам понадобится git log --follow -- yourNewFile, чтобы получить ее историю)

Примечание: git 2.0.1 теперь разрешает простой git mv a.txt A.txt: см. " Git: Изменение заглавных букв имен файлов ".
Больше нет необходимости в скрипте , подобном приведенному ниже .

...