GitHub: переименование множества файлов в репозитории

Jun 29, 2023 02:01

Я создал на веб-сервисе «GitHub» (я буду называть его «Гитхабом») репозиторий, в который постепенно загружал файлы через веб-интерфейс, как по одному, так и группами. На данный момент в этом репозитории хранится около полутора сотен файлов в разных папках, в том числе с вложением папок разной глубины. Файлы имеют разные расширения.

Мне понадобилось переименовать сразу 157 файлов в описанном репозитории по следующему принципу:

00-00_имя-файла.ext # было
00-000_имя-файла.ext # стало, добавился 0

В этом блоке кода показаны шаблоны. Вместо «.ext» могут быть разные расширения (в моем случае это расширения «.cpp» и «.h»). Вместо «имя-файла» могут быть разные названия из нескольких слов, эти названия могут быть разной длины. Вместо «00-00» могут быть, например, следующие последовательности символов: «00-01», «00-02», ..., «01-00», «01-01», ..., «02-00», «02-01», «02-02» и так далее. То есть мне понадобилось расширить второй номер, который идет после дефиса, с двух разрядов до трех, поэтому мне нужно переименовать все файлы, добавляя символ «0» в указанное выше место в названии файлов.

Я знаю, как через веб-интерфейс «Гитхаба» можно переименовывать файлы по одиночке, об этом можно прочитать в отдельной статье документации «Гитхаба», но там не описано, как переименовать сразу множество файлов проекта.

План действий

1. Клонировать (создать копию) репозитория на своем компьютере;
2. Написать скрипт для переименования множества файлов проекта и переименовать их;
3. Создать коммит со всеми переименованиями;
4. Отправить изменения в оригинальный репозиторий на «Гитхабе».

1. Клонирование репозитория на свой компьютер

Я работаю в операционной системе «Windows 10» и пользуюсь программой (системой управления версиями) «Git for Windows» из командной строки. В качестве программы-оболочки я использую «PowerShell» версии 7. В качестве программы-«эмулятора терминала» использую «Windows Terminal».

Клонирование (создание копии) репозитория с «Гитхаба» на мой компьютер:

PS C:\Users\Илья\source\repos> git clone https://github.com/ilyachalov/learncpp-com-examples

Команде git clone просто передаём URL-адрес репозитория на «Гитхабе». Авторизация при этом не требуется. Насколько я понимаю, это потому, что этот мой репозиторий публичный. В результате этой команды в текущем местоположении создалась папка «learncpp-com-examples» с файлами репозитория. Для дальнейших действий удобнее перейти в эту папку и работать из нее.

PS C:\Users\Илья\source\repos> cd learncpp-com-examples
PS C:\Users\Илья\source\repos\learncpp-com-examples>

Для удобства далее я буду обозначать это местоположение так:

PS ..\learncpp-com-examples>

2. Скрипт для переименования множества файлов и его применение

За основу скрипта я взял код из примера 4 статьи про командлет «Rename-Item» документации программы-оболочки «PowerShell». Я переписал тот код под свои нужды, добавил регулярные выражения и получил следующее:

файл «rename-files.ps1» (в кодировке UTF-8 без BOM, окончания строк CRLF)

Get-ChildItem -File -Recurse |
Rename-Item -NewName {
$_.Name -replace '^(\d\d)-(\d\d)_(.*)', '$1-0$2_$3'
}

Данный скрипт просматривает только файлы (папки отбрасываются, это обеспечивается параметром -File командлета «Get-ChildItem»), начиная с текущей папки и вглубь, во вложенных папках (это обеспечивается параметром -Recurse командлета «Get-ChildItem»). Командлет «Get-ChildItem» отбирает все файлы, поэтому параметр -Path командлету «Get-ChildItem» не требуется, он опущен. Файлы, отобранные командлетом «Get-ChildItem», передаются по конвейеру командлету «Rename-Item», который и выполняет переименования.

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

файл «rename-files.ps1» (в кодировке UTF-8 без BOM, окончания строк CRLF)

$total = 0
$renamed = 0
Get-ChildItem -File -Recurse |
Rename-Item -NewName {
$old = $_.Name
$new = $old -replace '^(\d\d)-(\d\d)_(.*)', '$1-0$2_$3'
$script:total++
if ($old -ne $new) {
Write-Host "$old --> $new"
$script:renamed++
} else {
Write-Host "$new"
}
$new
}
"Проверено файлов всего: $total, из них переименовано: $renamed"

У меня есть более подробный разбор этого скрипта.

Для переименования файлов я поместил файл «rename-files.ps1» со скриптом в нужную папку клонированного репозитория и запустил его:

