Готово (v1.2.2): без --path / -Path скрипт сразу завершается с ошибкой.
This commit is contained in:
+105
-27
@@ -2,20 +2,20 @@
|
||||
# ============================================================
|
||||
# setup-1c-repo.sh - Настройка Git-репозитория под выгрузку 1С (конфигуратор)
|
||||
#
|
||||
# Версия: 1.2.0
|
||||
# Версия: 1.2.2
|
||||
# Автор: 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]
|
||||
# ./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 "============================================================"
|
||||
|
||||
Reference in New Issue
Block a user