2017-01-31 13 views
11

У меня есть репозиторий со многими, многими (2000+) совершает, например:Как удалить историю старого git?

    l-- m -- n 
       /
a -- b -- c -- d -- e -- f -- g -- h -- i -- j -- k 
        \ 
         x -- y -- z 

, и я хочу, чтобы укоротить старую историю журнала - удалить все коммиты из истории журнала, начиная с (например) совершающим «е «но как начало репозитория.

Как это сделать?

+0

['rebase'] (https://git-scm.com/docs/git-rebase) - инструмент для изменения истории. – Maroun

+2

В чем проблема, которую вы хотите решить? –

ответ

20

Чтобы не потерять какую-либо историю; лучше сначала возьмите копию своего репозитория :). Здесь мы идем: (<f> является ша коммитом е, что вы хотите быть новым корневой фиксацию)

git checkout --orphan temp <f>  # checkout to the status of the git repo at commit f; creating a branch named "temp" 
git commit -m "new root commit"  # create a new commit that is to be the new root commit 
git rebase --onto temp <f> master # now rebase the part of history from <f> to master onthe temp branch 
git branch -D temp     # we don't need the temp branch anymore 

Если у вас есть пульт дистанционного управления, где вы хотите, чтобы иметь такую ​​же усеченную историю; вы можете использовать git push -f. Предупреждение: Это опасная команда; не используйте это легко! Если вы хотите быть уверены, что ваша последняя версия кода остается прежней; вы можете запустить git diff origin/master. Это не должно меняться (поскольку изменилась только история, а не содержимое ваших файлов).

git push -f 

Следующие две команды являются необязательными - они сохраняют ваше git-репо в хорошей форме.

git prune --progress     # delete all the objects w/o references 
git gc --aggressive     # aggressively collect garbage; may take a lot of time on large repos 
+0

Звучит то, что мне нужно, но каждый раз, когда я запускаю третий шаг (git rebase ...), я получаю конфликты. Это нормально? – user3475757

+0

нет, это не кажется нормальным. Вы включили в этот третий шаг часть '' (то есть та же самая команда sha, из которой вы создали ветвь temp)? –

8

Возможное решение для вашей проблемы обеспечивается git clone с помощью опции --shallow-since. Если с f есть небольшое количество коммитов, и нет никаких проблем с их подсчетом, вы можете использовать опцию --depth.

Второй вариант (--depth) клонирует только указанную ветку. Если вам нужны дополнительные ветки, вы можете добавить исходное репо в качестве удаленного и использовать git fetch и получить их.

Когда вы довольны результатом, удалите старый репозиторий и переименуйте новый, чтобы заменить его. Если старый репозиторий удален, заново создайте его после удаления и нажмите из нового репо в него.

Этот подход имеет преимущество в размере и скорости. Новое репо содержит только те коммиты, которые вы хотите, и нет необходимости запускать git prune или git gc для удаления старых объектов (потому что их там нет).

+2

хорошая альтернатива. +1 –

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^