PS C:\Users\Илья\source\repos\learncpp-com-examples\chapters> .\rename-files
rename-files.ps1
00-00_helloworld.cpp --> 00-000_helloworld.cpp
00-01_helloworld-wait.cpp --> 00-001_helloworld-wait.cpp
00-02_cpp17compat.cpp --> 00-002_cpp17compat.cpp
00-03_cpp20compat.cpp --> 00-003_cpp20compat.cpp
01-00_snippet.cpp --> 01-000_snippet.cpp
...
02-98_io.cpp --> 02-098_io.cpp
02-98_main.cpp --> 02-098_main.cpp
02-99_io.cpp --> 02-099_io.cpp
02-99_io.h --> 02-099_io.h
02-99_main.cpp --> 02-099_main.cpp
Проверено файлов всего: 158, из них переименовано: 157

После окончания переименования файл «rename-files.ps1» скрипта следует из папки проекта удалить, чтобы он не мешал при создании коммита.

3.1. Проверка настроек Git-репозитория

Перед созданием коммита, который позже попадет на «Гитхаб», имеет смысл проверить настройку имени автора коммита и адреса электронной почты автора коммита, если вы не хотите «светить» их в интернете.

Для проверки настроек Git-репозитория удобно использовать следующую команду из папки проекта (благодаря параметру --show-origin вы сможете увидеть, в каких файлах хранятся настройки Git-репозитория; часто разные настройки хранятся в разных файлах):

PS ..\learncpp-com-examples> git config --list --show-origin

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

PS ..\learncpp-com-examples> git config user.name
Ilya Chalov
PS ..\learncpp-com-examples> git config user.email
почта@домен.ru

Имя у меня такое и зарегистрировано на «Гитхабе», а вот адрес электронной почты «светить» там не хотелось бы. «Гитхаб» по желанию пользователя создает для коммитов, выполняемых через веб-интерфейс, «служебный» адрес электронной почты, который «прикрывает» реальный адрес электронной почты пользователя. Этот «служебный» адрес электронной почты можно посмотреть в настройках своей учетной записи на «Гитхабе» по следующему URL-адресу (он сработает, если вы уже авторизованы на веб-сервисе):

Меню «Settings / Emails»
https://github.com/settings/emails

Меняю адрес электронной почты в настройках текущего (параметр --local) Git-репозитория:

PS ..\learncpp-com-examples> git config --local user.email служебный@github.com

3.2. Создание коммита со всеми переименованиями

Команду git mv я не смог использовать для переименований, так как в ней, вроде бы, нельзя использовать регулярные выражения (можно использовать символы-джокеры, но их недостаточно). Однако, как пишут в известной книге про «Git», на самом деле команда git mv - это совмещение трех команд: 1) переименование файла средствами операционной системы, 2) git rm для файла с названием до переименования, 3) git add для файла с названием после переименования.

Дополнение от 3 июля: я нашел способ использовать команду git mv при переименовании множества файлов (см. подробнее в отдельном посте).

Пункт первый из трех вышеперечисленных я уже выполнил ранее с помощью своего скрипта «rename-files.ps1». Оставшиеся два пункта можно выполнить для всех 157 переименованных файлов одной следующей командой:

PS ..\learncpp-com-examples> git add --all

Теперь все изменения помещены в индекс и можно, наконец, создать коммит:

PS ..\learncpp-com-examples> git commit -m "Переименование группы файлов (157 штук)"

4. Отправка изменений в оригинальный репозиторий на «Гитхабе»

При отправке изменений в оригинальный репозиторий на «Гитхабе» потребуется авторизация. Когда я попытался ввести свой пароль, «Гитхаб» сообщил мне, что с 13 августа 2021 года аутентификация с помощью пароля больше не используется. Мне было предложено пройти в документацию по следующей ссылке и почитать про действующие способы аутентификации.

Я выбрал способ аутентификации с помощью токена доступа и создал гранулированный токен доступа (сейчас на «Гитхабе» есть две действующие реализации токенов доступа: старая (классическая) и новая (гранулированные токены доступа, по-английски «fine-grained access token»)). У меня есть отдельная подробная статья про создание гранулированного токена доступа. Использовать токен доступа несложно: при аутентификации его нужно просто ввести (вставить из буфера обмена) вместо пароля.

Отправляю изменения в оригинальный репозиторий на «Гитхабе»:

PS C:\Users\Илья\source\repos\learncpp-com-examples> git push origin main
Username for 'https://github.com': ilyachalov
Password for 'https://ilyachalov@github.com':

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

Заключение

После отправки изменений на «Гитхаб» я открыл оригинальный репозиторий в браузере и проверил получение отправленного коммита. Всё получилось так, как я и планировал. Вот ссылка на коммит с переименованием 157 файлов в оригинальном репозитории.

Инструмент, Образование, Сайтостроение, Программирование

Previous post Next post
Up