
2026/08/12 0:09
Show HN: Git-knife –コミットメッセージや著者、日付をスプレッドシートのように編集するツールです
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
修正サマリー: 最も重要な示唆は、git-knife がファイル内容を改変せず、コミットメタデータ(メッセージ、著者名、日付、メールアドレスなど)を編集することを目的とした安全でクロスプラットフォームなデスクトップ GUI ツールであるということです。GitKraken や Sublime Merge などの競合製品が日付を不変として扱うか、完全な書き換え機能を欠いているのに対し、git-knife はユーザーフレンドリーなインターフェースを通じて、すべてのアイデンティティおよび日付フィールドに対してバッチ処理による変更を可能にします。安全性は、Git の核心ロジックを再実装するのではなく、標準の
git コマンド(例:git commit-tree)を実行するためのラッパーとして動作することで達成されています。現在 MVP ステータスにある本ツールの機能には、メッセージの再書き換え、すべてのメタデータフィールドの編集、バッチ処理による正規表現(regex)を使用した検索・置換が含まれますが、履歴の圧縮(squashing)、マージの書き換え、ブランチ管理などの高度な機能は欠如しています。安全に使用するためには、開発者は teammates の作業を意図的に上書きするのを防ぐために、単なる --force パスではなく --force-with-lease を使用して書き換えられた履歴をプッシュする必要があります。ソフトウェアには、いかなる書き換行之前にも自動적으로バックアップ参照(refs/notes/git-knife 経由で保存され、物理的に refs/knife-backup/<branch>/<epoch> に配置される)を作成する堅牢な安全機構が含まれています。エラーが発生した場合でも、ユーザーは Backups パネルまたは git reset --hard などの CLI コマンドを通じて直ちに以前のステートに戻すことができます。Linux、macOS、Windows のいずれの環境で動作させるにも、Git 2.x、pnpm を含む Node.js、Rust stable が要求されます。開発の開始には pnpm install と pnpm tauri dev を使用し、パッケージ化には tauri build を使用します。また、GitHub Actions が v0.1.0 のタグ付けに応答して自動的にリリースがトリガーされます。本文
git-knife: 安全な Git 履歴整形ツール
git-knife は、Git のコミットメタデータ(メッセージ、著者、日時など)をクリーンな GUI で編集可能にするツールです。ファイル内容を変更せず、システム標準の git commit-tree を活用して安全に履歴を再構築します。
既存の GUI ツールは日時変更に対応していない一方、CLI ツールには GUI がありません。
git-knife はこの隙間を埋めることで、すべてのフィールドを一括かつ安全に編集することを可能にします。
機能比較概観
以下の表は主要な Git UI/CLI ツールの機能を比較しています。
| ツール | クリーン GUI | メッセージ修正 (Reword) | 順序入れ替え・結合・削除 | 著者日時編集 | コミッター日時編集 | 著者情報編集 (名前/メール) | 一括検索置換 (正規表現) |
|---|---|---|---|---|---|---|---|
| git-knife | ✅ | ✅ | 🚧 予定中 | ✅ | ✅ | ✅ | ✅ |
| GitKraken | ✅ | ✅ | ✅ | ⚠️ Amend のみ | ❌ | ⚠️ | ❌ |
| Sublime Merge | ✅ | ✅ | ✅ | ❌ | ❌ | ⚠️ (Amend) | ❌ |
| Fork | ✅ | ✅ | ✅ | ❌ | ❌ | ⚠️ | ❌ |
| SmartGit | ✅ | ✅ | ✅ | ⚠️ | ❌ | ✅ | ❌ |
| git-cola | ◐ 古く/TUI | ✅ | ✅ | ✅ | ❌ | ✅ | ❌ |
| lazygit (TUI) | ◐ TUI | ✅ | ✅ | ❌ | ❌ | ⚠️ | ❌ |
| git-filter-repo (CLI) | ❌ | ✅ | Callback 経由 | ✅ | ✅ | ✅ | ✅ |
凡例:
- ✅: 第一級機能
- ⚠️: 可能だが面倒、制限あり(Amend など)
- ◐: 旧式またはターミナル UI (TUI)
- ❌: 非対応
- 🚧: 予定中
現状の課題: 洗練された GUI ツールはメッセージや順序の編集には優れていますが、コミットの日時(特にコミッター日時)の変更や、著者情報の一括正規表現置換を支援するものは皆無です。一方、メタデータを再構築できる CLI ツールには GUI がありません。
git-knife は両者の利点を兼ね備えた安全なフル機能 GUIを提供します。
MVP ステータス (現時点での実装状況)
✅ 対応済み機能
- リポジトリのコミットリスト表示
- すべてのメタデータ編集:
- メッセージ、著者名/メール、著者日付
- コミッター名/メール、コミッター日付
- 一括検索・置換:
- テキストまたは正規表現(例:誤ったメールアドレスの修正)による全件置換
- 変更前のプレビュー表示
- 適用前の自動バックアップ参照作成 + ワンクリック復元
- リビルド操作への警告表示
- マージコミット: ロック済み(編集不可)
⛔ 未対応機能
- 順序入れ替え・結合・削除
- マージコミットの書き換え
- ステージング、ブランチ、リモートリポジトリの管理
インストールと開発環境
要件
- Git (2.x)
- Node.js + pnpm (
またはcorepack enable pnpm
)npm i -g pnpm - Rust (stable): rustup.rs からインストール
- Linux システム用 Tauri 依存ライブラリ:
# Debian/Ubuntu の場合 sudo apt install libwebkit2gtk-4.1-dev build-essential curl wget file \ libxdo-dev libssl-dev libayatana-appindicator3-dev librsvg2-dev
ローカル開発での実行
pnpm install pnpm tauri dev
注:最初の
では依存ライブラリのダウンロードとコンパイルが行われるため、数分かかります。cargo build
バンドルの構築 (パッケージング)
アイコンは既に
src-tauri/icons/ にコミット済みですが、新しい正方形 PNG から再生成する場合は以下のコマンドを使用します。
pnpm tauri icon path/to/icon.png
注:開発環境実行時には不要です。
オートメーションリリース (GitHub Actions)
.github/workflows/release.yml に設定した tauri-action を使用して、macOS/Linux/Windows のネイティブインストーラーを構築し、GitHub Release に添付します。
タグを作成してリリースを切り出す方法:
git tag v0.1.0 git push origin v0.1.0
または、リポジトリの Actions タブ から手動でトリガーすることも可能です。
注:コード署名の設定はまだ行われていないため、ビルド結果は署名されていません(初期テスト段階では問題ありません)。
履歴の編集とプッシュ
コミットの編集手順
- リポジトリを開く
で選択するか、パスを直接貼り付けます。Browse… - コミットを選択・展開
マージコミット以外の任意のコミットをクリックしてエディターを展開します。 - メタデータを変更
メッセージ、著者/コミッターの名前、メールアドレス、日時を変更します。- 変更された行はハイライト表示されます。
- 日時フィールドは元の UTC オフセット を保持します。
- 適用とレビュー
をクリックし、旧履歴 → 新履歴のプレビューを確認して承認します。Review & apply
重要:
はローカルブランチのみを書き換えます。リモートへ連絡したり自動プッシュしたりしません。プッシュは常にユーザーが明示的に行う必要があります。git-knife
一括検索・置換機能
コミットテーブル上部の [Bulk find & replace] ボタンをクリックして、複数のコミットを一度に編集します:
- フィールド選択:
メッセージ、著者・コミッター名、メールアドレスなど、任意の組み合わせを選択します。 - パターン入力:
- 検索条件と置換条件を入力します。
- 正規表現を使用するには [Regex] を切り替え、
などのバック参照を使います(デフォルトは文字通りの検索)。$1 - デフォルト設定は区別大文字小文字に敏感です。
- 適用:
パネルで一致数と置換数がリアルタイムでカウントされます。
[Stage edits] でハイライトされた行を確定し、通常通り
します。Review & apply
例: メールアドレスの全件修正
著者メール + コミッターメールをターゲットにし、検索に
old@example.com、置換に new@example.com を指定します。
マージコミットはスキップされ、連続した操作は累積されます。
書き換え後のプッシュ
履歴の編集によりコミットのハッシュ値が変わるため、ローカルとリモート間に分岐が発生し、通常の
git push は拒否されます。リーザス(leases)付きで強制的にプッシュしてください:
git push --force-with-lease origin <branch>
- なぜ
か?--force-with-lease
リモート側が移動した場合にプッシュを拒否するため、チームメンバーのコミットが無断で上書きされることを防ぎます。単純な
より推奨されます。--force
警告:
編集対象がアップストリーム(リモート)にある場合、「履歴を書き換えました」という警告が表示されます。共有された履歴を編集するのは、他の人にとって再同期を強制するためです。可能な限り未プッシュのコミットのみを編集することをお勧めします。
共有履歴を書き換えた後の対応
すでに古いコミットを取得しているユーザーは、分岐した履歴を持つことになります。各ユーザーはローカルブランチを新しいリモート状態に合わせて再同期する必要があります:
git fetch origin git reset --hard origin/<branch> # ローカルで新規作成されたコミットを破棄(事前調整が必要)
書き換えの取り消し(復元)
- アプリ内:
バックアップパネルから、再構築前の先頭コミットをワンクリックで復元可能です。 - CLI から:
適用操作ごとに
にバックアップ参照が保存されます:refs/knife-backup/
git for-each-ref refs/knife-backup # バックアップ参照を探す git reset --hard <backup-ref-or-hash> # ブランチを元に戻す
注:
にも旧先頭コミットがリストされます。すでに強制的なプッシュを行っても、ローカルで復元してから再度git reflogで対応できます。git push --force-with-lease
サインノートについて (透明性)
デフォルトでは、再構築された各コミットに対して小さな公開ノート(Sign Note)が添付されます。これは通常のノート参照とは独立しており、
git-knife 専用の参照を使用するため、あなたの通常のノートを汚しません。
ノートを確認する方法:
# ノートを読む git notes --ref=git-knife show <commit> # リポジトリが編集済みか確認 git for-each-ref refs/notes/git-knife
- 通常の
には表示されませんが、完全に検出可能で隠蔽されていません。git log - アプリ内の 🔪 サインノートチェックボックス でいつでもオフに切り替えることができます(設定は保持されます)。
- リポジトリから完全に除去するには:
git update-ref -d refs/notes/git-knife
仕組みとアーキテクチャ
コアコンポーネント
src-tauri/src/git.rs
Git を起動する唯一の場所。commits.rs
リポジトリを開き、NUL レコードセパレータを使ってコミットをリストアップ(
,open_repo
)。list_commitsrewrite.rs
とpreview_edits
を処理。apply_edits
を使用して、最初に変更されたコミットから先頭までのチェーンを再構築。git commit-tree- バックアップ参照を保存し、旧先頭での比較・交換(compare-and-swap)でブランチを移動。
backup.rs
バックアップ参照
のリスト表示と復元処理(refs/knife-backup/*
)。git reset --hard
検証: 再構築戦略は
で git レベルで検証されており、実際のscratchpad/verify_engine.shフローを再現してコンテンツ差分が空であることを断言しています。commit-tree
セキュリティポリシー
すべての適用操作で、何も接触する前の旧先頭コミットへの参照
refs/knife-backup/<branch>/<epoch> が作成されます。
- 強制削除は行われません。
- 復元はいつでもバックアップパネルから利用可能です。