Боюсь, я не смог найти ничего похожего на этот конкретный сценарий.
У меня есть git-репозиторий с большой историей: 500+ веток, 500+ тегов, начиная с середины 2007 года. Он содержит ~ 19 500 коммитов. Мы хотели бы удалить всю историю до 1 января 2010 года, чтобы сделать ее меньше и легче иметь дело (мы сохраним полную копию истории в архивном хранилище).
Я знаю, что коммит, который я хочу, стал корнем нового хранилища. Однако я не могу найти правильный git mojo для усечения репо, чтобы начать с этого коммита. Я угадываю какой-то вариант
git filter-branch
привлечение трансплантатов будет необходимо; она также может быть необходимо для лечения каждого из 200+ ветвей , которые мы хотим сохранить отдельно , а затем патч репо вместе (то , что я действительно знаю , как это сделать).
Кто-нибудь когда-нибудь делал что-то подобное? У меня есть git 1.7.2.3, если это имеет значение.
источник
git filter-branch --tag-name-filter cat -- --all
чтобы обновить теги. Но у меня также есть старые теги, указывающие на старую историю, которую я хочу удалить. Как я могу избавиться от всех этих старых тегов? Если я не удаляю их, то старая история не исчезает, и я все еще могу видеть ееgitk --all
.echo "<NEW-ROOT-HASH>" > .git/info/grafts
Возможно, уже слишком поздно отправлять ответ, но поскольку эта страница является первым результатом Google, она все равно может оказаться полезной.
Если вы хотите освободить место в своем репозитории git, но не хотите перестраивать все свои коммиты (перебазирование или трансплантация), и при этом можете толкать / извлекать / объединять людей, имеющих полное репо, вы можете использовать git клон мелкий клон ( параметр --depth ).
Вы можете обуздать существующее репо, выполнив следующие действия:
Как удалить все локальные теги git?
Ps: Старые версии git не поддерживали клонирование / push / pull из / для мелких репозиториев.
источник
cd
к папке, которая была только что удалена? Я чувствую, что здесь какая-то недостающая информация. Кроме того, есть ли способ применить эти изменения к удаленному репо?git clone file:///Users/me/Projects/myProject myClonedProject --shallow-since=2016-09-02
работает как шарм!git filter-branch -- --all
. Это изменит все хеши в нем, но после этого вы сможете перенести его в новый репоЭтот метод прост для понимания и отлично работает. Аргументом для script (
$1
) является ссылка (tag, hash, ...) на коммит, начиная с которого вы хотите сохранить свою историю.Обратите внимание, что старые теги все еще будут присутствовать; поэтому вам может потребоваться удалить их вручную
примечание: я знаю, что это почти то же самое, что и @yoyodin, но здесь есть несколько важных дополнительных команд и информации. Я пытался отредактировать ответ, но, поскольку это существенное изменение в ответе @ yoyodin, мое редактирование было отклонено, поэтому вот информация!
источник
git prune
иgit gc
команд. Есть ли объяснение для остальных команд в сценарии? В настоящее время неясно, какие аргументы передаются ему и что делает каждая команда. Спасибо.-p
вrebase
команду, как это было предложено в другом ответеПопробуйте этот метод Как обрезать историю Git :
Вот
$1
SHA-1 коммита, который вы хотите сохранить, и скрипт создаст новую ветвь, которая содержит все коммиты между$1
и,master
и вся старая история удаляется. Обратите внимание, что этот простой сценарий предполагает, что у вас нет существующей вызванной ветвиtemp
. Также обратите внимание, что этот скрипт не очищает данные git для старой истории. Запуститеgit gc --prune=all && git repack -a -f -F -d
после того, как вы убедились, что вы действительно хотите потерять всю историю. Вам также может понадобитьсяrebase --preserve-merges
предупредить, что реализация этой функции в git не идеальна. Проверьте результаты вручную, если вы используете это.источник
rebase
шаге. Странно - я не ожидал, что в этих обстоятельствах возможны конфликты слиянием.git commit --allow-empty -m "Truncate history"
если зафиксированный вами коммит не содержит файлов.В качестве альтернативы переписыванию истории рассмотрите возможность использования,
git replace
как в этой статье из книги Pro Git . Обсуждаемый пример включает замену родительского коммита для имитации начала дерева, сохраняя при этом всю историю как отдельную ветвь для безопасного хранения.источник
git replace
. Я считаю, что это было исправлено в другом вопросе, где вы опубликовали этот ответ.git replace
против»git graft
проводится на stackoverflow.com/q/6800692/873282Если вы хотите сохранить в вверх по течению хранилище с полной историей , но местные мелкие извлечений, сделать неглубокий клон с
git clone --depth=1 [repo]
.Нажав коммит, вы можете сделать
git fetch --depth=1
обрезать старые коммиты. Это делает старые коммиты и их объекты недоступными.git reflog expire --expire-unreachable=now --all
, Срок действия всех старых коммитов и их объектовgit gc --aggressive --prune=all
убрать старые предметыСмотрите также Как удалить локальную историю git после коммита? ,
Обратите внимание, что вы не можете перенести этот «мелкий» репозиторий куда-либо еще: «мелкое обновление не разрешено». См. Удалено отклонено (мелкое обновление не разрешено) после изменения удаленного URL Git . Если вы хотите этого, вы должны придерживаться прививки.
источник
Мне нужно было прочитать несколько ответов и другую информацию, чтобы понять, что я делаю.
1. Игнорировать все, что старше определенного коммита
Файл
.git/info/grafts
может определить поддельных родителей для коммита. Строка с просто идентификатором коммита говорит, что у коммита нет родителя. Если мы хотим сказать, что мы заботимся только о последних 2000 коммитах, мы можем набрать:git rev-parse дает нам идентификатор коммита 2000-го родителя текущего коммита. Приведенная выше команда перезапишет файл трансплантатов, если он присутствует. Проверьте, если это там в первую очередь.
2. Переписать историю Git (необязательно)
Если вы хотите, чтобы этот привитый поддельный родитель был реальным, выполните:
Это изменит все идентификаторы коммитов. Каждая копия этого хранилища должна быть принудительно обновлена.
3. Очистить место на диске
Я не сделал шаг 2, потому что я хотел, чтобы моя копия оставалась совместимой с апстримом. Я просто хотел сэкономить место на диске. Чтобы забыть все старые коммиты:
Альтернатива: мелкие копии
Если у вас есть мелкая копия другого хранилища и вы просто хотите сэкономить место на диске, вы можете выполнить обновление
.git/shallow
. Но будьте осторожны, чтобы ничто не указывало на коммит из ранее. Таким образом, вы можете запустить что-то вроде этого:Запись на мелководье работает как прививка. Но будьте осторожны, чтобы не использовать трансплантаты и мелкие одновременно. По крайней мере, там нет одинаковых записей, это не удастся.
Если у вас все еще есть старые ссылки (теги, ветви, удаленные заголовки), которые указывают на более старые коммиты, они не будут очищены и вы не сэкономите больше дискового пространства.
источник
git replace
вместо. См stackoverflow.com/questions/6800692/...При перебазировании или толкании к голове / мастеру эта ошибка может возникнуть
Для решения этой проблемы в git dashboard следует удалить главную ветку из «Защищенных веток»
тогда вы можете запустить эту команду
или
источник
Здесь слишком много ответов, которые не актуальны, а некоторые не полностью объясняют последствия. Вот что сработало для меня, чтобы урезать историю, используя последний git 2.26:
Сначала создайте фиктивный коммит. Этот коммит появится как первый коммит в вашем усеченном репо. Вам это нужно, потому что этот коммит будет содержать все базовые файлы для истории, которую вы храните. SHA - это идентификатор предыдущего коммита коммита, который вы хотите сохранить (в данном примере
8365366
). Строка 'Initial' будет отображаться как сообщение о коммите первого коммита. Если вы используете Windows, введите следующую команду из командной строки Git Bash.Выше команда печати SHA, например,
d10f7503bc1ec9d367da15b540887730db862023
.Теперь просто введите:
Сначала все файлы будут помещены
8365366
в фиктивный коммитd10f750
. Затем он будет воспроизводить все коммиты после 8365366 поверхd10f750
. Наконец,master
указатель ветви будет обновлен до последнего воспроизведенного коммита.Теперь, если вы хотите подтолкнуть эти усеченные репо, просто сделайте
git push -f
.Несколько вещей, которые нужно иметь в виду (это относится и к другим методам, а также к этому): теги не передаются. Хотя идентификаторы и временные метки сохранены, вы увидите, что GitHub показывает эти коммиты в виде единовременного заголовка
Commits on XY date
.К счастью, усеченную историю можно сохранить как «архив», и позже вы можете присоединиться к урезанному репо с архивным репо. Для этого смотрите это руководство .
источник
Вы можете удалить каталог, файлы, а также всю историю, связанную с dir или файлом, используя нижеприведенный jar [download it] и команды
Файл bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
git clone --bare repo-url cd repo_dir java -jar bfg.jar --delete-folder имя_папки git reflog expire --expire = сейчас - все && git gc --prune = сейчас - агрессивный толчок git --mirror repo_url
источник
источник