Неоднократно с помощью ответвления фильтра мерзавца для перезаписи новых фиксаций

Я хотел бы разделить модули, распределенные с большим приложением в отдельные подмодули и сохранить способность вытянуть от восходящего потока.

Таким образом, это более сложно, чем подкаталог Отсоединения в отдельный репозиторий Мерзавца. Я не только имею, действительно используют ответвление фильтра мерзавца однажды, но хотят сохранить способность вытянуть восходящие изменения после того, как я сделал так (и в восходящем направлении не имеет).

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

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

Было бы хорошо, если ответвления и теги могли бы быть сохранены также, но это не абсолютно необходимо и если бы это усложняет вещи, я на самом деле предпочел бы терять их.

10
задан Community 23 May 2017 в 12:17
поделиться

1 ответ

Для первого перебазирования сделайте следующее:

git checkout -b rebased master
git filter-branch --some-filter
git tag rebased-done master

А для «слияния» позже коммиты:

# Create a tempory branch and rebase it's tail use 'rebase-done~'
# and not 'rebase-done' because some filters (like --index-filter)
# require this, others might not.
git checkout -b rebased-tail master
git filter-branch -f --some-filter -- rebased-done~..HEAD

# Get the commit in branch 'rebased' corresponding to tag 'rebase-done'
# (which tags a commit in 'master' not 'rebased').  Depending on your
# situation you might have to determine this commit differently (in my
# use case I am absolutely sure that there is never a commit with the
# same author date - if that doesn't work you might want to compare
# commit messages).
start_time=$(git show --quiet --pretty=%at rebased-done)
start_hash=$(
git log --reverse --pretty="%H %at" rebased_tail |
while read hash time
do
    [ "$time" = "$start_time" ] && echo $hash && break
done
)

# Finally apply the rebased commits.
git checkout rebased
git format-patch -k --stdout $start_hash..rebased-tail | git am -k
git branch -D rebased-tail
git tag -f rebased-done master
8
ответ дан 4 December 2019 в 02:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: