🐛 Типичные ошибки

К оглавлению урока

⚡ Главные ошибки

  • git add . в авто-скрипте — может включить секретные файлы; настройте .gitignore заранее
  • Пробелы в именах файловfor file in $matching_files ломается; используйте find -print0 | xargs -0
  • Забыть chmod +x — скрипт не запустится без флага исполняемости

Предупреждение: автоматический коммит без проверки содержимого

Опасность git add . в скрипте авто-коммита

Команда git add . добавляет ВСЕ изменённые, новые и незакоммиченные файлы из текущей директории и всех поддиректорий. В скрипте автоматического коммита это означает, что без проверки могут попасть:
  • Конфигурационные файлы с паролями и токенами (.env, config.ini)
  • Временные файлы (*.tmp, *.log)
  • Большие бинарные файлы
  • Файлы с личными данными

Как защититься

1. Настроить .gitignore перед автоматизацией

# .gitignore — исключить из авто-коммита
.env
*.log
*.tmp
__pycache__/
node_modules/
*.key
*.pem
config/secrets.ini

2. Проверять git status перед запуском скрипта

# Посмотреть, что именно добавится
git status
git diff --stat

# Только потом запустить авто-коммит
./auto_commit.sh

3. Добавить вывод git status в скрипт

#!/bin/bash
if [ ! -d ".git" ]; then exit 1; fi

git add .

# Показать что добавлено (для наглядности)
echo "=== Будет закоммичено: ==="
git diff --cached --stat
echo "=========================="

if git diff-index --quiet HEAD --; then
  echo "Нет изменений."
  exit 0
fi
git commit -m "Автоматический коммит $(date +'%Y-%m-%d %H:%M:%S')"
echo "Изменения закоммичены."

Ошибки в скрипте копирования (copy_by_ext.sh)

1. Пробелы в именах файлов или директорий

Проблема: При использовании for file in $matching_files файлы с пробелами в имени будут разделены на несколько «файлов».
# Проблема:
for file in $matching_files; do  # "my file.txt" = "my" + "file.txt"

# Решение: использовать find с -print0 и xargs -0
find "$source_directory" -maxdepth 1 -type f -name "*.$file_extension" \
  -print0 | xargs -0 -I {} cp {} "$target_directory/"

2. Расширение с точкой

# Пользователь вводит ".txt" вместо "txt"
# Проблема: find -name "*.txt" станет "**..txt"

# Добавить очистку точки в начале:
file_extension="${file_extension#.}"  # удалить ведущую точку

3. Целевая директория не существует

# Вместо выхода с ошибкой — создать директорию
if [ ! -d "$target_directory" ]; then
  mkdir -p "$target_directory"
  echo "Создана директория: $target_directory"
fi

Ошибки в командном Git-workflow

1. Забыть git pull перед созданием ветки

# Неправильно: создать ветку от устаревшего main
git checkout -b feature/my-task   # main давно обновился

# Правильно: сначала обновить main
git checkout main
git pull origin main
git checkout -b feature/my-task

2. Не сделать rebase после merge чужого PR

Ситуация: Другой участник влил свой PR в main. Ваша ветка теперь отстаёт от main. Если сделать push без rebase — возникнут конфликты при слиянии.
# Обновить main и перебазировать свою ветку
git checkout main
git pull origin main
git checkout feature/my-task
git rebase main

# При конфликтах — разрешить и продолжить
git add <conflicted-file>
git rebase --continue

3. Push без -u при первом пуше ветки

# Ошибка: "The current branch has no upstream branch"
git push    # не знает куда пушить

# Правильно: первый раз указать upstream
git push -u origin feature/my-task

# Последующие разы можно просто:
git push

4. Забыть chmod +x перед запуском скрипта

# Ошибка: permission denied
./copy_by_ext.sh

# Исправление:
chmod +x copy_by_ext.sh
./copy_by_ext.sh