Красиво сделано. +1

быть ясным по этому вопросу, я не спрашиваю о том, как удалитьодин файл Из истории, как этот вопрос:Полностью удалить файл из всей истории коммитов репозитория Git, Я также не спрашиваю оuntracking файлы из gitignore, как в этом вопросе:Игнорировать файлы, которые уже были переданы в Git-репозиторий.

Я говорю об «обновлении файла .gitignore и последующем удалении всего, что соответствует списку из истории», более или менее как этот вопрос:Игнорировать файлы, которые уже были переданы в Git-репозиторий, Однако, к сожалению, ответ на этот вопрос не работает для этой цели, поэтому я здесь, чтобы попытаться разработать вопрос и, надеюсь, найти хороший ответ, который не требует, чтобы человек просматривал целое дерево исходных текстов вручную, чтобы выполнить ветвь фильтра. на каждом совпавшем файле.

Здесь я предоставляю тестовый скрипт, в настоящее время выполняющий процедуру в ответИгнорировать файлы, которые уже были переданы в Git-репозиторий, Собирается удалить и создать папкуroot под PWD, поэтому будьте осторожны, прежде чем запускать его. Я опишу свою цель после кода.

#!/bin/bash -e

TESTROOT=${PWD}
GREEN="\e[32m"
RESET="\e[39m"

rm -rf root
mkdir -v root
pushd root

mkdir -v repo
pushd repo
git init

touch a b c x 
mkdir -v main
touch main/{a,x,y,z}

# Initial commit
git add .
git commit -m "Initial Commit"
echo -e "${GREEN}Contents of first commit${RESET}"
git ls-files | tee ../00-Initial.txt

# Add another commit just for demo
touch d e f y z main/{b,c}
## Make some other changes
echo "Test" | tee a | tee b | tee c | tee x | tee main/a > main/x
git add .
git commit -m "Some edits"

echo -e "${GREEN}Contents of second commit${RESET}"
git ls-files | tee ../01-Changed.txt

# Now I want to ignore all 'a' and 'b', and all 'main/x', but not 'main/b'
## Checkout the root commit
git checkout -b temp $(git rev-list HEAD | tail -1)
## Add .gitignores
echo "a" >> .gitignore
echo "b" >> .gitignore
echo "x" >> main/.gitignore
echo "!b" >> main/.gitignore
git add .
git commit --amend -m "Initial Commit (2)"
## --v Not sure if it is correct
git rebase --onto temp master
git checkout master
## --v Now, why should I delete this branch?
git branch -D temp
echo -e "${GREEN}Contents after rebase${RESET}"
git ls-files | tee ../02-Rebased.txt

# Supposingly, rewrite history
git filter-branch --tree-filter 'git clean -f -X' -- --all
echo -e "${GREEN}Contents after filter-branch${RESET}"
git ls-files | tee ../03-Rewritten.txt

echo "History of 'a'"
git log -p a

popd # repo

popd # root

Этот код создает репозиторий, добавляет некоторые файлы, делает некоторые изменения и выполняет процедуру очистки. Кроме того, некоторые файлы журнала генерируются.В идеале хотелось быa, b, а такжеmain/x исчезают из истории, аmain/b остается, Однако прямо сейчас ничего не удалено из истории. Что нужно изменить для достижения этой цели?

Бонусные баллы, если это можно сделать на нескольких ветках. Но пока держите его в одной основной ветке.

Ответы на вопрос(2)

Ваш ответ на вопрос