Раздавить много мерзавцев в один? - PullRequest
0 голосов
/ 29 мая 2018

Есть ли способ объединить множество коммитов в истории ветки Git в один?Я знаю, что вы можете git rebase -i, но проблема в том, что в истории ветки может быть около 10 000 коммитов, а интерактивная перебазировка даст мне файл huuuuge со всеми перечисленными коммитами.Я просто хочу сказать "сквош все коммиты от х до у в один".Я хочу объединить все коммиты в истории филиала, которые старше 6 месяцев, в один.

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Если вы имеете в виду, что вы хотите только 6 месяцев истории, то вы можете рассмотреть возможность использования мелкого клона.См. --shallow-since параметр git clone (https://git -scm.com / docs / git-clone ).

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


Другой альтернативой является выполнениепереписывание истории, которая создает новый коммит вместо серии старых коммитов.Если репозиторий является общим, это «сломает» репозиторий всех остальных.Вам нужно будет координировать действия с ними, чтобы убедиться, что они правильно «исправят» свои репозитории, иначе они могут отменить ваше переписывание.См. «Восстановление из исходной ребазы» в документации git rebase (https://git -scm.com / docs / git-rebase ), так как это применимо к любой ситуации, независимо от того, как вы выполняете переписывание.

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

Более общеприменимым решением является использование git filter-branch с--parent-filter.Учитывая историю типа

... x -- O -- O -- O -- y ...

и желая уменьшить ее до

... xTHRUy ...

(где xTHRUy - один коммит), вы можете сделать что-то вроде этого:

export NEW_PARENTS=$(git show --format='%P' --no-patch) x
export OLD_PARENTS=$(git show --format='%P' --no-patch) y

где x и y - выражения, которые разрешают соответствующие коммиты.Это может быть идентификатор фиксации или что-то вроде master~137, если вы знаете «путь» к правильной фиксации.Тогда

git filter-branch --parent-filter "sed \"s/$OLD_PARENTS/$NEW_PARENTS/\"" -- --all
0 голосов
/ 29 мая 2018

Предположим, ветвь master.

Если x является корневым коммитом,

git checkout --orphan tmp y
git commit
git rebase --onto tmp y master
git branch -D tmp

Если x не является корневым коммитом,

git checkout y
git reset x --soft
git commit
git rebase --onto HEAD y master
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...