удалить файл из всей истории git


Основываясь на этой статье , я создал небольшой скрипт, который должен удалить все вхождения файла во всем РЕПО git, все ветви, теги и коммиты. Сценарий:

#!/usr/bin/env node
var child_process = require('child_process');
if (process.argv.length < 3){
  console.error('USAGE: git-forget path/to/file')
  process.exit(1);
}
var path = process.argv[2];

var phase = 0;
function printLog(error, stdout, stderr) {
  if (error) {
    console.error('ERROR' + error);
  }
  console.log(++phase);
  console.log(stdout);
}

child_process.execSync('git filter-branch --force --index-filter 'git rm -f --cached --ignore-unmatch  '+ path +'' --prune-empty --tag-name-filter cat -- --all');
child_process.execSync('echo "' + path + '" >> .gitignore', printLog);
child_process.execSync('git add .gitignore');
child_process.execSync('git commit -m "Add ' + path +' to .gitignore"',printLog)
child_process.execSync('git push origin --force --all',printLog);
child_process.execSync('git push origin --force --tags',printLog);

Этот скрипт работал на нескольких репо (которые являются частными), и на одном из них он сохранял начальную фиксацию к файлу, который я пытался удалить. После запуска скрипта я сделал это git log --all -- .npmrc и нашел начальную фиксацию. Чего мне не хватает?

1 7

1 ответ:

Я думаю, что произошло то, что вы забыли сказать другим пользователям этого РЕПО не сливать свои изменения в новую историю, а скорее перебазировать. Из документа, который вы процитировали:

Скажите вашим сотрудникам, чтобы они перебазировали, а не объединяли, любые ветви, которые они создан на основе вашей старой (испорченной) истории хранилища. Один коммит слияния может заново ввести некоторые или все испорченные истории, которые вы только что пошел на хлопоты по очистке.

Попробуйте выполнить то же самое повторите сценарий и убедитесь, что никто не повторяет старую историю путем слияния своих локальных изменений с новой главой.