Сделать текущую фиксацию единственной (начальной) фиксацией в репозитории Git?

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

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

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

Я хотел бы нажать эти изменения в Github.

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

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

460
задан kaese 13 марта '12 в 14:41
источник поделиться

14 ответов

Здесь подход грубой силы. Он также удаляет конфигурацию репозитория.

Примечание. Это НЕ работает, если в репозитории есть подмодули! Если вы используете подмодули, вы должны использовать, например, интерактивная перезагрузка

Шаг 1: удалите всю историю (Убедитесь, что у вас есть резервная копия, это невозможно вернуть)

rm -rf .git

Шаг 2: восстановите репозиторий Git только с текущим контентом

git init
git add .
git commit -m "Initial commit"

Шаг 3: нажмите на GitHub.

git remote add origin <github-uri>
git push -u --force origin master
747
ответ дан Fred Foo 13 марта '12 в 14:44
источник поделиться

Единственное решение, которое работает для меня (и работает подмодулей) -

git checkout --orphan newBranch
git add -A  # Add all files and commit them
git commit
git branch -D master  # Deletes the master branch
git branch -m master  # Rename the current branch to master
git push -f origin master  # Force push master branch to github
git gc --aggressive --prune=all     # remove the old files

Удаление .git/ всегда вызывает огромные проблемы, когда у меня есть подмодули. Использование git rebase --root каким-то образом вызовет для меня конфликты (и у меня много истории).

410
ответ дан Zeelot 27 окт. '12 в 21:16
источник поделиться

Это мой благоприятный подход:

git branch new_branch_name $(echo "commit message" | git commit-tree HEAD^{tree})

Это создаст новую ветку с одной фиксацией, которая добавит все в HEAD. Он ничего не меняет, поэтому он полностью безопасен.

63
ответ дан dan_waterworth 22 марта '13 в 16:53
источник поделиться

Другим вариантом, который может оказаться большой работой, если у вас много коммитов, является интерактивная rebase (если ваша версия git равнa > 1,7.12): git rebase --root -i

При представлении списка коммитов в вашем редакторе:

  • Измените "pick" на "reword" для первого фиксации
  • Измените "pick" на "fixup" каждый другой commit

Сохранить и закрыть. git начнет перезагружаться.

В конце у вас будет новый корневой фиксатор, который является комбинацией всех тех, которые пришли после него.

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

Если вы действительно хотите уничтожить свою историю, reset master для этого фиксации и удалить все остальные ветки.

26
ответ дан Carl 14 марта '12 в 23:24
источник поделиться

Удалить папку .git может привести к проблемам в репозитории git. Если вы хотите удалить всю свою историю фиксации.

выполните следующие действия:

шаг-1 (checkout)

git checkout --orphan latest_branch

step-2 (добавьте все файлы)

git add -A

Шаг 3 (Зафиксируйте изменения)

git commit -am "commit message"

step-4 (Удалить ветвь)

git branch -D master

step-5 (переименуйте текущую ветвь на мастер)

git branch -m master

Шаг 6 (окончательный шаг, сила для обновления вашего репозитория)

git push -f origin master

!! Теперь наслаждайтесь историей фиксации!

21
ответ дан Shivam Srivastava 14 окт. '17 в 12:08
источник поделиться

Вариант предложенного метода larsmans:

Сохраните список непечатных файлов:

git ls-files --others --exclude-standard > /tmp/my_untracked_files

Сохраните конфигурацию git:

mv .git/config /tmp/

Затем выполните первые шаги larsmans:

rm -rf .git
git init
git add .

Восстановите конфигурацию:

mv /tmp/config .git/

Откажитесь от непроверенных файлов:

cat /tmp/my_untracked_files | xargs -0 git rm --cached

Затем зафиксируйте:

git commit -m "Initial commit"

И, наконец, нажмите на свой репозиторий:

git push -u --force origin master
14
ответ дан lalebarde 19 апр. '14 в 11:58
источник поделиться

Создайте ветвь, скопируйте все содержимое в нее, скопируйте ее и затем удалите главную ветвь:

git checkout --orphan newBranch; git add -A ;git commit -am 'first commit' ;git branch -D master;git branch -m master; git push -f origin master; git gc --aggressive --prune=all
5
ответ дан pratik_bhavsar 12 марта '17 в 17:53
источник поделиться

Вы можете использовать неглубокие клоны (git > 1.9):

git clone --depth depth remote-url

Дополнительная литература: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/

5
ответ дан Matthias M 04 апр. '16 в 14:05
источник поделиться

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

git log -n1 --format=%H >.git/info/grafts
git filter-branch -f
rm .git/info/grafts

Если вы хотите его очистить, попробуйте script:

http://sam.nipl.net/b/git-gc-all-ferocious

Я написал script, который "убивает историю" для каждой ветки в репозитории:

http://sam.nipl.net/b/git-kill-history

см. также: http://sam.nipl.net/b/confirm

2
ответ дан Sam Watkins 06 февр. '13 в 19:46
источник поделиться
git for-each-ref --format='git update-ref -d %(refname)' \
        refs/{heads,tags} | sh -x
current=$(git commit-tree -m 'Initial commit' `git write-tree`)
git update-ref -m 'Initial commit' `git symbolic-ref HEAD` $current

Это приведет к удалению всех локальных ветвей и тегов, сделает одно событие без истории с состоянием вашей текущей проверки в любой ветки текущей и оставит все остальное в вашем репо нетронутым. Затем вы можете принудительно нажать на свои пульты, как вам нравится.

1
ответ дан jthill 05 апр. '14 в 4:42
источник поделиться

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

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

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

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

0
ответ дан AnoE 04 апр. '16 в 14:27
источник поделиться

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

-1
ответ дан kkarki 23 авг. '17 в 18:55
источник поделиться

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

git reset --hard HEAD^ 

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

git reset --hard HEAD~2 

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

Дополнительная информация здесь

Git tutoturial здесь предоставляет помощь по очистке репозитория:

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

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
-1
ответ дан octoback 05 июня '13 в 8:41
источник поделиться

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

-1
ответ дан JB Lovell 11 апр. '17 в 21:54
источник поделиться

Другие вопросы по меткам