git-knife، ویرایش تاریخچهی گیت مثل یه جدول
خلاصهٔ کاملتر
git-knife یه رابط گرافیکی دسکتاپه که مستقیم روی متادیتای کامیتهای گیت کار میکنه: پیام، تاریخ نویسنده، تاریخ کامیتر، و نام/ایمیل نویسنده. ابزارای شناختهشدهای مثل GitKraken، Sublime Merge، Fork و lazygit تو رینیم و ریاردر کامیت خوبن، ولی تاریخ کامیت رو تقریباً ثابت میگیرن و اجازهی ویرایش تاریخ کامیتر یا هویت نویسنده رو روی هر کامیت دلخواه نمیدن. ابزارایی مثل git-filter-repo یا ترفندای git rebase هم این کارو میتونن بکنن ولی رابط گرافیکی ندارن؛ git-knife دقیقاً همین خلأ رو پر میکنه.
این ابزار خودش گیت رو دوباره پیادهسازی نمیکنه؛ بهجاش از خود دستور git روی سیستم استفاده میکنه و کامیتها رو با git commit-tree بازسازی میکنه، در حالی که تری اصلی همون کامیت رو دوباره استفاده میکنه. یعنی محتوای فایلها هیچوقت عوض نمیشه، فقط متادیتاست که تغییر میکنه. یه قابلیت جستجو و جایگزینی گروهی هم داره؛ میتونی روی چندتا فیلد همزمان (پیام، نام/ایمیل نویسنده یا کامیتر) با متن ساده یا regex بگردی، و قبل از اعمال، تعداد موردهای پیدا شده رو زنده ببینی.
چون ویرایش هر کامیت هش خودش و همهی کامیتهای بعدیش رو عوض میکنه، git-knife قبل از هر بازنویسی یه رفرنس بکاپ خودکار میسازه که با یه کلیک از پنل Backups قابل بازگردوندنه. اگه بازنویسی به کامیتهایی برسه که قبلاً پوش شدن هم هشدار میده، چون پوش کردنش نیاز به git push --force-with-lease داره که برخلاف --force ساده، اگه ریموت از آخرین fetch تغییر کرده باشه پوش رو رد میکنه.
کامیتهای امضاشده هم تشخیص داده میشن؛ چون بازنویسی امضای GPG/SSH رو باطل میکنه، ابزار هشدار میده که چندتا کامیت امضاشون رو از دست میدن و میتونه با کلید خودت دوباره امضاشون کنه.
در وضعیت فعلی (MVP)، میشه پیام، نام/ایمیل و هر دو تاریخ رو حتی روی گراف کامیتهای mergeشده هم ویرایش کرد، بدون اینکه شاخهای چکاوت بشه؛ فقط ریاردر کردن، اسکواش و دراپ کردن کامیتها هنوز پیاده نشده. چون با Tauri ساخته شده، برای اجراش به Node.js، pnpm و Rust نیاز داری؛ نصبکنندههای ویندوز، مک و لینوکس هم از طریق GitHub Actions ساخته میشن، ولی فعلاً بدون امضای دیجیتال هستن که برای تسترای اولیه اشکالی نداره.
نکات کلیدی:
- git-knife با git commit-tree کامیتها رو بازسازی میکنه؛ محتوای فایلها همیشه دستنخورده میمونه
- قبل از هر بازنویسی یه رفرنس بکاپ خودکار ساخته میشه، قابل بازگردوندن با یه کلیک
- جستجو و جایگزینی گروهی با regex روی پیام، نام و ایمیل نویسنده/کامیتر
- بعد از بازنویسی باید با git push --force-with-lease پوش کنی، نه --force ساده
- تشخیص کامیتهای امضاشده و امکان امضای دوباره بعد از بازنویسی
- فعلاً ریاردر، اسکواش و دراپ کردن کامیت پشتیبانی نمیشه




