first commit

This commit is contained in:
3 changed files with 730 additions and 0 deletions
+99
View File
@@ -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)
+196
View File
@@ -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)
+435
View File
@@ -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 <URL>
# Или после клонирования:
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