#!/bin/bash set -euo pipefail BRANCH=$(hostname)-logs LOGS_DIR="{{ magos_log_dir }}" REPO_URL="https://{{ git_token }}@svc-git.cirex.ru/cloudstack/ptaf_config_logs.git" echo "$(date '+%Y-%m-%d %H:%M:%S') Начинаем синхронизацию логов в ветку '$BRANCH'" cd "$LOGS_DIR" # Если это не git-репозиторий — инициализируем новый if [ ! -d ".git" ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') Инициализируем новый локальный git-репозиторий" git init git config user.name "ptaf-sync-script" git config user.email "ptaf-sync-script@$(hostname)" fi # Настраиваем пользователя git config user.name "ptaf-sync-script" 2>/dev/null || true git config user.email "ptaf-sync-script@$(hostname)" 2>/dev/null || true # Настраиваем стратегию разрешения конфликтов git config pull.rebase true git config rebase.autoStash true # Добавляем/проверяем remote origin if ! git remote | grep -q '^origin$'; then echo "$(date '+%Y-%m-%d %H:%M:%S') Добавляем remote origin: $REPO_URL" git remote add origin "$REPO_URL" else # Обновляем URL на случай изменения токена git remote set-url origin "$REPO_URL" fi # Очищаем возможные битые ссылки перед fetch echo "$(date '+%Y-%m-%d %H:%M:%S') Очищаем старые ссылки" git remote prune origin 2>/dev/null || true # КЛЮЧЕВОЕ ИЗМЕНЕНИЕ: Получаем только нашу ветку, а не все ветки echo "$(date '+%Y-%m-%d %H:%M:%S') Получаем информацию только о ветке '$BRANCH'" if git ls-remote --heads origin "$BRANCH" | grep -q "$BRANCH"; then # Ветка существует на сервере - получаем только её git fetch origin "$BRANCH:refs/remotes/origin/$BRANCH" --force 2>/dev/null || { echo "$(date '+%Y-%m-%d %H:%M:%S') Ошибка при fetch, пытаемся очистить и повторить" rm -f .git/refs/remotes/origin/"$BRANCH" git fetch origin "$BRANCH:refs/remotes/origin/$BRANCH" --force 2>/dev/null || true } BRANCH_EXISTS_REMOTE=true else echo "$(date '+%Y-%m-%d %H:%M:%S') Ветка '$BRANCH' ещё не существует на сервере" BRANCH_EXISTS_REMOTE=false fi # Проверяем, существует ли ветка локально if ! git show-ref --verify --quiet refs/heads/"$BRANCH"; then echo "$(date '+%Y-%m-%d %H:%M:%S') Создаём локальную ветку '$BRANCH'" if [ "$BRANCH_EXISTS_REMOTE" = true ]; then # Создаём ветку на основе удалённой git checkout -b "$BRANCH" "origin/$BRANCH" else # Создаём новую ветку (может быть пустой или на основе текущего HEAD) git checkout --orphan "$BRANCH" 2>/dev/null || git checkout -b "$BRANCH" # Очищаем индекс для orphan ветки git rm -rf . 2>/dev/null || true fi else git checkout "$BRANCH" 2>/dev/null || { echo "$(date '+%Y-%m-%d %H:%M:%S') Ошибка переключения на ветку, принудительно переключаемся" git checkout -f "$BRANCH" } fi # Добавляем все изменения echo "$(date '+%Y-%m-%d %H:%M:%S') Добавляем все изменения" git add -A # Проверяем, есть ли что коммитить и коммитим СНАЧАЛА if ! git diff-index --quiet HEAD -- 2>/dev/null; then COMMIT_MSG="Auto commit $(date '+%Y-%m-%d %H:%M:%S') [host: $(hostname)]" echo "$(date '+%Y-%m-%d %H:%M:%S') Коммитим локальные изменения ПЕРЕД pull: $COMMIT_MSG" git commit -m "$COMMIT_MSG" fi # Теперь делаем pull/rebase если ветка существует на сервере if [ "$BRANCH_EXISTS_REMOTE" = true ]; then echo "$(date '+%Y-%m-%d %H:%M:%S') Синхронизация с удалённой веткой origin/$BRANCH" # Вариант 1: Пробуем обычный rebase if git pull --rebase origin "$BRANCH" 2>/dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S') Rebase успешен" else echo "$(date '+%Y-%m-%d %H:%M:%S') Конфликт при rebase, разрешаем автоматически" # Прерываем rebase git rebase --abort 2>/dev/null || true # Вариант 2: Используем стратегию merge с предпочтением локальных изменений echo "$(date '+%Y-%m-%d %H:%M:%S') Используем merge стратегию с предпочтением локальных изменений" if git pull --no-rebase --strategy=recursive --strategy-option=ours origin "$BRANCH" 2>/dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S') Merge успешен с предпочтением локальных изменений" else echo "$(date '+%Y-%m-%d %H:%M:%S') Merge также не удался, используем force push" # Вариант 3: Если и merge не сработал - будем пушить с force fi fi fi # Проверяем снова, есть ли что коммитить после синхронизации if ! git diff-index --quiet HEAD -- 2>/dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S') Есть изменения после синхронизации, коммитим" git commit -m "Post-sync changes $(date '+%Y-%m-%d %H:%M:%S')" fi echo "$(date '+%Y-%m-%d %H:%M:%S') Пушим в origin/$BRANCH" # Пушим с fallback вариантами if git push origin "$BRANCH" --set-upstream 2>/dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S') Push успешен" elif git push origin "$BRANCH" --force-with-lease 2>/dev/null; then echo "$(date '+%Y-%m-%d %H:%M:%S') Push успешен с --force-with-lease" else echo "$(date '+%Y-%m-%d %H:%M:%S') Используем force push (локальные изменения приоритетнее)" git push origin "$BRANCH" --force fi echo "$(date '+%Y-%m-%d %H:%M:%S') Успешно закоммичено и запушено" # Запускаем следующий скрипт {{ magos_upload_configs_script_path }} & exit 0