Release 1.2.0: setup-1c-repo for 1C Configurator dumps (EOL/encoding/ignore).

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
5 changed files with 954 additions and 8 deletions
+427
View File
@@ -0,0 +1,427 @@
#!/bin/bash
# ============================================================
# setup-1c-repo.sh - Настройка Git-репозитория под выгрузку 1С (конфигуратор)
#
# Версия: 1.2.0
# Автор: Michael BAG <mk@p7net.ru>
# Репозиторий: 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