Свести старую историю в Git

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

Я проверил git rebase -i, но это не удаляет другую (полную) историю, содержащую все коммиты из git.

Вот графическое представление (d — это наборы изменений):

(base) -> d1 -> d2 -> d3 -> (HEAD)

Я хочу:

(base) -> d1,d2 -> d3 -> (HEAD)

Как это можно сделать? Спасибо.

ИЗМЕНИТЬ

у меня работает с

git rebase -i cd1e8c9

cd1e8c9 является начальной ревизией (базой) для сквоша. Затем я использовал fixup, чтобы объединить ревизии вместе. Спасибо.


person schoetbi    schedule 22.12.2010    source источник
comment
возможный дубликат свертывания истории репозитория git   -  person Shawn    schedule 15.05.2015


Ответы (4)


Если вам на самом деле не важна вся история, другой простой способ сделать это — взять текущую ветку и создать на ее основе ветку-сироту. Затем добавьте все файлы в эту ветку и сделайте один первоначальный коммит (который потеряет всю историю). Затем это можно отправить в удаленный репозиторий.

Предполагая, что вы находитесь в ветке, которую хотите сгладить. Сначала проверьте, чистый ли он:

git status -s

Приведенная выше команда не должна ничего выводить.

Теперь создайте ветку-сироту:

git checkout --orphan flattened

Добавить все файлы

git add .

Создать единую фиксацию

git commit -m "Initial flattened commit"

Проверьте, все ли в порядке, и нажмите на удаленный (например):

git status -s

# (original_branch being the branch with the full history)
git diff original_branch..flattened  

# (assuming your remote is origin and the branch to overide is master) 
# Think twice before doing this!
git push origin +flattened:master 
person murraybo    schedule 09.01.2013
comment
Для чего это было предназначено? Попробовав это, я сделал вышеописанное, и на сервере осталась исходная ветка (мастер) с не меньшим количеством коммитов - на самом деле у него был еще один, коммит выравнивания, который только что был отправлен. Вытягивание на локальный мастер также показало не меньшее количество коммитов. Это, кажется, ничего не делает. - person Chris Moschini; 31.05.2016
comment
Приведенная выше последовательность команд должна создать новую ветку только с одним коммитом, который содержит все файлы из ветки, в которой локальный репозиторий был в начале. Последнее нажатие переопределяет удаленную основную ветку одной веткой фиксации. Это удаляет всю историю для основной ветки. Это можно использовать для последующего сжатия репозитория, чтобы сэкономить место и пропускную способность. Возможно, вы пропустили или опечатались в шаге git checkout --orphan flattened. - person murraybo; 31.05.2016
comment
Я думаю, что меня смущает то, где это происходит локально. Я выкопал еще немного после того, как оставил свой комментарий, и кажется, что это сглаживает вещи на сервере, но если вы затем локально тянете от мастера к мастеру, вы получаете этот 1 новый коммит - ваша локальная история остается не сглаженной и теперь резко отличается от сервера . Чтобы на самом деле сгладить, кажется, что всем нужно будет клонировать заново, а не вытягивать, что, по крайней мере, должно быть четко объяснено здесь, поскольку вряд ли это то, что некоторые имели в виду, когда хотели сгладить историю. - person Chris Moschini; 31.05.2016
comment
Приведенная выше последовательность переписывает историю так, чтобы все локальные репозитории не имели общего коммита с новым содержимым удаленной ветки. Поэтому всем нужно будет принудительно обновить сервер или, как вы упомянули, повторно клонировать репозиторий. Он не нацелен на нормальный цикл разработки git. Он нацелен на проблему, когда вы хотите хранить вещи в git, но не заботитесь об истории. Мы использовали его, чтобы уменьшить объем хранилища, необходимый для репозитория инструментов. В общей сложности он вырос до 18 ГБ, но для головного коммита требовалось менее 1 ГБ. Никто не заботился о трех старых JDK. - person murraybo; 31.05.2016
comment
Имеет смысл, просто было бы целесообразно включить в свой ответ последний лакомый кусочек с командами, чтобы заставить это извлекать с сервера на локальный. - person Chris Moschini; 31.05.2016

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

Вот мои коммиты

noufal@sanitarium% git log --pretty=oneline
967122e7d4e687c0707d25c62cb0d3b6a45d337f Added h
3b82cae737d5fb3317bc7a686a2fdf0fdd9d1c7e Added g
94d89e0455b12e1e4843e64a8f62f3ad6cdf42f3 Added f
a30321b7a367d9b7da6369783650acadbb773cfb Added e
04453f1c90ffde0574c9c8a76f154d741d7d83f4 Added d
ec723a3266e56cc39967bf117154465575905e31 Added c
f415d1f58e2f7bd4beea80ab9acd8309bf5b64e7 Added b
7f1f8d1f903168aa929818a0eb81e0ec7743fb85 Added a
21790602bd6c0a009899ea33e64fec63559c0a76 Added it

Я переустанавливаю 04453f1c90ffde0574c9c8a76f154d741d7d83f4 (Added d) на 21790602bd6c0a009899ea33e64fec63559c0a76 (первая фиксация) и уничтожаю их все, и я делаю это с помощью этой команды

git rebase 04453f1c90ffde0574c9c8a76f154d741d7d83f4 --onto 21790602bd6c0a009899ea33e64fec63559c0a76

После того, как я закончу это, журналы будут выглядеть так

noufal@sanitarium% git log --pretty=oneline
c76290666c8b868d36290d8f5276b879bb78d05d Added h
7001ce74f0837b35c0b82abbb82ad8f40801449c Added g
051062042e56759d83258c5e90a9876aa6f52764 Added f
fb1a62b0c0faefa0110ef7b8eee01a13f2f62034 Added e
21790602bd6c0a009899ea33e64fec63559c0a76 Added it

Это то, что вы ищете?

person Noufal Ibrahim    schedule 22.12.2010
comment
Какую версию git вы используете? Я получил: Использование: git rebase... с версией git 1.7.3.1.msysgit.0 - person schoetbi; 22.12.2010
comment
С опцией --root я получил ваш результат, однако, когда я сделаю мастер проверки, старая история снова появится. Как я могу полностью удалить его из истории? - person schoetbi; 22.12.2010
comment
Вы должны сжать коммиты (d1 и d2) в d1. Это делается с помощью rebase. Перемещение вашего HEAD вокруг будет отображать журналы только до этого коммита. - person Noufal Ibrahim; 22.12.2010
comment
Тогда я попробую с rebase. Спасибо - person schoetbi; 22.12.2010

squash соответствующие коммиты объединяются в один с помощью git rebase --interactive.

person Alan Haggai Alavi    schedule 22.12.2010
comment
есть ли способ сделать, например. git rebase сквош TAIL: 58c5e9 ? - person schoetbi; 22.12.2010
comment
Насколько мне известно (и в документации, похоже, не указано), это невозможно. - person Alan Haggai Alavi; 24.12.2010
comment
Удаляет ли это git/objects? - person williamcarswell; 01.06.2012

Это может показаться нетрадиционным, но если вас не волнует история, а репозиторий имеет только одну ветку master и не публиковался на Github.com или других сайтах, вы можете:

  1. Удалить скрытую папку .git в корне репозитория
  2. git init
  3. Совершить

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

person willnode    schedule 16.10.2017