From 8c1fae5c54dec8cf5189b7f00a88869fdcbbad9a Mon Sep 17 00:00:00 2001 From: Mikhail Kudryavtsev Date: Mon, 27 Jul 2026 22:57:06 +0300 Subject: [PATCH] =?UTF-8?q?=D0=93=D0=BE=D1=82=D0=BE=D0=B2=D0=BE=20(v1.2.2)?= =?UTF-8?q?:=20=D0=B1=D0=B5=D0=B7=20--path=20/=20-Path=20=D1=81=D0=BA?= =?UTF-8?q?=D1=80=D0=B8=D0=BF=D1=82=20=D1=81=D1=80=D0=B0=D0=B7=D1=83=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=B2=D0=B5=D1=80=D1=88=D0=B0=D0=B5=D1=82=D1=81?= =?UTF-8?q?=D1=8F=20=D1=81=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=BE=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 34 +++++++++ README.md | 26 ++++--- setup-1c-repo.cmd | 2 +- setup-1c-repo.ps1 | 189 ++++++++++++++++++++++++++++++---------------- setup-1c-repo.sh | 132 +++++++++++++++++++++++++------- 5 files changed, 277 insertions(+), 106 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c78f2be..d7a2d4c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,38 @@ --- +## [1.2.2] - 2026-07-27 + +### Изменено + +- 🔒 **`setup-1c-repo`**: путь к репозиторию **обязателен** + - Без `--path` / `-Path` (или `--repo` / `-Repo`) скрипт завершается с ошибкой + - Автонастройка текущей папки (cwd) отключена + - Для текущей папки явно: `--path .` / `-Path .` + +### Документация + +- 📖 Обновлён **README.md** +- 📝 Обновлён **CHANGELOG.md** + +--- + +## [1.2.1] - 2026-07-27 + +### Добавлено + +- 📁 Опция целевой папки репозитория в **`setup-1c-repo`** + - sh: `--path DIR` / `--repo DIR` (также `--path=DIR`) + - ps1: `-Path` / `-Repo` / `-RepoPath` + - С `--init` / `-Init` отсутствующий каталог создаётся + +### Документация + +- 📖 Обновлён **README.md** +- 📝 Обновлён **CHANGELOG.md** + +--- + ## [1.2.0] - 2026-07-27 ### Добавлено @@ -153,6 +185,8 @@ | Версия | Дата | Изменения | |--------|------|-----------| +| **1.2.2** | 2026-07-27 | `setup-1c-repo`: путь обязателен, без cwd по умолчанию | +| **1.2.1** | 2026-07-27 | `setup-1c-repo`: опция `--path` / `-Path` | | **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 | Добавлена настройка игнорирования подмодулей | diff --git a/README.md b/README.md index 5637f62..a36373e 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Git Management Tools (`git_man`) -**Версия:** 1.2.0 +**Версия:** 1.2.2 Набор скриптов и утилит для управления Git-репозиториями, работы с подмодулями и автоматизации повседневных задач. @@ -40,7 +40,7 @@ ### `setup-1c-repo` — настройка репозитория под 1С **Описание:** -Включает локальные настройки Git в **текущей папке** (каталог запуска) под выгрузку конфигурации/расширения из **конфигуратора 1С**: UTF-8 с BOM, CRLF в рабочей копии для файлов выгрузки, корректные пути с кириллицей, длинные пути, `.gitattributes` и `.gitignore`. +Включает локальные настройки Git в **указанной папке** (`--path` / `-Path`, **обязательно**) под выгрузку конфигурации/расширения из **конфигуратора 1С**: UTF-8 с BOM, CRLF в рабочей копии для файлов выгрузки, корректные пути с кириллицей, длинные пути, `.gitattributes` и `.gitignore`. Без пути скрипт не выполняется. | Платформа | Скрипт | |-----------|--------| @@ -49,16 +49,16 @@ **Использование (Windows):** ```powershell -.\setup-1c-repo.ps1 -.\setup-1c-repo.ps1 -Force -Renormalize -.\setup-1c-repo.cmd -Init -DryRun +.\setup-1c-repo.ps1 -Path D:\projects\uas_ep -Force +.\setup-1c-repo.ps1 -Path . -Force -Renormalize +.\setup-1c-repo.cmd -Path C:\tmp\new-1c -Init -DryRun ``` **Использование (macOS / Linux):** ```bash -./setup-1c-repo.sh -./setup-1c-repo.sh --force --renormalize -./setup-1c-repo.sh --init --dry-run +./setup-1c-repo.sh --path /projects/uas_ep --force +./setup-1c-repo.sh --path . --force --renormalize +./setup-1c-repo.sh --path /tmp/new-1c --init --dry-run ``` **Опции:** @@ -66,10 +66,12 @@ | Опция (sh / ps1) | Описание | |------------------|----------| | `--help` / `-Help` | Справка | -| `--version` / `-Version` | Версия скрипта (`1.2.0`) | +| `--version` / `-Version` | Версия скрипта (`1.2.2`) | +| `--path DIR` / `-Path DIR` | Папка репозитория (**обязательно**) | +| `--repo DIR` / `-Repo DIR` | Синоним `--path` / `-Path` | | `--dry-run` / `-DryRun` | Только показать действия | | `--force` / `-Force` | Перезаписать `.gitattributes` и `.gitignore` | -| `--init` / `-Init` | `git init`, если папка ещё не репозиторий | +| `--init` / `-Init` | `git init`, если папка ещё не репозиторий (создаёт каталог при необходимости) | | `--renormalize` / `-Renormalize` | `git add --renormalize .` после настройки | | `--no-gitignore` / `-NoGitignore` | Не трогать `.gitignore` | | `--verbose` / `-Verbose` | Подробный вывод | @@ -248,12 +250,14 @@ git submodule add https://git.p7net.ru/tools/git_man.git tools/git_man ## 📌 История версий -Текущая версия: **1.2.0** (2026-07-27). +Текущая версия: **1.2.2** (2026-07-27). Кратко по релизам — см. [CHANGELOG.md](./CHANGELOG.md). | Версия | Дата | Суть | |--------|------|------| +| **1.2.2** | 2026-07-27 | `setup-1c-repo`: путь обязателен, без cwd по умолчанию | +| **1.2.1** | 2026-07-27 | `setup-1c-repo`: опция `--path` / `-Path` | | **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` для подмодулей | diff --git a/setup-1c-repo.cmd b/setup-1c-repo.cmd index affe802..a1f4b94 100644 --- a/setup-1c-repo.cmd +++ b/setup-1c-repo.cmd @@ -2,7 +2,7 @@ setlocal EnableExtensions REM ============================================================ REM setup-1c-repo.cmd - обёртка Windows для setup-1c-repo.ps1 -REM Версия: 1.2.0 +REM Версия: 1.2.2 REM Запуск из корня Git-репозитория 1С-проекта (выгрузка конфигуратора). REM ============================================================ diff --git a/setup-1c-repo.ps1 b/setup-1c-repo.ps1 index 3363f5c..c9ba6c7 100644 --- a/setup-1c-repo.ps1 +++ b/setup-1c-repo.ps1 @@ -1,7 +1,7 @@ # ============================================================ # setup-1c-repo.ps1 - Настройка Git-репозитория под выгрузку 1С (конфигуратор) # -# Версия: 1.2.0 +# Версия: 1.2.2 # Автор: Michael BAG # Репозиторий: https://git.p7net.ru/tools/git_man # @@ -9,12 +9,12 @@ # Для Linux/macOS используйте setup-1c-repo.sh # # Использование: -# .\setup-1c-repo.ps1 [-DryRun] [-Force] [-Init] [-Renormalize] [-NoGitignore] -# [-Verbose] [-Quiet] [-Help] [-Version] +# .\setup-1c-repo.ps1 -Path DIR [-DryRun] [-Force] [-Init] [-Renormalize] +# [-NoGitignore] [-Verbose] [-Quiet] [-Help] [-Version] # # Описание: -# Включает локальные настройки Git в текущей папке (cwd) для проектов -# с выгрузкой конфигурации/расширения из конфигуратора 1С: +# Включает локальные настройки Git в указанной папке (-Path / -Repo; +# обязательный параметр) для проектов с выгрузкой из конфигуратора 1С: # - UTF-8 с BOM (как у конфигуратора; BOM хранится как часть содержимого) # - CRLF в рабочей копии для *.bsl / *.xml и др. текстовых файлов выгрузки # - корректное отображение кириллических путей (core.quotepath=false) @@ -24,6 +24,10 @@ [CmdletBinding()] param( + [Parameter()] + [Alias('Repo', 'RepoPath')] + [string]$Path, + [switch]$DryRun, [Alias('f')] [switch]$Force, @@ -39,7 +43,7 @@ param( ) $ErrorActionPreference = 'Stop' -$ScriptVersion = '1.2.0' +$ScriptVersion = '1.2.2' function Show-Help { @" @@ -48,28 +52,32 @@ function Show-Help { ============================================================ ОПИСАНИЕ: - Настраивает локальный Git-репозиторий в ТЕКУЩЕЙ папке под - выгрузку из конфигуратора 1С (UTF-8 BOM + CRLF). + Настраивает локальный Git-репозиторий под выгрузку из + конфигуратора 1С (UTF-8 BOM + CRLF). + Путь к репозиторию обязателен: -Path / -Repo. ИСПОЛЬЗОВАНИЕ: - .\setup-1c-repo.ps1 [ОПЦИИ] - .\setup-1c-repo.cmd [ОПЦИИ] + .\setup-1c-repo.ps1 -Path DIR [ОПЦИИ] + .\setup-1c-repo.cmd -Path DIR [ОПЦИИ] ОПЦИИ: -Help, -h Показать эту справку -Version, -V Показать версию скрипта + -Path, -Repo DIR Папка репозитория для настройки (обязательно) -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 + .\setup-1c-repo.ps1 -Path D:\projects\uas_ep -Force + .\setup-1c-repo.ps1 -Repo ..\my-1c-dump -Init + .\setup-1c-repo.ps1 -Path . -Force -Renormalize + .\setup-1c-repo.ps1 -Path C:\tmp\new-1c -Init -DryRun ============================================================ "@ | Write-Host @@ -242,91 +250,138 @@ function Test-GitAvailable { } } -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 + [string]$FilePath, + [string]$Content, + [string]$BaseDir ) # 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) + $fullPath = Join-Path $BaseDir $FilePath + [System.IO.File]::WriteAllText($fullPath, $normalized, $encoding) } function Write-FileSafe { param( - [string]$Path, + [string]$FilePath, [string]$Content, - [string]$Label + [string]$Label, + [string]$BaseDir ) - if ((Test-Path -LiteralPath $Path) -and -not $Force) { + $fullPath = Join-Path $BaseDir $FilePath + + if ((Test-Path -LiteralPath $fullPath) -and -not $Force) { Write-WarnMsg "$Label уже существует — пропуск (используйте -Force)" return } if ($DryRun) { - if (Test-Path -LiteralPath $Path) { - Write-Host " [DRY-RUN] перезаписать $Path (бэкап $Path.bak)" + if (Test-Path -LiteralPath $fullPath) { + Write-Host " [DRY-RUN] перезаписать $fullPath (бэкап $FilePath.bak)" } else { - Write-Host " [DRY-RUN] создать $Path" + Write-Host " [DRY-RUN] создать $fullPath" } return } - if (Test-Path -LiteralPath $Path) { - Copy-Item -LiteralPath $Path -Destination "$Path.bak" -Force - Write-Info "Бэкап: $Path.bak" + if (Test-Path -LiteralPath $fullPath) { + Copy-Item -LiteralPath $fullPath -Destination "$fullPath.bak" -Force + Write-Info "Бэкап: $FilePath.bak" } - Write-Utf8File -Path $Path -Content $Content - Write-Success "Записан $Path" + Write-Utf8File -FilePath $FilePath -Content $Content -BaseDir $BaseDir + Write-Success "Записан $FilePath" } +function Set-LocalGitConfig { + param( + [string]$Key, + [string]$Value, + [string]$WorkTree + ) + if ($DryRun) { + Write-Host " [DRY-RUN] git -C `"$WorkTree`" config --local $Key $Value" + return + } + & git -C $WorkTree config --local $Key $Value + if ($LASTEXITCODE -ne 0) { + throw "Не удалось установить git config $Key=$Value" + } + Write-DebugMsg "config $Key=$Value" +} + +# ============================================================ +# Целевой каталог +# ============================================================ +if ([string]::IsNullOrWhiteSpace($Path)) { + Write-ErrMsg "Не указан путь к репозиторию" + Write-Host " Обязательно: -Path DIR или -Repo DIR" -ForegroundColor Red + Write-Host " Справка: .\setup-1c-repo.ps1 -Help" -ForegroundColor Red + exit 1 +} + +$TargetDir = $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath($Path) + # ============================================================ # Основной ход # ============================================================ Write-Step "Проверка окружения (ОС: Windows)..." +Write-Info "Целевой каталог: $TargetDir" if (-not (Test-GitAvailable)) { Write-ErrMsg "Git не установлен или недоступен в PATH" exit 1 } -if (-not (Test-GitRepository)) { +$repoReady = $false + +if (-not (Test-Path -LiteralPath $TargetDir -PathType Container)) { if ($Init) { if ($DryRun) { - Write-Host " [DRY-RUN] git init" + Write-Host " [DRY-RUN] New-Item -ItemType Directory `"$TargetDir`"" + Write-Host " [DRY-RUN] git -C `"$TargetDir`" init" } else { - & git init + New-Item -ItemType Directory -Path $TargetDir -Force | Out-Null + Write-Success "Создан каталог: $TargetDir" + & git -C $TargetDir init if ($LASTEXITCODE -ne 0) { throw "git init завершился с ошибкой" } Write-Success "Выполнен git init" + $repoReady = $true } } else { - Write-ErrMsg "Текущая папка не является Git-репозиторием" - Write-Host " Запустите из корня репозитория или добавьте -Init" -ForegroundColor Red + Write-ErrMsg "Папка не существует: $TargetDir" + Write-Host " Укажите существующий путь или добавьте -Init" -ForegroundColor Red exit 1 } +} else { + $gitMarker = Join-Path $TargetDir '.git' + if (Test-Path -LiteralPath $gitMarker) { + $repoReady = $true + } elseif ($Init) { + if ($DryRun) { + Write-Host " [DRY-RUN] git -C `"$TargetDir`" init" + } else { + & git -C $TargetDir init + if ($LASTEXITCODE -ne 0) { throw "git init завершился с ошибкой" } + Write-Success "Выполнен git init" + $repoReady = $true + } + } else { + Write-ErrMsg "Папка не является Git-репозиторием: $TargetDir" + Write-Host " Укажите корень репозитория (-Path) или добавьте -Init" -ForegroundColor Red + exit 1 + } +} + +# В dry-run без реального каталога дальше только показываем действия +if (-not $DryRun -and -not $repoReady -and -not (Test-Path -LiteralPath (Join-Path $TargetDir '.git'))) { + Write-ErrMsg "Репозиторий не готов: $TargetDir" + exit 1 } Write-Success "Окружение проверено" @@ -334,18 +389,18 @@ Write-Success "Окружение проверено" Write-Step "Локальные настройки Git..." # Кириллические пути без \320\... -Set-LocalGitConfig 'core.quotepath' 'false' +Set-LocalGitConfig -Key 'core.quotepath' -Value 'false' -WorkTree $TargetDir # Длинные пути Windows / глубокие деревья метаданных 1С -Set-LocalGitConfig 'core.longpaths' 'true' +Set-LocalGitConfig -Key 'core.longpaths' -Value 'true' -WorkTree $TargetDir # Кодировки UI и коммитов -Set-LocalGitConfig 'gui.encoding' 'utf-8' -Set-LocalGitConfig 'i18n.commitEncoding' 'utf-8' +Set-LocalGitConfig -Key 'gui.encoding' -Value 'utf-8' -WorkTree $TargetDir +Set-LocalGitConfig -Key 'i18n.commitEncoding' -Value 'utf-8' -WorkTree $TargetDir # EOL полностью через .gitattributes -Set-LocalGitConfig 'core.autocrlf' 'false' -Set-LocalGitConfig 'core.safecrlf' 'warn' +Set-LocalGitConfig -Key 'core.autocrlf' -Value 'false' -WorkTree $TargetDir +Set-LocalGitConfig -Key 'core.safecrlf' -Value 'warn' -WorkTree $TargetDir # Рекомендации 1С:ГитКонвертер для крупных деревьев метаданных -Set-LocalGitConfig 'diff.renames' 'false' -Set-LocalGitConfig 'diff.renameLimit' '1' +Set-LocalGitConfig -Key 'diff.renames' -Value 'false' -WorkTree $TargetDir +Set-LocalGitConfig -Key 'diff.renameLimit' -Value '1' -WorkTree $TargetDir if ($DryRun) { Write-Info "Локальный git config (dry-run)" @@ -354,11 +409,11 @@ if ($DryRun) { } Write-Step "Файл .gitattributes..." -Write-FileSafe -Path '.gitattributes' -Content $GitAttributesContent -Label '.gitattributes' +Write-FileSafe -FilePath '.gitattributes' -Content $GitAttributesContent -Label '.gitattributes' -BaseDir $TargetDir if (-not $NoGitignore) { Write-Step "Файл .gitignore..." - Write-FileSafe -Path '.gitignore' -Content $GitIgnoreContent -Label '.gitignore' + Write-FileSafe -FilePath '.gitignore' -Content $GitIgnoreContent -Label '.gitignore' -BaseDir $TargetDir } else { Write-Info "Пропуск .gitignore (-NoGitignore)" } @@ -366,9 +421,9 @@ if (-not $NoGitignore) { if ($Renormalize) { Write-Step "Нормализация индекса (git add --renormalize .)..." if ($DryRun) { - Write-Host " [DRY-RUN] git add --renormalize ." + Write-Host " [DRY-RUN] git -C `"$TargetDir`" add --renormalize ." } else { - & git add --renormalize . + & git -C $TargetDir add --renormalize . if ($LASTEXITCODE -ne 0) { throw "git add --renormalize завершился с ошибкой" } Write-Success "Индекс перенормализован" Write-WarnMsg "Проверьте git status — возможны массовые изменения EOL" @@ -381,7 +436,7 @@ if (-not $Quiet) { Write-Host "📊 Итог настройки под выгрузку конфигуратора 1С" -ForegroundColor Cyan Write-Host "============================================================" Write-Host " ОС: Windows" - Write-Host " Каталог: $(Get-Location)" + Write-Host " Каталог: $TargetDir" Write-Host " Encoding: UTF-8 (BOM сохраняется в содержимом файлов)" Write-Host " EOL (выгрузка): CRLF в рабочей копии (*.bsl, *.xml, …)" Write-Host " core.autocrlf: false (управляет .gitattributes)" @@ -395,13 +450,13 @@ if (-not $Quiet) { Write-Host "✅ Готово" -ForegroundColor Green Write-Host "" Write-Host "Следующие шаги:" -ForegroundColor Cyan - Write-Host " 1. git status" - Write-Host " 2. git add .gitattributes .gitignore" + Write-Host " 1. git -C `"$TargetDir`" status" + Write-Host " 2. git -C `"$TargetDir`" 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 " .\setup-1c-repo.ps1 -Path `"$TargetDir`" -Renormalize" + Write-Host " или: git -C `"$TargetDir`" add --renormalize ." } } Write-Host "============================================================" diff --git a/setup-1c-repo.sh b/setup-1c-repo.sh index ad2e431..a298f2c 100644 --- a/setup-1c-repo.sh +++ b/setup-1c-repo.sh @@ -2,20 +2,20 @@ # ============================================================ # setup-1c-repo.sh - Настройка Git-репозитория под выгрузку 1С (конфигуратор) # -# Версия: 1.2.0 +# Версия: 1.2.2 # Автор: 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] +# ./setup-1c-repo.sh --path DIR [--help] [--version] [--dry-run] [--force] # [--init] [--renormalize] [--no-gitignore] # [--verbose] [--quiet] # # Описание: -# Включает локальные настройки Git в текущей папке (cwd) для проектов -# с выгрузкой конфигурации/расширения из конфигуратора 1С: +# Включает локальные настройки Git в указанной папке (--path / --repo; +# обязательный параметр) для проектов с выгрузкой из конфигуратора 1С: # - UTF-8 с BOM (как у конфигуратора; BOM хранится как часть содержимого) # - CRLF в рабочей копии для *.bsl / *.xml и др. текстовых файлов выгрузки # - корректное отображение кириллических путей (core.quotepath=false) @@ -25,7 +25,7 @@ set -e -SCRIPT_VERSION="1.2.0" +SCRIPT_VERSION="1.2.2" # ============================================================ # Справка @@ -37,18 +37,22 @@ show_help() { ============================================================ ОПИСАНИЕ: - Настраивает локальный Git-репозиторий в ТЕКУЩЕЙ папке под - выгрузку из конфигуратора 1С (UTF-8 BOM + CRLF). + Настраивает локальный Git-репозиторий под выгрузку из + конфигуратора 1С (UTF-8 BOM + CRLF). + Путь к репозиторию обязателен: --path / --repo. ИСПОЛЬЗОВАНИЕ: - ./setup-1c-repo.sh [ОПЦИИ] + ./setup-1c-repo.sh --path DIR [ОПЦИИ] ОПЦИИ: --help, -h Показать эту справку --version, -V Показать версию скрипта + --path DIR, --repo DIR + Папка репозитория для настройки (обязательно) --dry-run Только показать, что будет сделано --force, -f Перезаписать существующие .gitattributes / .gitignore --init Выполнить git init, если папка ещё не репозиторий + (создаёт каталог, если его нет) --renormalize После настройки: git add --renormalize . --no-gitignore Не создавать/не менять .gitignore --verbose, -v Подробный вывод @@ -60,9 +64,10 @@ show_help() { 3. Файл .gitignore — типичные исключения (*.cf, *.cfe, …) ПРИМЕРЫ: - ./setup-1c-repo.sh - ./setup-1c-repo.sh --force --renormalize - ./setup-1c-repo.sh --init --dry-run + ./setup-1c-repo.sh --path /projects/uas_ep --force + ./setup-1c-repo.sh --repo ../my-1c-dump --init + ./setup-1c-repo.sh --path . --force --renormalize + ./setup-1c-repo.sh --path /tmp/new-1c --init --dry-run ============================================================ EOF @@ -84,11 +89,28 @@ QUIET=false DO_INIT=false RENORMALIZE=false NO_GITIGNORE=false +REPO_PATH="" while [[ $# -gt 0 ]]; do case $1 in --help|-h) show_help ;; --version|-V) show_version ;; + --path|--repo) + if [ -z "${2:-}" ] || [[ "${2:-}" == -* ]]; then + echo -e "\033[0;31m❌ Для $1 укажите путь к папке репозитория\033[0m" >&2 + exit 1 + fi + REPO_PATH="$2" + shift 2 + ;; + --path=*|--repo=*) + REPO_PATH="${1#*=}" + if [ -z "$REPO_PATH" ]; then + echo -e "\033[0;31m❌ Пустой путь в $1\033[0m" >&2 + exit 1 + fi + shift + ;; --dry-run) DRY_RUN=true; shift ;; --force|-f) FORCE=true; shift ;; --init) DO_INIT=true; shift ;; @@ -264,29 +286,84 @@ cache/ *.pfl ' +# ============================================================ +# Целевой каталог репозитория +# ============================================================ +resolve_repo_dir() { + local raw="$1" + if command -v realpath >/dev/null 2>&1; then + # realpath -m: путь может ещё не существовать (--init) + if realpath -m "$raw" >/dev/null 2>&1; then + realpath -m "$raw" + return 0 + fi + fi + # Fallback без GNU realpath (macOS) + if [ -d "$raw" ]; then + (cd "$raw" && pwd -P) + return 0 + fi + local parent base + parent=$(dirname "$raw") + base=$(basename "$raw") + if [ -d "$parent" ]; then + printf '%s/%s\n' "$(cd "$parent" && pwd -P)" "$base" + return 0 + fi + printf '%s\n' "$raw" +} + +if [ -z "$REPO_PATH" ]; then + log_error "Не указан путь к репозиторию" + echo " Обязательно: --path DIR или --repo DIR" >&2 + echo " Справка: ./setup-1c-repo.sh --help" >&2 + exit 1 +fi + +TARGET_DIR="$(resolve_repo_dir "$REPO_PATH")" + # ============================================================ # Проверка окружения # ============================================================ log_step "Проверка окружения (ОС: ${OS_KIND})..." +log_info "Целевой каталог: $TARGET_DIR" if ! command -v git >/dev/null 2>&1; then log_error "Git не установлен" exit 1 fi -if [ ! -d ".git" ] && [ ! -f ".git" ]; then +if [ ! -d "$TARGET_DIR" ]; then if [ "$DO_INIT" = true ]; then if [ "$DRY_RUN" = true ]; then - echo " [DRY-RUN] git init" + echo " [DRY-RUN] mkdir -p \"$TARGET_DIR\"" + echo " [DRY-RUN] git -C \"$TARGET_DIR\" init" else - git init + mkdir -p "$TARGET_DIR" + log_success "Создан каталог: $TARGET_DIR" + git -C "$TARGET_DIR" init log_success "Выполнен git init" fi else - log_error "Текущая папка не является Git-репозиторием" - echo " Запустите из корня репозитория или добавьте --init" >&2 + log_error "Папка не существует: $TARGET_DIR" + echo " Укажите существующий путь или добавьте --init" >&2 exit 1 fi +else + if [ ! -d "$TARGET_DIR/.git" ] && [ ! -f "$TARGET_DIR/.git" ]; then + if [ "$DO_INIT" = true ]; then + if [ "$DRY_RUN" = true ]; then + echo " [DRY-RUN] git -C \"$TARGET_DIR\" init" + else + git -C "$TARGET_DIR" init + log_success "Выполнен git init" + fi + else + log_error "Папка не является Git-репозиторием: $TARGET_DIR" + echo " Укажите корень репозитория (--path) или добавьте --init" >&2 + exit 1 + fi + fi fi log_success "Окружение проверено" @@ -298,10 +375,10 @@ set_local_config() { local key="$1" local value="$2" if [ "$DRY_RUN" = true ]; then - echo " [DRY-RUN] git config --local $key $value" + echo " [DRY-RUN] git -C \"$TARGET_DIR\" config --local $key $value" return 0 fi - git config --local "$key" "$value" + git -C "$TARGET_DIR" config --local "$key" "$value" log_debug "config $key=$value" } @@ -337,9 +414,10 @@ fi # Запись файла с бэкапом # ============================================================ write_file_safe() { - local path="$1" + local rel="$1" local content="$2" local label="$3" + local path="$TARGET_DIR/$rel" if [ -f "$path" ] && [ "$FORCE" != true ]; then log_warning "$label уже существует — пропуск (используйте --force)" @@ -357,12 +435,12 @@ write_file_safe() { if [ -f "$path" ]; then cp -f "$path" "${path}.bak" - log_info "Бэкап: ${path}.bak" + log_info "Бэкап: ${rel}.bak" fi # Пишем через printf, чтобы сохранить финальный перевод строки printf '%s\n' "$content" > "$path" - log_success "Записан $path" + log_success "Записан $rel" } log_step "Файл .gitattributes..." @@ -381,9 +459,9 @@ fi if [ "$RENORMALIZE" = true ]; then log_step "Нормализация индекса (git add --renormalize .)..." if [ "$DRY_RUN" = true ]; then - echo " [DRY-RUN] git add --renormalize ." + echo " [DRY-RUN] git -C \"$TARGET_DIR\" add --renormalize ." else - git add --renormalize . + git -C "$TARGET_DIR" add --renormalize . log_success "Индекс перенормализован" log_warning "Проверьте git status — возможны массовые изменения EOL" fi @@ -398,7 +476,7 @@ if [ "$QUIET" != true ]; then echo -e "${CYAN}📊 Итог настройки под выгрузку конфигуратора 1С${NC}" echo "============================================================" echo " ОС: $OS_KIND ($OS_NAME)" - echo " Каталог: $(pwd)" + echo " Каталог: $TARGET_DIR" echo " Encoding: UTF-8 (BOM сохраняется в содержимом файлов)" echo " EOL (выгрузка): CRLF в рабочей копии (*.bsl, *.xml, …)" echo " core.autocrlf: false (управляет .gitattributes)" @@ -411,13 +489,13 @@ if [ "$QUIET" != true ]; then echo -e "${GREEN}✅ Готово${NC}" echo "" echo -e "${CYAN}Следующие шаги:${NC}" - echo " 1. git status" + echo " 1. cd \"$TARGET_DIR\" && 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 ." + echo " ./setup-1c-repo.sh --path \"$TARGET_DIR\" --renormalize" + echo " или: git -C \"$TARGET_DIR\" add --renormalize ." fi fi echo "============================================================"