git filter-branch
إعادة كتابة السجل بمرشِّحات (متقادم — استخدم 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>أمثلة
إزالة ملف من كل مكان
git filter-branch --index-filter 'git rm --cached --ignore-unmatch .env' HEADالطريقة القديمة البطيئة.
الطريقة الموصى بها
git filter-repo --path .env --invert-pathsيقوم git filter-repo (أداة منفصلة) بذلك بسرعة وأمان.
أمثلة على سير العمل
Rotate the secretأولًا، اجعلها عديمة الفائدة
git filter-repo --path config/secret.yml --invert-pathsإزالتها من السجل
git push --force --allاستبدال السجل البعيد
حل المشكلات
لا يمكن إنشاء نسخة احتياطية جديدة
السبب: refs/original موجود من تشغيل سابق
احذفه (git update-ref -d refs/original/refs/heads/main) أو استخدم -f
نصائح وأخطاء شائعة
أفضل الممارسات
- ✓استخدم git filter-repo بدلًا منه.
- ✓خذ نسخة احتياطية من المستودع قبل أي إعادة كتابة.
أخطاء متكررة
- ✗إعادة كتابة سجل مشترك دون إخبار الفريق.
- ✗الظن بأن إعادة الكتابة تجعل سرًّا مسرَّبًا آمنًا — غيّر السرّ.
الأسئلة الشائعة
إنه بطيء جدًا وفيه مزالق كثيرة تفسد إعادة الكتابة بصمت؛ ويعالج filter-repo الأمرين.