From 2d3734f6edb4cc7149e9d3ccc462efd7607019ca Mon Sep 17 00:00:00 2001 From: Mikhail Kudryavtsev Date: Mon, 27 Jul 2026 21:57:40 +0300 Subject: [PATCH] Release 1.2.0: setup-1c-repo for 1C Configurator dumps (EOL/encoding/ignore). Co-authored-by: Cursor --- CHANGELOG.md | 21 +++ README.md | 83 ++++++++- setup-1c-repo.cmd | 20 +++ setup-1c-repo.ps1 | 411 ++++++++++++++++++++++++++++++++++++++++++++ setup-1c-repo.sh | 427 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 954 insertions(+), 8 deletions(-) create mode 100644 setup-1c-repo.cmd create mode 100644 setup-1c-repo.ps1 create mode 100644 setup-1c-repo.sh diff --git a/CHANGELOG.md b/CHANGELOG.md index b12cb6d..c78f2be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,26 @@ --- +## [1.2.0] - 2026-07-27 + +### Добавлено + +- 🔧 **`setup-1c-repo`** — настройка локального Git-репозитория под выгрузку конфигуратора 1С + - `setup-1c-repo.sh` — Linux / macOS + - `setup-1c-repo.ps1` + `setup-1c-repo.cmd` — Windows + - Локальный `git config`: `core.quotepath=false`, `core.longpaths=true`, UTF-8, `core.autocrlf=false` + - На macOS дополнительно `core.precomposeunicode=true` + - Создание `.gitattributes` с `eol=crlf` для файлов выгрузки (`*.bsl`, `*.xml`, …) и `binary` для артефактов 1С + - Создание типового `.gitignore` (`*.cf`, `*.cfe`, `*.epf`, …) + - Опции: `--dry-run` / `-DryRun`, `--force`, `--init`, `--renormalize`, `--no-gitignore` + +### Документация + +- 📖 Обновлён **README.md** +- 📝 Обновлён **CHANGELOG.md** + +--- + ## [1.0.6] - 2026-07-20 ### Добавлено @@ -133,6 +153,7 @@ | Версия | Дата | Изменения | |--------|------|-----------| +| **1.2.0** | 2026-07-27 | `setup-1c-repo` — настройки Git под выгрузку конфигуратора 1С | | **1.0.6** | 2026-07-20 | Автоснятие из `.gitignore`, fix macOS sed, `--version` | | **1.1.0** | 2025-07-19 | Добавлена настройка игнорирования подмодулей | | **1.0.0** | 2025-07-19 | Первый стабильный релиз | diff --git a/README.md b/README.md index feb1955..5637f62 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Git Management Tools (`git_man`) -**Версия:** 1.0.6 +**Версия:** 1.2.0 Набор скриптов и утилит для управления Git-репозиториями, работы с подмодулями и автоматизации повседневных задач. @@ -10,6 +10,7 @@ - [Описание](#описание) - [Скрипты](#скрипты) + - [setup-1c-repo](#setup-1c-repo--настройка-репозитория-под-1с) - [register-submodules.sh](#register-submodulessh) - [Установка](#установка) - [Использование](#использование) @@ -22,19 +23,81 @@ ## 📖 Описание -Данный репозиторий содержит вспомогательные скрипты для работы с Git в проектах, где используется множество вложенных репозиториев (монорепозиторий с подмодулями). +Данный репозиторий содержит вспомогательные скрипты для работы с Git в проектах, где используется множество вложенных репозиториев (монорепозиторий с подмодулями), а также настройка репозиториев под выгрузку конфигуратора 1С. Основные задачи: - Автоматическая регистрация вложенных репозиториев как подмодулей - Снятие путей из `.gitignore` при регистрации - Централизованное управление множеством репозиториев - Настройка игнорирования состояния подмодулей в основном репозитории +- Настройка кодировки, EOL и ignore для проектов 1С (выгрузка конфигуратора) - Автоматизация рутинных операций --- ## 🛠️ Скрипты +### `setup-1c-repo` — настройка репозитория под 1С + +**Описание:** +Включает локальные настройки Git в **текущей папке** (каталог запуска) под выгрузку конфигурации/расширения из **конфигуратора 1С**: UTF-8 с BOM, CRLF в рабочей копии для файлов выгрузки, корректные пути с кириллицей, длинные пути, `.gitattributes` и `.gitignore`. + +| Платформа | Скрипт | +|-----------|--------| +| **Windows** | `setup-1c-repo.ps1` или `setup-1c-repo.cmd` | +| **macOS / Linux** | `setup-1c-repo.sh` | + +**Использование (Windows):** +```powershell +.\setup-1c-repo.ps1 +.\setup-1c-repo.ps1 -Force -Renormalize +.\setup-1c-repo.cmd -Init -DryRun +``` + +**Использование (macOS / Linux):** +```bash +./setup-1c-repo.sh +./setup-1c-repo.sh --force --renormalize +./setup-1c-repo.sh --init --dry-run +``` + +**Опции:** + +| Опция (sh / ps1) | Описание | +|------------------|----------| +| `--help` / `-Help` | Справка | +| `--version` / `-Version` | Версия скрипта (`1.2.0`) | +| `--dry-run` / `-DryRun` | Только показать действия | +| `--force` / `-Force` | Перезаписать `.gitattributes` и `.gitignore` | +| `--init` / `-Init` | `git init`, если папка ещё не репозиторий | +| `--renormalize` / `-Renormalize` | `git add --renormalize .` после настройки | +| `--no-gitignore` / `-NoGitignore` | Не трогать `.gitignore` | +| `--verbose` / `-Verbose` | Подробный вывод | +| `--quiet` / `-Quiet` | Только ошибки | + +**Что применяется локально (`git config --local`):** + +| Параметр | Значение | Зачем | +|----------|----------|--------| +| `core.quotepath` | `false` | Кириллические пути без `\320\…` | +| `core.longpaths` | `true` | Длинные пути (Windows / глубокие деревья 1С) | +| `gui.encoding` | `utf-8` | Кодировка GUI | +| `i18n.commitEncoding` | `utf-8` | Кодировка сообщений коммитов | +| `core.autocrlf` | `false` | EOL только через `.gitattributes` | +| `core.safecrlf` | `warn` | Предупреждение о смешанных EOL | +| `diff.renames` | `false` | Как в рекомендациях 1С:ГитКонвертер | +| `core.precomposeunicode` | `true` | Только macOS (NFD/NFC для имён файлов) | + +**`.gitattributes`:** для `*.bsl`, `*.xml`, `*.txt`, `*.html` и др. файлов выгрузки — `text eol=crlf` (рабочая копия как у конфигуратора). Бинарники (`*.cf`, `*.bin`, картинки, …) — `binary`. BOM UTF-8 хранится как часть содержимого файла. + +**После запуска:** +```bash +git add .gitattributes .gitignore +git commit -m "Настройки Git для выгрузки конфигуратора 1С" +``` + +--- + ### `register-submodules.sh` **Описание:** @@ -121,8 +184,10 @@ git submodule update --init --recursive git_man/ ├── README.md # Этот файл ├── CHANGELOG.md # История изменений -├── register-submodules.sh # Скрипт регистрации подмодулей -└── scripts/ # Дополнительные скрипты (планируется) +├── register-submodules.sh # Регистрация вложенных репозиториев как подмодулей +├── setup-1c-repo.sh # Настройка репозитория под 1С (macOS / Linux) +├── setup-1c-repo.ps1 # Настройка репозитория под 1С (Windows PowerShell) +└── setup-1c-repo.cmd # Обёртка Windows для .ps1 ``` --- @@ -156,9 +221,9 @@ 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 +- **Git** (версия 1.8.5 или выше; для `--renormalize` рекомендуется 2.16+) +- **Bash** (4.0+) — для `*.sh` на Linux / macOS / WSL +- **PowerShell** 5.1+ или 7+ — для `setup-1c-repo.ps1` / `.cmd` на Windows --- @@ -183,18 +248,20 @@ git submodule add https://git.p7net.ru/tools/git_man.git tools/git_man ## 📌 История версий -Текущая версия: **1.0.6** (2026-07-20). +Текущая версия: **1.2.0** (2026-07-27). Кратко по релизам — см. [CHANGELOG.md](./CHANGELOG.md). | Версия | Дата | Суть | |--------|------|------| +| **1.2.0** | 2026-07-27 | `setup-1c-repo` — настройки Git под выгрузку конфигуратора 1С | | **1.0.6** | 2026-07-20 | Автоснятие из `.gitignore`, fix macOS, `--version` | | **1.1.0** | 2025-07-19 | Настройка `ignore` для подмодулей | | **1.0.0** | 2025-07-19 | Первый стабильный релиз | Проверка версии: ```bash +./setup-1c-repo.sh --version ./register-submodules.sh --version ``` diff --git a/setup-1c-repo.cmd b/setup-1c-repo.cmd new file mode 100644 index 0000000..affe802 --- /dev/null +++ b/setup-1c-repo.cmd @@ -0,0 +1,20 @@ +@echo off +setlocal EnableExtensions +REM ============================================================ +REM setup-1c-repo.cmd - обёртка Windows для setup-1c-repo.ps1 +REM Версия: 1.2.0 +REM Запуск из корня Git-репозитория 1С-проекта (выгрузка конфигуратора). +REM ============================================================ + +set "SCRIPT_DIR=%~dp0" +set "PS1=%SCRIPT_DIR%setup-1c-repo.ps1" + +if not exist "%PS1%" ( + echo [ERROR] Не найден файл: %PS1% + exit /b 1 +) + +REM Bypass только для этого скрипта; аргументы пробрасываются как есть. +powershell.exe -NoProfile -ExecutionPolicy Bypass -File "%PS1%" %* +set "EXITCODE=%ERRORLEVEL%" +exit /b %EXITCODE% diff --git a/setup-1c-repo.ps1 b/setup-1c-repo.ps1 new file mode 100644 index 0000000..3363f5c --- /dev/null +++ b/setup-1c-repo.ps1 @@ -0,0 +1,411 @@ +# ============================================================ +# setup-1c-repo.ps1 - Настройка Git-репозитория под выгрузку 1С (конфигуратор) +# +# Версия: 1.2.0 +# Автор: Michael BAG +# Репозиторий: https://git.p7net.ru/tools/git_man +# +# Платформа: Windows (PowerShell 5.1+ / PowerShell 7+) +# Для Linux/macOS используйте setup-1c-repo.sh +# +# Использование: +# .\setup-1c-repo.ps1 [-DryRun] [-Force] [-Init] [-Renormalize] [-NoGitignore] +# [-Verbose] [-Quiet] [-Help] [-Version] +# +# Описание: +# Включает локальные настройки Git в текущей папке (cwd) для проектов +# с выгрузкой конфигурации/расширения из конфигуратора 1С: +# - UTF-8 с BOM (как у конфигуратора; BOM хранится как часть содержимого) +# - CRLF в рабочей копии для *.bsl / *.xml и др. текстовых файлов выгрузки +# - корректное отображение кириллических путей (core.quotepath=false) +# - длинные пути (core.longpaths=true) +# - создаёт/обновляет .gitattributes и .gitignore +# ============================================================ + +[CmdletBinding()] +param( + [switch]$DryRun, + [Alias('f')] + [switch]$Force, + [switch]$Init, + [switch]$Renormalize, + [switch]$NoGitignore, + [Alias('q')] + [switch]$Quiet, + [Alias('h')] + [switch]$Help, + [Alias('V')] + [switch]$Version +) + +$ErrorActionPreference = 'Stop' +$ScriptVersion = '1.2.0' + +function Show-Help { + @" +============================================================ +📦 setup-1c-repo.ps1 v$ScriptVersion — настройка репозитория под 1С +============================================================ + +ОПИСАНИЕ: + Настраивает локальный Git-репозиторий в ТЕКУЩЕЙ папке под + выгрузку из конфигуратора 1С (UTF-8 BOM + CRLF). + +ИСПОЛЬЗОВАНИЕ: + .\setup-1c-repo.ps1 [ОПЦИИ] + .\setup-1c-repo.cmd [ОПЦИИ] + +ОПЦИИ: + -Help, -h Показать эту справку + -Version, -V Показать версию скрипта + -DryRun Только показать, что будет сделано + -Force, -f Перезаписать существующие .gitattributes / .gitignore + -Init Выполнить git init, если папка ещё не репозиторий + -Renormalize После настройки: git add --renormalize . + -NoGitignore Не создавать/не менять .gitignore + -Verbose, -v Подробный вывод + -Quiet, -q Минимальный вывод (только ошибки) + +ПРИМЕРЫ: + .\setup-1c-repo.ps1 + .\setup-1c-repo.ps1 -Force -Renormalize + .\setup-1c-repo.ps1 -Init -DryRun + +============================================================ +"@ | Write-Host + exit 0 +} + +function Show-Version { + Write-Host "setup-1c-repo.ps1 $ScriptVersion" + exit 0 +} + +if ($Help) { Show-Help } +if ($Version) { Show-Version } + +function Write-Info([string]$Message) { + if (-not $Quiet) { Write-Host "ℹ️ $Message" -ForegroundColor Cyan } +} +function Write-Success([string]$Message) { + if (-not $Quiet) { Write-Host "✅ $Message" -ForegroundColor Green } +} +function Write-WarnMsg([string]$Message) { + if (-not $Quiet) { Write-Host "⚠️ $Message" -ForegroundColor Yellow } +} +function Write-ErrMsg([string]$Message) { + Write-Host "❌ $Message" -ForegroundColor Red +} +function Write-DebugMsg([string]$Message) { + if ($VerbosePreference -ne 'SilentlyContinue' -and -not $Quiet) { + Write-Host "🔍 $Message" -ForegroundColor Blue + } +} +function Write-Step([string]$Message) { + if (-not $Quiet) { Write-Host "▶ $Message" -ForegroundColor Magenta } +} + +$GitAttributesContent = @' +# .gitattributes — выгрузка конфигуратора 1С (UTF-8 BOM + CRLF) +# Создано setup-1c-repo.ps1 (git_man). Не удаляйте без необходимости. +# +# Правило: текстовые файлы выгрузки — text + eol=crlf (рабочая копия = CRLF, +# в объекте Git нормализуется к LF). Бинарники — binary (без конвертации EOL). + +* text=auto + +# --- Текстовые файлы выгрузки конфигуратора --- +*.bsl text eol=crlf +*.os text eol=crlf +*.xml text eol=crlf +*.txt text eol=crlf +*.html text eol=crlf +*.htm text eol=crlf +*.xsd text eol=crlf +*.xslt text eol=crlf +*.xsl text eol=crlf +*.Form text eol=crlf +*.Module text eol=crlf +*.max text eol=crlf + +# --- Служебные / документация репозитория (LF) --- +*.md text eol=lf +*.json text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.sh text eol=lf +*.gitignore text eol=lf +*.gitattributes text eol=lf +.editorconfig text eol=lf + +# --- Скрипты Windows --- +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf + +# --- Бинарные артефакты 1С и медиа --- +*.bin binary +*.cf binary +*.cfe binary +*.cfu binary +*.epf binary +*.erf binary +*.axdt binary +*.addin binary + +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.bmp binary +*.ico binary +*.webp binary +*.tif binary +*.tiff binary +*.svg -text + +*.zip binary +*.rar binary +*.7z binary +*.gz binary + +*.xls binary +*.xlsx binary +*.xlsm binary +*.doc binary +*.docx binary +*.pdf binary +*.rtf binary + +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary +*.eot binary +'@ + +$GitIgnoreContent = @' +# .gitignore — типовые исключения для проектов 1С (конфигуратор) +# Создано setup-1c-repo.ps1 (git_man) + +# Бинарные выгрузки конфигурации / расширений / обработок +*.cf +*.cfe +*.cfu +*.epf +*.erf + +# Временные и резервные +*.tmp +*.bak +*.~* +*~ +*.old +*.orig + +# Логи и дампы +*.log +*.lgp +*.lgf + +# ОС +Thumbs.db +ehthumbs.db +Desktop.ini +desktop.ini +.DS_Store +.AppleDouble +.LSOverride + +# IDE / редакторы +.vs/ +.vscode/ +.idea/ +*.suo +*.user +*.userosscache +*.sln.docstates + +# Отладка / кэш +Debug/ +debug/ +cache/ +*.pfl +'@ + +function Test-GitAvailable { + try { + $null = Get-Command git -ErrorAction Stop + return $true + } catch { + return $false + } +} + +function Test-GitRepository { + if (Test-Path -LiteralPath '.git') { return $true } + return $false +} + +function Set-LocalGitConfig { + param([string]$Key, [string]$Value) + if ($DryRun) { + Write-Host " [DRY-RUN] git config --local $Key $Value" + return + } + & git config --local $Key $Value + if ($LASTEXITCODE -ne 0) { + throw "Не удалось установить git config $Key=$Value" + } + Write-DebugMsg "config $Key=$Value" +} + +function Write-Utf8File { + param( + [string]$Path, + [string]$Content + ) + # UTF-8 без BOM: для .gitattributes/.gitignore достаточно; BOM у *.bsl + # — содержимое выгрузки конфигуратора, не этих служебных файлов. + $normalized = $Content -replace "`r`n", "`n" -replace "`r", "`n" + $normalized = $normalized.TrimEnd("`n") + "`n" + $encoding = New-Object System.Text.UTF8Encoding($false) + [System.IO.File]::WriteAllText((Join-Path (Get-Location) $Path), $normalized, $encoding) +} + +function Write-FileSafe { + param( + [string]$Path, + [string]$Content, + [string]$Label + ) + + if ((Test-Path -LiteralPath $Path) -and -not $Force) { + Write-WarnMsg "$Label уже существует — пропуск (используйте -Force)" + return + } + + if ($DryRun) { + if (Test-Path -LiteralPath $Path) { + Write-Host " [DRY-RUN] перезаписать $Path (бэкап $Path.bak)" + } else { + Write-Host " [DRY-RUN] создать $Path" + } + return + } + + if (Test-Path -LiteralPath $Path) { + Copy-Item -LiteralPath $Path -Destination "$Path.bak" -Force + Write-Info "Бэкап: $Path.bak" + } + + Write-Utf8File -Path $Path -Content $Content + Write-Success "Записан $Path" +} + +# ============================================================ +# Основной ход +# ============================================================ +Write-Step "Проверка окружения (ОС: Windows)..." + +if (-not (Test-GitAvailable)) { + Write-ErrMsg "Git не установлен или недоступен в PATH" + exit 1 +} + +if (-not (Test-GitRepository)) { + if ($Init) { + if ($DryRun) { + Write-Host " [DRY-RUN] git init" + } else { + & git init + if ($LASTEXITCODE -ne 0) { throw "git init завершился с ошибкой" } + Write-Success "Выполнен git init" + } + } else { + Write-ErrMsg "Текущая папка не является Git-репозиторием" + Write-Host " Запустите из корня репозитория или добавьте -Init" -ForegroundColor Red + exit 1 + } +} + +Write-Success "Окружение проверено" + +Write-Step "Локальные настройки Git..." + +# Кириллические пути без \320\... +Set-LocalGitConfig 'core.quotepath' 'false' +# Длинные пути Windows / глубокие деревья метаданных 1С +Set-LocalGitConfig 'core.longpaths' 'true' +# Кодировки UI и коммитов +Set-LocalGitConfig 'gui.encoding' 'utf-8' +Set-LocalGitConfig 'i18n.commitEncoding' 'utf-8' +# EOL полностью через .gitattributes +Set-LocalGitConfig 'core.autocrlf' 'false' +Set-LocalGitConfig 'core.safecrlf' 'warn' +# Рекомендации 1С:ГитКонвертер для крупных деревьев метаданных +Set-LocalGitConfig 'diff.renames' 'false' +Set-LocalGitConfig 'diff.renameLimit' '1' + +if ($DryRun) { + Write-Info "Локальный git config (dry-run)" +} else { + Write-Success "Локальный git config применён" +} + +Write-Step "Файл .gitattributes..." +Write-FileSafe -Path '.gitattributes' -Content $GitAttributesContent -Label '.gitattributes' + +if (-not $NoGitignore) { + Write-Step "Файл .gitignore..." + Write-FileSafe -Path '.gitignore' -Content $GitIgnoreContent -Label '.gitignore' +} else { + Write-Info "Пропуск .gitignore (-NoGitignore)" +} + +if ($Renormalize) { + Write-Step "Нормализация индекса (git add --renormalize .)..." + if ($DryRun) { + Write-Host " [DRY-RUN] git add --renormalize ." + } else { + & git add --renormalize . + if ($LASTEXITCODE -ne 0) { throw "git add --renormalize завершился с ошибкой" } + Write-Success "Индекс перенормализован" + Write-WarnMsg "Проверьте git status — возможны массовые изменения EOL" + } +} + +if (-not $Quiet) { + Write-Host "" + Write-Host "============================================================" + Write-Host "📊 Итог настройки под выгрузку конфигуратора 1С" -ForegroundColor Cyan + Write-Host "============================================================" + Write-Host " ОС: Windows" + Write-Host " Каталог: $(Get-Location)" + Write-Host " Encoding: UTF-8 (BOM сохраняется в содержимом файлов)" + Write-Host " EOL (выгрузка): CRLF в рабочей копии (*.bsl, *.xml, …)" + Write-Host " core.autocrlf: false (управляет .gitattributes)" + Write-Host " core.quotepath: false" + Write-Host " core.longpaths: true" + if ($DryRun) { + Write-Host "" + Write-Host "⚠️ Режим -DryRun: изменения НЕ применены" -ForegroundColor Yellow + } else { + Write-Host "" + Write-Host "✅ Готово" -ForegroundColor Green + Write-Host "" + Write-Host "Следующие шаги:" -ForegroundColor Cyan + Write-Host " 1. git status" + Write-Host " 2. git add .gitattributes .gitignore" + Write-Host ' 3. git commit -m "Настройки Git для выгрузки конфигуратора 1С"' + if (-not $Renormalize) { + Write-Host " 4. При необходимости нормализовать EOL:" + Write-Host " .\setup-1c-repo.ps1 -Renormalize" + Write-Host " или: git add --renormalize ." + } + } + Write-Host "============================================================" + Write-Host "" +} + +exit 0 diff --git a/setup-1c-repo.sh b/setup-1c-repo.sh new file mode 100644 index 0000000..ad2e431 --- /dev/null +++ b/setup-1c-repo.sh @@ -0,0 +1,427 @@ +#!/bin/bash +# ============================================================ +# setup-1c-repo.sh - Настройка Git-репозитория под выгрузку 1С (конфигуратор) +# +# Версия: 1.2.0 +# Автор: Michael BAG +# Репозиторий: https://git.p7net.ru/tools/git_man +# +# Платформы: Linux, macOS (на Windows используйте setup-1c-repo.ps1) +# +# Использование: +# ./setup-1c-repo.sh [--help] [--version] [--dry-run] [--force] +# [--init] [--renormalize] [--no-gitignore] +# [--verbose] [--quiet] +# +# Описание: +# Включает локальные настройки Git в текущей папке (cwd) для проектов +# с выгрузкой конфигурации/расширения из конфигуратора 1С: +# - UTF-8 с BOM (как у конфигуратора; BOM хранится как часть содержимого) +# - CRLF в рабочей копии для *.bsl / *.xml и др. текстовых файлов выгрузки +# - корректное отображение кириллических путей (core.quotepath=false) +# - длинные пути (core.longpaths=true), Unicode на macOS +# - создаёт/обновляет .gitattributes и .gitignore +# ============================================================ + +set -e + +SCRIPT_VERSION="1.2.0" + +# ============================================================ +# Справка +# ============================================================ +show_help() { + cat << EOF +============================================================ +📦 setup-1c-repo.sh v${SCRIPT_VERSION} — настройка репозитория под 1С +============================================================ + +ОПИСАНИЕ: + Настраивает локальный Git-репозиторий в ТЕКУЩЕЙ папке под + выгрузку из конфигуратора 1С (UTF-8 BOM + CRLF). + +ИСПОЛЬЗОВАНИЕ: + ./setup-1c-repo.sh [ОПЦИИ] + +ОПЦИИ: + --help, -h Показать эту справку + --version, -V Показать версию скрипта + --dry-run Только показать, что будет сделано + --force, -f Перезаписать существующие .gitattributes / .gitignore + --init Выполнить git init, если папка ещё не репозиторий + --renormalize После настройки: git add --renormalize . + --no-gitignore Не создавать/не менять .gitignore + --verbose, -v Подробный вывод + --quiet, -q Минимальный вывод (только ошибки) + +ЧТО ДЕЛАЕТ: + 1. Локальный git config (quotepath, encoding, autocrlf, longpaths, …) + 2. Файл .gitattributes — EOL/binary для файлов выгрузки 1С + 3. Файл .gitignore — типичные исключения (*.cf, *.cfe, …) + +ПРИМЕРЫ: + ./setup-1c-repo.sh + ./setup-1c-repo.sh --force --renormalize + ./setup-1c-repo.sh --init --dry-run + +============================================================ +EOF + exit 0 +} + +show_version() { + echo "setup-1c-repo.sh ${SCRIPT_VERSION}" + exit 0 +} + +# ============================================================ +# Аргументы +# ============================================================ +DRY_RUN=false +FORCE=false +VERBOSE=false +QUIET=false +DO_INIT=false +RENORMALIZE=false +NO_GITIGNORE=false + +while [[ $# -gt 0 ]]; do + case $1 in + --help|-h) show_help ;; + --version|-V) show_version ;; + --dry-run) DRY_RUN=true; shift ;; + --force|-f) FORCE=true; shift ;; + --init) DO_INIT=true; shift ;; + --renormalize) RENORMALIZE=true; shift ;; + --no-gitignore) NO_GITIGNORE=true; shift ;; + --verbose|-v) VERBOSE=true; shift ;; + --quiet|-q) QUIET=true; shift ;; + *) + echo -e "\033[0;31m❌ Неизвестная опция: $1\033[0m" >&2 + echo " Используйте --help для справки" >&2 + exit 1 + ;; + esac +done + +# ============================================================ +# Логирование +# ============================================================ +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' +else + RED=''; GREEN=''; YELLOW=''; BLUE=''; CYAN=''; MAGENTA=''; NC='' +fi + +log_info() { [ "$QUIET" != true ] && echo -e "${CYAN}ℹ️ $1${NC}"; } +log_success() { [ "$QUIET" != true ] && echo -e "${GREEN}✅ $1${NC}"; } +log_warning() { [ "$QUIET" != true ] && echo -e "${YELLOW}⚠️ $1${NC}"; } +log_error() { echo -e "${RED}❌ $1${NC}" >&2; } +log_debug() { [ "$VERBOSE" = true ] && [ "$QUIET" != true ] && echo -e "${BLUE}🔍 $1${NC}"; } +log_step() { [ "$QUIET" != true ] && echo -e "${MAGENTA}▶ $1${NC}"; } + +# ============================================================ +# Определение ОС +# ============================================================ +OS_NAME="$(uname -s 2>/dev/null || echo unknown)" +case "$OS_NAME" in + Darwin*) OS_KIND="macos" ;; + Linux*) OS_KIND="linux" ;; + MINGW*|MSYS*|CYGWIN*) OS_KIND="windows-bash" ;; + *) OS_KIND="unix" ;; +esac + +# ============================================================ +# Шаблоны файлов +# ============================================================ +# Конфигуратор 1С выгружает текстовые файлы в UTF-8 с BOM и с CRLF. +# Git хранит BOM как часть содержимого; eol=crlf даёт CRLF в рабочей копии +# на любой ОС — совпадает с повторной выгрузкой из конфигуратора. +GITATTRIBUTES_CONTENT='# .gitattributes — выгрузка конфигуратора 1С (UTF-8 BOM + CRLF) +# Создано setup-1c-repo.sh (git_man). Не удаляйте без необходимости. +# +# Правило: текстовые файлы выгрузки — text + eol=crlf (рабочая копия = CRLF, +# в объекте Git нормализуется к LF). Бинарники — binary (без конвертации EOL). + +* text=auto + +# --- Текстовые файлы выгрузки конфигуратора --- +*.bsl text eol=crlf +*.os text eol=crlf +*.xml text eol=crlf +*.txt text eol=crlf +*.html text eol=crlf +*.htm text eol=crlf +*.xsd text eol=crlf +*.xslt text eol=crlf +*.xsl text eol=crlf +*.Form text eol=crlf +*.Module text eol=crlf +*.max text eol=crlf + +# --- Служебные / документация репозитория (LF) --- +*.md text eol=lf +*.json text eol=lf +*.yml text eol=lf +*.yaml text eol=lf +*.sh text eol=lf +*.gitignore text eol=lf +*.gitattributes text eol=lf +.editorconfig text eol=lf + +# --- Скрипты Windows --- +*.bat text eol=crlf +*.cmd text eol=crlf +*.ps1 text eol=crlf + +# --- Бинарные артефакты 1С и медиа --- +*.bin binary +*.cf binary +*.cfe binary +*.cfu binary +*.epf binary +*.erf binary +*.axdt binary +*.addin binary + +*.png binary +*.jpg binary +*.jpeg binary +*.gif binary +*.bmp binary +*.ico binary +*.webp binary +*.tif binary +*.tiff binary +*.svg -text + +*.zip binary +*.rar binary +*.7z binary +*.gz binary + +*.xls binary +*.xlsx binary +*.xlsm binary +*.doc binary +*.docx binary +*.pdf binary +*.rtf binary + +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary +*.eot binary +' + +GITIGNORE_CONTENT='# .gitignore — типовые исключения для проектов 1С (конфигуратор) +# Создано setup-1c-repo.sh (git_man) + +# Бинарные выгрузки конфигурации / расширений / обработок +*.cf +*.cfe +*.cfu +*.epf +*.erf + +# Временные и резервные +*.tmp +*.bak +*.~* +*~ +*.old +*.orig + +# Логи и дампы +*.log +*.lgp +*.lgf + +# ОС +Thumbs.db +ehthumbs.db +Desktop.ini +desktop.ini +.DS_Store +.AppleDouble +.LSOverride + +# IDE / редакторы +.vs/ +.vscode/ +.idea/ +*.suo +*.user +*.userosscache +*.sln.docstates + +# Отладка / кэш +Debug/ +debug/ +cache/ +*.pfl +' + +# ============================================================ +# Проверка окружения +# ============================================================ +log_step "Проверка окружения (ОС: ${OS_KIND})..." + +if ! command -v git >/dev/null 2>&1; then + log_error "Git не установлен" + exit 1 +fi + +if [ ! -d ".git" ] && [ ! -f ".git" ]; then + if [ "$DO_INIT" = true ]; then + if [ "$DRY_RUN" = true ]; then + echo " [DRY-RUN] git init" + else + git init + log_success "Выполнен git init" + fi + else + log_error "Текущая папка не является Git-репозиторием" + echo " Запустите из корня репозитория или добавьте --init" >&2 + exit 1 + fi +fi + +log_success "Окружение проверено" + +# ============================================================ +# Локальный git config +# ============================================================ +set_local_config() { + local key="$1" + local value="$2" + if [ "$DRY_RUN" = true ]; then + echo " [DRY-RUN] git config --local $key $value" + return 0 + fi + git config --local "$key" "$value" + log_debug "config $key=$value" +} + +log_step "Локальные настройки Git..." + +# Кириллические пути без \320\... +set_local_config core.quotepath false +# Длинные пути (особенно Windows / сетевые диски / глубокие деревья 1С) +set_local_config core.longpaths true +# Кодировки UI и коммитов +set_local_config gui.encoding utf-8 +set_local_config i18n.commitEncoding utf-8 +# EOL полностью через .gitattributes (без двойной конвертации) +set_local_config core.autocrlf false +set_local_config core.safecrlf warn +# Рекомендации 1С:ГитКонвертер для крупных деревьев метаданных +set_local_config diff.renames false +set_local_config diff.renameLimit 1 + +# macOS: NFD/NFC для имён файлов с кириллицей +if [ "$OS_KIND" = "macos" ]; then + set_local_config core.precomposeunicode true + log_info "macOS: core.precomposeunicode=true" +fi + +if [ "$DRY_RUN" = true ]; then + log_info "Локальный git config (dry-run)" +else + log_success "Локальный git config применён" +fi + +# ============================================================ +# Запись файла с бэкапом +# ============================================================ +write_file_safe() { + local path="$1" + local content="$2" + local label="$3" + + if [ -f "$path" ] && [ "$FORCE" != true ]; then + log_warning "$label уже существует — пропуск (используйте --force)" + return 0 + fi + + if [ "$DRY_RUN" = true ]; then + if [ -f "$path" ]; then + echo " [DRY-RUN] перезаписать $path (бэкап ${path}.bak)" + else + echo " [DRY-RUN] создать $path" + fi + return 0 + fi + + if [ -f "$path" ]; then + cp -f "$path" "${path}.bak" + log_info "Бэкап: ${path}.bak" + fi + + # Пишем через printf, чтобы сохранить финальный перевод строки + printf '%s\n' "$content" > "$path" + log_success "Записан $path" +} + +log_step "Файл .gitattributes..." +write_file_safe ".gitattributes" "$GITATTRIBUTES_CONTENT" ".gitattributes" + +if [ "$NO_GITIGNORE" != true ]; then + log_step "Файл .gitignore..." + write_file_safe ".gitignore" "$GITIGNORE_CONTENT" ".gitignore" +else + log_info "Пропуск .gitignore (--no-gitignore)" +fi + +# ============================================================ +# Renormalize +# ============================================================ +if [ "$RENORMALIZE" = true ]; then + log_step "Нормализация индекса (git add --renormalize .)..." + if [ "$DRY_RUN" = true ]; then + echo " [DRY-RUN] git add --renormalize ." + else + git add --renormalize . + log_success "Индекс перенормализован" + log_warning "Проверьте git status — возможны массовые изменения EOL" + fi +fi + +# ============================================================ +# Итог +# ============================================================ +if [ "$QUIET" != true ]; then + echo "" + echo "============================================================" + echo -e "${CYAN}📊 Итог настройки под выгрузку конфигуратора 1С${NC}" + echo "============================================================" + echo " ОС: $OS_KIND ($OS_NAME)" + echo " Каталог: $(pwd)" + echo " Encoding: UTF-8 (BOM сохраняется в содержимом файлов)" + echo " EOL (выгрузка): CRLF в рабочей копии (*.bsl, *.xml, …)" + echo " core.autocrlf: false (управляет .gitattributes)" + echo " core.quotepath: false" + if [ "$DRY_RUN" = true ]; then + echo "" + echo -e "${YELLOW}⚠️ Режим --dry-run: изменения НЕ применены${NC}" + else + echo "" + echo -e "${GREEN}✅ Готово${NC}" + echo "" + echo -e "${CYAN}Следующие шаги:${NC}" + echo " 1. git status" + echo " 2. git add .gitattributes .gitignore" + echo " 3. git commit -m \"Настройки Git для выгрузки конфигуратора 1С\"" + if [ "$RENORMALIZE" != true ]; then + echo " 4. При необходимости нормализовать EOL:" + echo " ./setup-1c-repo.sh --renormalize" + echo " или: git add --renormalize ." + fi + fi + echo "============================================================" + echo "" +fi + +exit 0