git filter-branch

الـ patches وإعادة الكتابة

إعادة كتابة السجل بمرشِّحات (متقادم — استخدم git filter-repo)


يعيد الأمر 'git filter-branch' كتابة كل commit في فرع عبر مرشِّحات — مثلًا لإزالة ملف من السجل كله. إنه بطيء وسهل إساءة الاستخدام ولا يُنصح به رسميًا: Git نفسه يطبع تحذيرًا ويوصي بـ git filter-repo. وككل إعادة كتابة، يعطي كل commit ‏hash جديدًا، فعلى الجميع إعادة الاستنساخ أو إعادة الضبط.

الصيغة

git filter-branch [--index-filter <cmd>] [--tree-filter <cmd>] [--msg-filter <cmd>] [--] <rev-list>
[ ] اختياري| أو<arg> قيمة تُستبدل... قابل للتكرار--flag خيار

أمثلة

إزالة ملف من كل مكان

git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' HEAD

الطريقة القديمة البطيئة.


الطريقة الموصى بها

git filter-repo --path .env --invert-paths

يقوم git filter-repo (أداة منفصلة) بذلك بسرعة وأمان.

أمثلة على سير العمل

1
Rotate the secret

أولًا، اجعلها عديمة الفائدة

2
git filter-repo --path config/secret.yml --invert-paths

إزالتها من السجل

3
git push --force --all

استبدال السجل البعيد

حل المشكلات

لا يمكن إنشاء نسخة احتياطية جديدة

السبب: refs/original موجود من تشغيل سابق

احذفه (git update-ref -d refs/original/refs/heads/main) أو استخدم -f

نصائح وأخطاء شائعة

أفضل الممارسات

  • ✓استخدم git filter-repo بدلًا منه.
  • ✓خذ نسخة احتياطية من المستودع قبل أي إعادة كتابة.

أخطاء متكررة

  • ✗إعادة كتابة سجل مشترك دون إخبار الفريق.
  • ✗الظن بأن إعادة الكتابة تجعل سرًّا مسرَّبًا آمنًا — غيّر السرّ.

الأسئلة الشائعة

A:

إنه بطيء جدًا وفيه مزالق كثيرة تفسد إعادة الكتابة بصمت؛ ويعالج filter-repo الأمرين.