Ответ 1
Вот несколько инструкций, которые вы хотите сделать.
Это приведет к удалению file_to_remove
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all
Я пытаюсь разбить подпроект моего репозитория git. Однако, в отличие от Отсоединить (переместить) подкаталог в отдельный репозиторий git У меня нет его в его собственном подкаталоге (и перемещение его и выполнение выше всего приводит к истории после переезда).
Я клонировал ветку, из которой я хочу отделить подпроект в собственном репозитории и удалить все, что не используется подпроектом, поэтому в основном я мог бы использовать это как хранилище моего подпроекта.
Теперь я хочу избавиться от истории всех файлов, которые больше не находятся в этом репозитории, чтобы сохранить историю файлов для файлов, которые превратили их в потомство.
Я думаю, что это возможно с помощью git -filter-branch, но я не могу понять, как
Большое спасибо заранее
Вот несколько инструкций, которые вы хотите сделать.
Это приведет к удалению file_to_remove
:
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_to_remove' --prune-empty -- --all
Хорошо, теперь я пытаюсь использовать следующую технику, будет отчитываться, если она сработает, потому что она выглядит довольно долго: В zsh или bash ON A CLONED Repository
git log --diff-filter=D --summary <start_commit>..HEAD | egrep -o '*[[:alnum:]]*(/[[:alnum:].]*)+$' > deleted.txt
чтобы получить все удаленные файлы
for del in `cat deleted.txt`
do
git filter-branch --index-filter "git rm --cached --ignore-unmatch $del" --prune-empty -- --all
# The following seems to be necessary every time
# because otherwise git won't overwrite refs/original
git reset --hard
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
git reflog expire --expire=now --all
git gc --aggressive --prune=now
done;
Это может быть экстремально для ваших данных, поэтому используйте только клоны.