backup-before-edit
Создаёт бэкап файла перед каждым редактированием. Если что-то пойдёт не так — можно откатиться.
Описание
Простым языком
Перед тем как AI правит твой файл, хук делает его копию — как черновик перед чистовиком. Если AI напортачил, ты находишь копию в папке .backups/ и восстанавливаешь одной командой.
Раньше после неудачного редактирования нужно было вспоминать как откатить изменения через git. Теперь есть папка с копиями: зашёл, скопировал нужную версию — и дело сделано.
Что делает
Хук backup-before-edit создаёт копию файла с временной меткой в директории .backups/ перед каждым редактированием. Если AI неудачно изменил файл — есть бэкап для быстрого восстановления без git stash и git checkout.
Особенно полезен при рефакторинге больших файлов или экспериментах. Хранит последние 5 версий каждого файла — старые удаляются автоматически.
Когда срабатывает
Триггер: PreToolUse — до операции Edit (не Write). Условие: файл существует и не в node_modules, .git, dist. Действие: копирует файл в .backups/ с временной меткой.
Установка
- Добавь конфиг
PreToolUseнаEditв.claude/settings.json - Создай скрипт
~/.claude/hooks/backup-before-edit.shс правамиchmod +x - Добавь
.backups/в.gitignoreпроекта
Конфиг settings.json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/backup-before-edit.sh"
}
]
}
]
}
}Скрипт хука
#!/bin/bash
# backup-before-edit.sh — бэкап файла перед редактированием
# PreToolUse: Edit
FILE="${CLAUDE_TOOL_INPUT_PATH:-}"
[ -z "$FILE" ] && exit 0
[ ! -f "$FILE" ] && exit 0
case "$FILE" in
*/node_modules/*|*/.git/*|*/dist/*|*/.next/*|*/build/*) exit 0 ;;
esac
FILE_SIZE=$(stat -c%s "$FILE" 2>/dev/null || stat -f%z "$FILE" 2>/dev/null || echo 0)
if [ "$FILE_SIZE" -gt 5242880 ]; then
exit 0
fi
PROJECT_DIR=$(git rev-parse --show-toplevel 2>/dev/null || pwd)
BACKUP_DIR="$PROJECT_DIR/.backups"
mkdir -p "$BACKUP_DIR"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
BASE=$(basename "$FILE")
BACKUP_PATH="$BACKUP_DIR/${BASE}.${TIMESTAMP}.bak"
cp "$FILE" "$BACKUP_PATH"
echo "BACKUP [backup-before-edit] $BACKUP_PATH"
ls -t "$BACKUP_DIR/${BASE}."*.bak 2>/dev/null | tail -n +6 | xargs rm -f 2>/dev/null
exit 0Примеры работы
Восстановление файла из бэкапа — одна команда:
# Смотрим список бэкапов
ls .backups/auth.ts.*.bak
# Восстанавливаем конкретную версию
cp .backups/auth.ts.20260227_143022.bak src/auth.ts
# Берём самый свежий бэкап
ls -t .backups/auth.ts.*.bak | head -1 | xargs -I{} cp {} src/auth.tsЧто пропускает
Write— только новые файлы, бэкапить нечего- Файлы в
node_modules,dist,.next,.git - Бинарные файлы и файлы больше 5MB
Что обрабатывает
- Каждый
Editна существующем файле — создаёт.bak - Множественные правки одного файла — несколько версий с метками
- Автоочистка: оставляет только 5 последних бэкапов на файл
Настройка под себя
- Измени
tail -n +6наtail -n +Nдля другого лимита версий - Используй
~/.claude-backups/для централизованного хранения - Добавь фильтр по расширениям: бэкапить только
.ts,.py,.go - Интегрируй с rsync для зеркалирования бэкапов на другой диск
git — это история, бэкап — это страховка. git помогает когда ты коммитишь. Бэкап помогает когда ты нет.
> Пока нет комментариев
Связанный контент
Похожие инструменты
/typecheck
Проверка типов: tsc для TypeScript, pyright для Python. Показывает ошибки с пояснениями.
Открыть →/autoformat
Форматирование кода: Prettier для JS/TS, ruff для Python. Весь проект или конкретные файлы.
Открыть →/cleanup
Удаление debug-кода: console.log, debugger, print(), закомментированный код. Чистка перед коммитом.
Открыть →/code-review
Запуск ревью кода через субагента code-reviewer. Проверяет DRY, KISS, безопасность, именование.
Открыть →