Я создал файл в /usr/local/git/findsed.sh со следующим содержимым:
find . -name 'githubDirToSubmodule.sh' -exec sed -i '' -e 's/What I want to remove//g' {} \;
Я выполнил команду:
git filter-branch --tree-filter "sh /usr/local/git/findsed.sh"
Объяснение команд
Когда вы запускаете git filter-branch, он проходит каждую ревизию, которую вы когда-либо фиксировали, одну за другой.--tree-filter запускает сценарий findsed.sh для каждой зафиксированной ревизии, сохраняет его, а затем переходит к следующей ревизии.
Команда find находит определенный файл или набор файлов и выполняет (-exec)редактор sed в этом файле.sed - это команда, которая принимает регулярное выражение после s / и заменяет его строкой между / и / g (пустым в моем примере).{} - это ссылка на путь к файлу, который был задан командой find.Путь к файлу подается в sed, чтобы sed знал, над чем работать.\;просто завершает команду -exec.
Разделение сценария оболочки и команды на отдельные части позволяет уменьшить сложность, когда дело доходит до кавычек '' или "'.
Особенности
Я успешно реализовал это на Mac, и, очевидно, sed - это конкретная (более старая?) Версия для Mac.Это важно, так как иногда ведет себя по-разному.Убедитесь, что вы выполнили sed -i '', иначе он добавлял "-e" в конец файлов, думая, что это то, что я хотел назвать своими файлами резервных копий.-i '' говорит, что не делайте резервные копии, просто отредактируйте файлы на месте, и файл резервной копии не требуется.
Указание -name 'filename.sh' помогло мне избежать еще одной проблемы, которую я не мог решить.Был другой файл с .sh, и этот файл заканчивался без символа новой строки.По какой-то причине sed добавит в конец символ новой строки, несмотря на то, что s / blah / blah / g не соответствует никому в этом файле.Поэтому вместо того, чтобы выяснить эту проблему, я просто сказал находке игнорировать все остальные файлы.
Дополнительные команды, которые работают
Кроме того, я обнаружил, что эти команды работают вфайл findsed.sh (только одна команда за раз, не многократная, поэтому оставьте комментарий для остальных):
find . -name '.publishNewZenPackFromGithub.sh.swp' -exec rm -f {} \;
find . -name '*' -exec grep -H PassToRemove {} \;
Наслаждайтесь!