commit 33c2b993c2ea392183a1b2ed54f8da895eda50ab Author: Michael BAG Date: Sun Jul 19 11:23:24 2026 +0300 first commit diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..a7e2a48 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,99 @@ +# Changelog + +Все значимые изменения в этом репозитории будут документироваться в этом файле. + +Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/), +и этот проект придерживается [Semantic Versioning](https://semver.org/lang/ru/). + +--- + +## [1.0.0] - 2025-07-19 + +### Добавлено + +- 🚀 **Первый релиз** репозитория `git_man` +- 📄 **`register-submodules.sh`** — скрипт для автоматической регистрации вложенных репозиториев как подмодулей + - Автоматический поиск всех вложенных репозиториев (папок с `.git`) + - Определение URL удалённого репозитория для каждого найденного + - Регистрация в `.gitmodules` через `git submodule add` + - Поддержка опций: + - `--help`, `-h` — вывод справки + - `--dry-run` — просмотр без изменений + - `--force`, `-f` — принудительная перерегистрация + - `--verbose`, `-v` — подробный вывод + - `--quiet`, `-q` — минимальный вывод (только ошибки) + - Цветной вывод с информационными сообщениями + - Статистика выполнения (найдено, зарегистрировано, пропущено, ошибки) + - Автоматическая проверка окружения (наличие Git, корневой репозиторий) + - Обработка ошибок и корректные коды возврата + +### Создано + +- 📖 **README.md** — полная документация репозитория +- 📝 **CHANGELOG.md** — этот файл с историей изменений + +### Автор + +- **Michael BAG** ([mk@p7net.ru](mailto:mk@p7net.ru)) + +--- + +## [0.1.0] - 2025-07-19 + +### Предварительная версия + +- Прототип скрипта для регистрации подмодулей +- Базовое тестирование на проекте `crm3-26` с 15 вложенными репозиториями +- Проверка работоспособности на различных структурах репозиториев + +--- + +## 📋 Шаблон для новых версий + +При добавлении новых функций или исправлений используйте этот шаблон: + +```markdown +## [X.Y.Z] - ГГГГ-ММ-ДД + +### Добавлено +- Новая функция + +### Изменено +- Изменение существующей функциональности + +### Исправлено +- Исправление ошибок + +### Удалено +- Удалённая функциональность + +### Безопасность +- Исправления безопасности +``` + +--- + +## 🔗 Ссылки + +- **Автор:** Michael BAG ([mk@p7net.ru](mailto:mk@p7net.ru)) +- **Репозиторий:** [https://git.p7net.ru/tools/git_man](https://git.p7net.ru/tools/git_man) +- **Документация:** [README.md](./README.md) +- **Сообщить о проблеме:** [https://git.p7net.ru/tools/git_man/issues](https://git.p7net.ru/tools/git_man/issues) + +--- + +## 📌 История версий + +| Версия | Дата | Изменения | +|--------|------|-----------| +| **1.0.0** | 2025-07-19 | Первый стабильный релиз. Автор: Michael BAG | +| **0.1.0** | 2025-07-19 | Предварительная версия (прототип) | + +--- + +## 📝 Обратная связь + +Если вы нашли ошибку или хотите предложить улучшение: +1. Создайте Issue в репозитории +2. Или напишите автору: [mk@p7net.ru](mailto:mk@p7net.ru) + diff --git a/README.md b/README.md new file mode 100644 index 0000000..a59d921 --- /dev/null +++ b/README.md @@ -0,0 +1,196 @@ +# Git Management Tools (`git_man`) + +Набор скриптов и утилит для управления Git-репозиториями, работы с подмодулями и автоматизации повседневных задач. + +--- + +## 📦 Содержание + +- [Описание](#описание) +- [Скрипты](#скрипты) + - [register-submodules.sh](#register-submodulessh) +- [Установка](#установка) +- [Использование](#использование) +- [Требования](#требования) +- [Автор](#автор) +- [Лицензия](#лицензия) + +--- + +## 📖 Описание + +Данный репозиторий содержит вспомогательные скрипты для работы с Git в проектах, где используется множество вложенных репозиториев (монорепозиторий с подмодулями). + +Основные задачи: +- Автоматическая регистрация вложенных репозиториев как подмодулей +- Централизованное управление множеством репозиториев +- Автоматизация рутинных операций + +--- + +## 🛠️ Скрипты + +### `register-submodules.sh` + +**Описание:** +Автоматически находит все вложенные Git-репозитории в текущей папке и регистрирует их как подмодули в `.gitmodules`. + +**Использование:** +```bash +./register-submodules.sh [ОПЦИИ] +``` + +**Опции:** + +| Опция | Описание | +|-------|----------| +| `--help`, `-h` | Показать справку | +| `--dry-run` | Только показать, что будет сделано (без изменений) | +| `--force`, `-f` | Принудительная перерегистрация подмодулей | +| `--verbose`, `-v` | Подробный вывод | +| `--quiet`, `-q` | Минимальный вывод (только ошибки) | + +**Примеры:** +```bash +# Базовая регистрация +./register-submodules.sh + +# Просмотр без изменений +./register-submodules.sh --dry-run + +# Принудительная перерегистрация с подробным выводом +./register-submodules.sh --force --verbose + +# Тихий режим (только ошибки) +./register-submodules.sh --quiet +``` + +**После регистрации:** +```bash +git add .gitmodules +git commit -m "Зарегистрированы все подмодули" +git push +``` + +**При клонировании репозитория с подмодулями:** +```bash +# Вариант 1: сразу с подмодулями +git clone --recursive https://git.p7net.ru/tools/git_man.git + +# Вариант 2: после клонирования +git clone https://git.p7net.ru/tools/git_man.git +cd git_man +git submodule update --init --recursive +``` + +--- + +## 📂 Структура репозитория + +``` +git_man/ +├── README.md # Этот файл +├── CHANGELOG.md # История изменений +├── register-submodules.sh # Скрипт регистрации подмодулей +└── scripts/ # Дополнительные скрипты (планируется) +``` + +--- + +## ⚙️ Установка + +### Способ 1: Клонирование репозитория + +```bash +git clone https://git.p7net.ru/tools/git_man.git +cd git_man +``` + +### Способ 2: Добавить в PATH (для глобального доступа) + +```bash +# Добавить в ~/.bashrc или ~/.zshrc +export PATH="$PATH:/путь/к/git_man" + +# Или создать символическую ссылку +sudo ln -s /путь/к/git_man/register-submodules.sh /usr/local/bin/register-submodules +``` + +### Способ 3: Использовать как подмодуль в другом проекте + +```bash +git submodule add https://git.p7net.ru/tools/git_man.git tools/git_man +``` + +--- + +## 📋 Требования + +- **Git** (версия 1.8.5 или выше) +- **Bash** (4.0+) +- **Unix-подобная ОС** (Linux, macOS) или **WSL** на Windows + +--- + +## 👤 Автор + +**Michael BAG** +- Email: [mk@p7net.ru](mailto:mk@p7net.ru) +- Репозиторий: [https://git.p7net.ru/tools/git_man](https://git.p7net.ru/tools/git_man) + +--- + +## 🤝 Вклад в развитие + +1. Форкните репозиторий +2. Создайте ветку для ваших изменений (`git checkout -b feature/amazing-feature`) +3. Закоммитьте изменения (`git commit -m 'Add amazing feature'`) +4. Отправьте изменения (`git push origin feature/amazing-feature`) +5. Создайте Pull Request + +--- + +## 📄 Лицензия + +MIT License + +Copyright (c) 2024-2025 Michael BAG + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +--- + +## 📝 Обновление + +```bash +git pull origin main +``` + +Для обновления подмодулей (если используются): +```bash +git submodule update --init --recursive +``` + +--- + +## 📞 Контакты + +- **Автор:** Michael BAG ([mk@p7net.ru](mailto:mk@p7net.ru)) +- **Репозиторий:** [https://git.p7net.ru/tools/git_man](https://git.p7net.ru/tools/git_man) +- **Проблемы/Предложения:** [https://git.p7net.ru/tools/git_man/issues](https://git.p7net.ru/tools/git_man/issues) diff --git a/register-submodules.sh b/register-submodules.sh new file mode 100755 index 0000000..ce64f07 --- /dev/null +++ b/register-submodules.sh @@ -0,0 +1,435 @@ +#!/bin/bash +# ============================================================ +# register-submodules.sh - Регистрация всех вложенных репозиториев как подмодулей +# +# Использование: +# ./register-submodules.sh [--help] [--dry-run] [--force] +# +# Опции: +# --help Показать эту справку +# --dry-run Только показать, что будет сделано (без изменений) +# --force Принудительно перерегистрировать подмодули +# --verbose Подробный вывод +# +# Описание: +# Скрипт находит все вложенные репозитории (папки с .git), +# определяет их URL и регистрирует как подмодули в .gitmodules. +# ============================================================ + +set -e # Остановка при ошибке + +# ============================================================ +# Функция показа справки +# ============================================================ +show_help() { + cat << 'EOF' +============================================================ +📦 register-submodules.sh - Регистрация вложенных репозиториев +============================================================ + +ИСПОЛЬЗОВАНИЕ: + ./register-submodules.sh [ОПЦИИ] + +ОПЦИИ: + --help Показать эту справку + --dry-run Только показать, что будет сделано (без изменений) + --force Принудительно перерегистрировать подмодули + (удаляет существующие и создаёт заново) + --verbose Подробный вывод (показывает все действия) + --quiet Минимальный вывод (только ошибки) + +ОПИСАНИЕ: + Скрипт находит все вложенные репозитории (папки с .git), + определяет их URL и регистрирует как подмодули в .gitmodules. + + Вложенные репозитории — это папки, которые являются + самостоятельными Git-репозиториями внутри основного. + +ПРИМЕРЫ: + # Базовая регистрация + ./register-submodules.sh + + # Просмотр того, что будет сделано + ./register-submodules.sh --dry-run + + # Принудительная перерегистрация всех подмодулей + ./register-submodules.sh --force --verbose + + # Тихий режим (только ошибки) + ./register-submodules.sh --quiet + +ПОСЛЕ РЕГИСТРАЦИИ: + 1. Проверьте изменения: git status + 2. Посмотрите подмодули: git submodule status + 3. Закоммитьте изменения: git commit -m "Зарегистрированы все подмодули" + 4. Отправьте на сервер: git push + +ПРИ КЛОНИРОВАНИИ РЕПОЗИТОРИЯ: + git clone --recursive + # Или после клонирования: + git submodule update --init --recursive + +============================================================ +EOF + exit 0 +} + +# ============================================================ +# Инициализация переменных +# ============================================================ +DRY_RUN=false +FORCE=false +VERBOSE=false +QUIET=false + +# ============================================================ +# Разбор аргументов командной строки +# ============================================================ +while [[ $# -gt 0 ]]; do + case $1 in + --help|-h) + show_help + ;; + --dry-run) + DRY_RUN=true + shift + ;; + --force|-f) + FORCE=true + shift + ;; + --verbose|-v) + VERBOSE=true + shift + ;; + --quiet|-q) + QUIET=true + shift + ;; + *) + echo -e "\033[0;31m❌ Неизвестная опция: $1\033[0m" + echo " Используйте --help для справки" + exit 1 + ;; + esac +done + +# ============================================================ +# Настройка вывода +# ============================================================ +if [ "$QUIET" = true ]; then + # В тихом режиме перенаправляем всё в /dev/null, кроме ошибок + exec 3>&1 # Сохраняем stdout + exec >/dev/null 2>&1 +fi + +# Цвета для вывода (если не тихий режим) +if [ "$QUIET" != true ]; then + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + BLUE='\033[0;34m' + CYAN='\033[0;36m' + MAGENTA='\033[0;35m' + NC='\033[0m' # No Color +else + RED=''; GREEN=''; YELLOW=''; BLUE=''; CYAN=''; MAGENTA=''; NC='' +fi + +# Функции логирования +log_info() { + if [ "$QUIET" != true ]; then + echo -e "${CYAN}ℹ️ $1${NC}" + fi +} + +log_success() { + if [ "$QUIET" != true ]; then + echo -e "${GREEN}✅ $1${NC}" + fi +} + +log_warning() { + if [ "$QUIET" != true ]; then + echo -e "${YELLOW}⚠️ $1${NC}" + fi +} + +log_error() { + echo -e "${RED}❌ $1${NC}" >&2 +} + +log_debug() { + if [ "$VERBOSE" = true ] && [ "$QUIET" != true ]; then + echo -e "${BLUE}🔍 $1${NC}" + fi +} + +log_step() { + if [ "$QUIET" != true ]; then + echo -e "${MAGENTA}▶ $1${NC}" + fi +} + +# ============================================================ +# Проверка окружения +# ============================================================ +log_step "Проверка окружения..." + +# Проверка, что мы в корне Git-репозитория +if [ ! -d ".git" ]; then + log_error "Текущая папка не является Git-репозиторием" + echo " Запустите скрипт из корня основного репозитория" >&2 + exit 1 +fi + +log_success "Текущая папка является Git-репозиторием" + +# Проверка наличия Git +if ! command -v git &> /dev/null; then + log_error "Git не установлен" + exit 1 +fi + +# ============================================================ +# Информация о режиме работы +# ============================================================ +if [ "$QUIET" != true ]; then + echo "" + echo "============================================================" + echo "📦 Регистрация вложенных репозиториев как подмодулей" + echo "============================================================" + echo "" + + if [ "$DRY_RUN" = true ]; then + echo -e "${YELLOW}⚠️ РЕЖИМ ПРОСМОТРА (--dry-run) — изменения НЕ будут применены${NC}" + echo "" + fi + + if [ "$FORCE" = true ]; then + echo -e "${YELLOW}⚠️ РЕЖИМ ПРИНУДИТЕЛЬНОЙ ПЕРЕРЕГИСТРАЦИИ (--force)${NC}" + echo " Существующие подмодули будут перезаписаны" + echo "" + fi + + if [ "$VERBOSE" = true ]; then + echo -e "${BLUE}🔍 Подробный режим (--verbose)${NC}" + echo "" + fi +fi + +# ============================================================ +# Проверка .gitmodules +# ============================================================ +if [ -f ".gitmodules" ]; then + if [ "$FORCE" = true ]; then + log_warning "Файл .gitmodules существует — будет перезаписан (--force)" + if [ "$DRY_RUN" = false ]; then + git rm --cached .gitmodules 2>/dev/null || true + rm -f .gitmodules + fi + else + log_info "Файл .gitmodules уже существует" + log_info "Будет выполнено обновление существующих записей" + fi +else + log_info "Файл .gitmodules не существует — будет создан" +fi + +# ============================================================ +# Поиск вложенных репозиториев +# ============================================================ +log_step "Поиск вложенных репозиториев..." + +# Временный файл для хранения путей +TEMP_FILE=$(mktemp) + +# Найти все папки с .git (исключая сам .git) +find . -type d -name ".git" -exec dirname {} \; 2>/dev/null | sort > "$TEMP_FILE" + +# Удалить корневой репозиторий из списка +sed -i '/^\.$/d' "$TEMP_FILE" 2>/dev/null || true + +# Проверка, есть ли что-то найдено +if [ ! -s "$TEMP_FILE" ]; then + log_warning "Вложенные репозитории не найдены" + rm -f "$TEMP_FILE" + exit 0 +fi + +# Подсчёт количества +TOTAL=$(wc -l < "$TEMP_FILE" | tr -d ' ') +log_success "Найдено $TOTAL вложенных репозиториев" + +if [ "$VERBOSE" = true ]; then + echo "" + echo -e "${CYAN}📋 Список найденных репозиториев:${NC}" + cat "$TEMP_FILE" | while read repo; do + echo " 📁 $repo" + done + echo "" +fi + +# ============================================================ +# Функция регистрации подмодуля +# ============================================================ +register_submodule() { + local repo="$1" + local url="$2" + + if [ "$DRY_RUN" = true ]; then + echo " [DRY-RUN] git submodule add $url $repo" + return 0 + fi + + # Если принудительная перерегистрация — удаляем существующий + if [ "$FORCE" = true ]; then + # Удаляем из .git/config + git config --remove-section "submodule.$repo" 2>/dev/null || true + # Удаляем из .gitmodules + git config --file .gitmodules --remove-section "submodule.$repo" 2>/dev/null || true + # Удаляем папку подмодуля, если она пуста + if [ -d "$repo" ] && [ -z "$(ls -A "$repo" 2>/dev/null)" ]; then + rm -rf "$repo" + fi + fi + + # Проверяем, не зарегистрирован ли уже + if git config --file .gitmodules --get "submodule.$repo.url" >/dev/null 2>&1; then + log_debug "Подмодуль $repo уже зарегистрирован" + return 2 + fi + + # Регистрация + git submodule add "$url" "$repo" 2>/dev/null + return $? +} + +# ============================================================ +# Основной цикл регистрации +# ============================================================ +log_step "Регистрация подмодулей..." + +REGISTERED=0 +SKIPPED=0 +ERRORS=0 +NO_URL=0 + +while read repo; do + # Пропустить пустые строки + [ -z "$repo" ] && continue + + log_debug "Обработка: $repo" + + # Получить URL + if [ -d "$repo" ]; then + cd "$repo" 2>/dev/null + if [ $? -ne 0 ]; then + log_error "Не удалось перейти в папку: $repo" + ERRORS=$((ERRORS + 1)) + cd - > /dev/null 2>/dev/null || true + continue + fi + + url=$(git remote get-url origin 2>/dev/null) + cd - > /dev/null 2>/dev/null || true + + if [ -z "$url" ]; then + if [ "$VERBOSE" = true ] || [ "$QUIET" != true ]; then + log_warning "Не удалось определить URL для: $repo (нет remote 'origin')" + fi + NO_URL=$((NO_URL + 1)) + continue + fi + else + log_warning "Папка не существует: $repo" + ERRORS=$((ERRORS + 1)) + continue + fi + + # Регистрация + if [ "$QUIET" != true ]; then + echo -e "${GREEN}➕ Регистрация:${NC} $repo" + echo -e " ${CYAN}URL:${NC} $url" + fi + + register_submodule "$repo" "$url" + result=$? + + case $result in + 0) + log_success "Подмодуль зарегистрирован: $repo" + REGISTERED=$((REGISTERED + 1)) + ;; + 2) + log_debug "Пропущен (уже зарегистрирован): $repo" + SKIPPED=$((SKIPPED + 1)) + ;; + *) + log_error "Ошибка при регистрации: $repo" + ERRORS=$((ERRORS + 1)) + ;; + esac + + echo "" + +done < "$TEMP_FILE" + +# Очистка +rm -f "$TEMP_FILE" + +# ============================================================ +# Итоговый вывод +# ============================================================ +if [ "$QUIET" != true ]; then + echo "" + echo "============================================================" + echo -e "${CYAN}📊 Статистика${NC}" + echo "============================================================" + echo -e " ${BLUE}Всего найдено:${NC} $TOTAL" + echo -e " ${GREEN}Зарегистрировано:${NC} $REGISTERED" + echo -e " ${YELLOW}Пропущено:${NC} $SKIPPED" + echo -e " ${YELLOW}Без URL:${NC} $NO_URL" + if [ $ERRORS -gt 0 ]; then + echo -e " ${RED}Ошибок:${NC} $ERRORS" + fi + echo "" + + if [ "$DRY_RUN" = true ]; then + echo -e "${YELLOW}⚠️ Это был просмотр (--dry-run). Изменения НЕ применены.${NC}" + echo " Уберите --dry-run для выполнения." + echo "" + fi +fi + +# ============================================================ +# Следующие шаги +# ============================================================ +if [ "$DRY_RUN" = false ] && [ $REGISTERED -gt 0 ]; then + if [ "$QUIET" != true ]; then + echo -e "${GREEN}✅ Все подмодули зарегистрированы!${NC}" + echo "" + echo -e "${CYAN}Следующие шаги:${NC}" + echo " 1. Проверьте изменения: git status" + echo " 2. Посмотрите подмодули: git submodule status" + echo " 3. Закоммитьте изменения: git commit -m \"Зарегистрированы все подмодули\"" + echo " 4. Отправьте на сервер: git push" + echo "" + echo -e "${YELLOW}⚠️ Внимание:${NC} При первом клонировании выполните:" + echo " git submodule update --init --recursive" + echo "" + fi +elif [ "$DRY_RUN" = false ] && [ $REGISTERED -eq 0 ] && [ $SKIPPED -eq 0 ]; then + if [ "$QUIET" != true ]; then + echo -e "${YELLOW}⚠️ Не найдено подмодулей для регистрации${NC}" + fi +fi + +if [ "$QUIET" != true ]; then + echo "============================================================" + echo "" +fi + +exit 0 + +