← На главную

git-knife меняет сообщение, автора и даты коммитов через git CLI

11.08.2026 15:09 · hackernews

git-knife — десктопный GUI для редактирования истории git. Он умеет менять у любого коммита сообщение, имя и email автора, авторскую дату и committer date. Существующие GUI вроде GitKraken, Sublime Merge, Fork и lazygit делают reword и reorder, но даты (особенно committer date) для них почти неизменяемы, а author identity для произвольных коммитов они не показывают. Консольные средства вроде git-filter-repo или трюки с git rebase и env умеют переписывать метаданные, но GUI у них нет. git-knife заполняет этот разрыв. Сама она git не реализует: вызывает системный git CLI и пересобирает коммиты через git commit-tree, переиспользуя исходное дерево, так что содержимое файлов гарантированно не меняется.

В приложении можно открыть репозиторий, кликнуть на non-merge коммит и отредактировать поля. Изменённые строки подсвечиваются, даты сохраняют исходный UTC offset. Review & apply показывает старый → новый и переписывает только локальную ветку; git-knife никогда не пушит. Есть массовая find & replace по полям message, author/committer name/email: поиск литералом или regex с $1 backreferences, case-sensitive по умолчанию, с подсчётом совпадений. Например, старый email old@example.com заменяется на new@example.com сразу во всех коммитах. Merge-коммиты пока заблокированы, reorder/squash/drop ещё не сделали. Перед каждой перезаписью создаётся бэкап refs/knife-backup//, откат — из панели Backups в один клик. Есть предупреждение о правке уже запушенной истории.

Это Tauri v2-приложение. Нужны git 2.x, Node.js + pnpm, Rust stable и Linux-зависимости webkit2gtk-4.1, libgtk-3, libayatana-appindicator3, librsvg2. Запуск: pnpm install && pnpm tauri dev; сборка: pnpm tauri build. GitHub Actions собирает установщики для macOS, Linux и Windows и прикладывает к draft-релизу при пуше тега v0.1.0. Подписи кода пока нет, так что сборки unsigned.

После перезаписи хэши коммитов меняются, и обычный git push отклоняется как non-fast-forward. Вместо plain --force нужен git push --force-with-lease: он откажет отправку, если remote ушёл вперёд, и не даст затереть чужие коммиты. Если запушенные коммиты уже затронуты, остальным надо: git fetch origin && git reset --hard origin/. Из CLI бэкап ищется через git for-each-ref refs/knife-backup, затем git reset --hard.

По умолчанию git-knife добавляет к переписанному tip-коммиту небольшую открытую подпись на отдельной notes-ссылке refs/notes/git-knife. В обычном git log её не видно, но она прозрачна и без скрытого кодирования. Отключается галочкой в приложении, удаляется git update-ref -d refs/notes/git-knife. Внутри код разбит просто: src-tauri/src/git.rs — единственное место, где вызывается git; commits.rs разбирает вывод; rewrite.rs через commit-tree пересобирает цепочку и двигает ветку; backup.rs управляет бэкапами. Стратегия проверена скриптом scratchpad/verify_engine.sh, который повторяет тот же flow и подтверждает, что diff по содержимому пустой.

Читать оригинал →