В настоящее время у меня есть локальный репозиторий Git, который я помещаю в репозиторий Github.
Локальный репозиторий имеет ~ 10 коммитов, а репозиторий Github является синхронизированным дубликатом этого.
Я хотел бы удалить ВСЕ историю версий из локального репозитория Git, чтобы текущее содержимое репозитория отображалось как единственная фиксация (и, следовательно, более старые версии файлов в репозитории не сохраняются).
Затем я хотел бы отправить эти изменения в Github.
Я исследовал Git ReBase, но это больше подходит для удаления определенных версий. Другим потенциальным решением является удаление локального репо и создание нового - хотя это, вероятно, создаст много работы!
ETA: Существуют определенные каталоги / файлы, которые не отслеживаются, - если возможно, я хотел бы сохранить отслеживание этих файлов.
источник
Ответы:
Вот подход грубой силы. Также удаляет конфигурацию хранилища.
Примечание : это НЕ работает, если в хранилище есть субмодули! Если вы используете субмодули, вы должны использовать, например, интерактивный ребаз
Шаг 1: удалить всю историю ( убедитесь, что у вас есть резервная копия, это не может быть восстановлено )
Шаг 2: реконструируйте репозиторий Git только с текущим контентом
Шаг 3: нажмите на GitHub.
источник
.gitignore
должен справиться с этим, верно?git commit -m "Initial commit"
этого, вы, вероятно, можете пропуститьgit remote add ...
часть, предполагая, что она уже была в вашей конфигурации, и сразу перейти к нажатию. Это сработало для меня.Единственное решение, которое работает для меня (и поддерживает работу подмодулей)
Удаление
.git/
всегда вызывает огромные проблемы, когда у меня есть подмодули. Использованиеgit rebase --root
может как-то вызвать конфликт для меня (и займет много времени, так как у меня было много истории).источник
git push -f origin master
последний оп, и солнце снова засияет на вашем новом репо! :)git gc --aggressive --prune all
цели потерять историю будет упущено.Это мой любимый подход:
Это создаст новую ветку с одним коммитом, который добавляет все в HEAD. Это ничего не меняет, так что это абсолютно безопасно.
источник
git-rev-parse
документации. То, что здесь происходит,git-commit-tree
требует ссылки на дерево (снимок репо), ноHEAD
является ревизией. Чтобы найти дерево, связанное с коммитом, мы используем<rev>^{<type>}
форму.git push --force <remote> new_branch_name:<remote-branch>
Другой вариант, который может оказаться трудоемким, если у вас много коммитов, это интерактивная перебазировка (при условии, что ваша версия git> = 1.7.12):
git rebase --root -i
Когда в вашем редакторе представлен список коммитов:
Сохранить и закрыть. Git начнет перебазировать.
В конце у вас будет новый корневой коммит, представляющий собой комбинацию всех тех, что пришли после него.
Преимущество состоит в том, что вам не нужно удалять свой репозиторий, и если у вас есть мысли, у вас всегда есть запасной вариант.
Если вы действительно хотите уничтожить историю, сбросьте мастер до этого коммита и удалите все остальные ветви.
источник
error: failed to push some refs to
git push --force-with-lease
. сила с арендой используется потому, что она менее разрушительна, чем --force.Вариант предложенного метода Ларсмана :
Сохраните свой список неотслеживаемых файлов:
Сохраните вашу конфигурацию git:
Затем выполните первые шаги Ларсмана:
Восстановите ваш конфиг:
Удалите файлы, которые не были отслежены:
Затем совершите:
И, наконец, нажмите на ваш репозиторий:
источник
Ниже приведен скрипт, адаптированный из ответа @Zeelot. Следует удалить историю из всех веток, а не только из основной ветки:
Это сработало для моих целей (я не использую подмодули).
источник
git branch
рядом с вашей извлеченной веткой будет отмечен звездочкой, которая затем будет скомбинирована, что приведет к ее разрешению для всех файлов или папок, как если бы это были также имена ветвей. Вместо этого я использовал,git branch --format="%(refname:lstrip=2)"
который дал мне только названия филиалов.git push --force origin master
илиgit push --force-with-lease
? По-видимому, последний безопаснее (см. Stackoverflow.com/questions/5509543/… )Вы можете использовать мелкие клоны (git> 1.9):
Дополнительное чтение: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
источник
git filter-branch
является инструментом основной хирургии.--parent-filter
получает родителей на стандартный ввод и должен напечатать переписанные родители на стандартный вывод; unixtrue
успешно выходит и ничего не печатает, а значит: нет родителей.@^!
это Git сокращение от «глава коммит, но не любой из его родителей». Затем удалите все другие ссылки и нажмите на досуге.источник
Просто удалите репозиторий Github и создайте новый. Безусловно, самый быстрый, простой и безопасный подход. В конце концов, что вы должны получить, выполняя все эти команды в принятом решении, когда все, что вам нужно, это основная ветка с одним коммитом?
источник
Приведенный ниже метод является точно воспроизводимым, поэтому нет необходимости снова запускать клон, если обе стороны были согласованы, просто запустите сценарий на другой стороне.
Если вы хотите очистить его, попробуйте этот скрипт:
http://sam.nipl.net/b/git-gc-all-ferocious
Я написал сценарий, который «убивает историю» для каждой ветви в хранилище:
http://sam.nipl.net/b/git-kill-history
см. также: http://sam.nipl.net/b/confirm
источник
git-hash: not found
иSupport for <GIT_DIR>/info/grafts is deprecated
git log HEAD~${1:-0} -n1 --format=%H
здесь sam.aiki.info/b/git-hash Было бы лучше поместить все это в один скрипт для общественного потребления. Если я когда-нибудь воспользуюсь им снова, я могу выяснить, как это сделать с помощью новой функции, которая заменяет «трансплантаты».Более концептуальный ответ:
git автоматически собирает старые коммиты, если на них нет тегов / веток / ссылок. Таким образом, вам просто нужно удалить все теги / ветви и создать новый потерянный коммит, связанный с любой веткой - по соглашению вы позволите ветке
master
указывать на этот коммит.Тогда старые, недоступные коммиты больше никогда не будут видны никому, если они не будут копаться с низкоуровневыми командами git. Если вам этого достаточно, я бы просто остановился на этом и позволил автоматическому GC выполнить свою работу, когда захочет. Если вы хотите избавиться от них сразу, вы можете использовать
git gc
(возможно, с--aggressive --prune=all
). Для удаленного git-репозитория вы не можете заставить это сделать, если только у вас нет доступа оболочки к их файловой системе.источник
Ну вот:
Также размещено здесь: https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743
источник
Я решил похожую проблему, просто удалив
.git
папку из моего проекта и реинтегрировав ее с контролем версий через IntelliJ. Примечание..git
Папка скрыта. Вы можете просмотреть его в терминале с помощьюls -a
, а затем удалить его с помощьюrm -rf .git
.источник
Для этого используйте команду Shallow Clone git clone --depth 1 URL - он будет клонировать только текущий заголовок хранилища.
источник
Больше информации здесь.
Git tutoturial предоставляет помощь по очистке репозитория:
источник