У меня проблема с этим сценарием bash, который я пишу. Я пытаюсь применить шаг 3 из this procedure from Github documentation, чтобы удалить все файлы в нашей истории хранилищ из нашей истории git. Например, если .gitignore игнорирует .txt, я хочу удалить все .txt из истории. И так далее для каждой линии .gitignore.Невозможно использовать скрипт bash для удаления файлов из истории git
Я могу использовать подстановочный знак в файле примера. Таким образом, я могу запустить следующую команду, чтобы удалить все файлы с расширением .txt:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.txt' --prune-empty --tag-name-filter cat -- --all
Так что я попытался сделать Баш скрипт, чтобы сделать то же самое.
Я сделал простой файл .gitignore, чтобы проверить это с, следующим образом:
#foo
*.txt
*.docx
Мой сценарий оболочки выглядит следующим образом:
#!/bin/bash
s1="#"
str1="'git rm --cached --ignore-unmatch "
str2="'"
cat .gitignore | while read line
do
if [[ $line == *"$s1"* ]]
then
echo #skip
else
str3=$str1$line$str2
git filter-branch --force --index-filter $str3 --prune-empty --tag-name-filter cat -- --all
fi
done
Однако это приводит следующий вывод:
fatal: bad revision 'rm'
fatal: bad revision 'rm'
(один раз для каждой строки файла .gitignore)
Что я сделал не так?
Укажите свои переменные! – Biffen
Вы не можете поместить сложные команды в строку. Не пытайтесь. http://mywiki.wooledge.org/BashFAQ/050 В частности, вы не можете правильно определить кавычки. –
Команда, которую я использую, имеет одинарные кавычки. Когда я просто попытался запустить команду и добавить $ line к ней, в результате запускаемой команды включается «git rm --cached --ignore unmatch $ line» вместо содержания строки $. – Jake