Сделать текущий коммит единственным (начальным) коммитом в Git-репозитории? - PullRequest
607 голосов
/ 13 марта 2012

В настоящее время у меня есть локальный репозиторий Git, который я отправляю в репозиторий Github.

Локальный репозиторий имеет ~ 10 коммитов, а репозиторий Github является синхронизированным дубликатом этого.

Что я хотел бы сделать, это удалить ВСЕ историю версий из локального репозитория Git, чтобы текущее содержимое репозитория отображалось как единственная фиксация (и, следовательно, более старые версии файлов в репозитории не сохраняются).

Тогда я бы хотел перенести эти изменения в Github.

Я исследовал Git ReBase, но это больше подходит для удаления определенных версий. Другим потенциальным решением является удаление локального репо и создание нового - хотя это, вероятно, создаст много работы!

ETA: есть определенные каталоги / файлы, которые не отслеживаются, - если возможно, я хотел бы сохранить отслеживание этих файлов.

Ответы [ 14 ]

0 голосов
/ 23 августа 2017

Для этого используйте команду Shallow Clone git clone --depth 1 URL - он будет клонировать только текущий заголовок хранилища

0 голосов
/ 11 апреля 2017

Я решил похожую проблему, просто удалив папку .git из моего проекта и реинтегрировав ее с контролем версий через IntelliJ.Примечание. Папка .git скрыта.Вы можете просмотреть его в терминале с помощью ls -a, а затем удалить его с помощью rm -rf .git.

0 голосов
/ 04 апреля 2016

Я хотел бы удалить ВСЕ историю версий из локального репозитория Git, чтобы текущее содержимое репозитория отображалось как единственная фиксация (и, следовательно, более старые версии файлов в репозитории не сохраняются).

Более концептуальный ответ:

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

Старые, недоступные коммиты больше никогда не будут видны никому, если они не будут копаться с низкоуровневыми командами git. Если вам этого достаточно, я бы просто остановился на этом и позволил автоматическому GC выполнить свою работу, когда захочет. Если вы хотите избавиться от них сразу, вы можете использовать git gc (возможно, с --aggressive --prune=all). Для удаленного git-репозитория вы не можете заставить это сделать, если только у вас нет доступа оболочки к их файловой системе.

0 голосов
/ 05 июня 2013

Чтобы удалить последний коммит из git, вы можете просто запустить

git reset --hard HEAD^ 

Если вы удаляете несколько коммитов сверху, вы можете запустить

git reset --hard HEAD~2 

для удаления двух последних коммитов. Вы может увеличить число, чтобы удалить еще больше коммитов.

Подробнее здесь.

Git tutoturial здесь предоставляет информацию о том, как очистить хранилище:

вы хотите удалить файл из истории и добавить его в .gitignore чтобы он не был случайно передан заново. Для наших примеров мы собираюсь удалить Rakefile из хранилища гемов GitHub.

git clone https://github.com/defunkt/github-gem.git

cd github-gem

git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch Rakefile' \
  --prune-empty --tag-name-filter cat -- --all

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

echo "Rakefile" >> .gitignore

git add .gitignore

git commit -m "Add Rakefile to .gitignore"

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

git push origin master --force
...