Можно ли полностью очистить удаленный репозиторий Git? - PullRequest
39 голосов
/ 07 февраля 2011

Допустим, я допустил ошибку в своем первом отправлении в удаленный репозиторий Git.Могу ли я как-то вернуть это так, чтобы хранилище вернулось в исходное состояние?У меня нет доступа к удаленной машине, поэтому удаление каталога .git невозможно.

Насколько я понимаю, проблема в том, что вы не можете "сбросить" голову.

Это то, что я (или фактически коллега, который спросил об этом) сделал (я делаю локальное «удаленное» репо здесь, чтобы любой мог проверить это):

mkdir git-remote
cd git-remote
git init --bare
cd ..
mkdir git-local
cd git-local
git clone ../git-remote .
touch a
git add a
git commit -m "initial"
git push origin master

И в этот момент он понял,он выдвинул неправильный материал в удаленный репозиторий.

Единственная идея, которая у меня была, - это удалить все из его репозитория && git rm && git push, что все равно оставит там ошибочный коммит, но файлы не будут беспокоитьвторой толчок.

Ответы [ 3 ]

63 голосов
/ 07 февраля 2011

Я думаю, что у вас может быть проблема XY.На самом деле вам не нужно возвращать удаленный репозиторий в исходное состояние, чтобы начать все сначала;вам просто нужно начать сначала локально, а затем принудительно передать его на удаленный компьютер.

# create a new repository that has the initial commit that you want
mkdir foo; cd foo; git init; ...; git commit

# set up a remote
git remote add origin <url-of-remote>
git branch --set-upstream master origin/master

# push your new history
git push -f

# delete obsolete remote branches
git push origin :deprecated-branch

Удаленный репозиторий никогда не возвращается в состояние без фиксации, но заканчивается там, где вы хотите, и это всеэто имеет значение!

(Под капотом старые коммиты фактически все еще находятся в удаленном репозитории, но они остаются висящими, без ссылок на них. Они будут автоматически удалены, когда git gc --autoвызвано нажатием в какой-то момент.)

Если вы действительно, действительно хотите по какой-то причине очистить его, вы можете установить receive.denyDeleteCurrent в удаленном репозитории и принудительно удалить все ветви, включая текущую.,Я не понимаю, зачем вам это нужно!

1 голос
/ 07 февраля 2011

Когда вы говорите «первый толчок», вы имеете в виду самый первый толчок в ветке?Поскольку в нем не было никакого кода, прежде чем вы нажали на него.Если это так…

Если вы хотите перетащить локальную ветку foo в удаленную ветку в первый раз, вы должны сделать это:

git push origin foo:foo

Inдля того, чтобы удалить удаленную ветку foo , вы говорите git нажимать "ничто" на него:

git push origin :foo

Теперь вы можете начать все заново, как вам нравится.

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

(кстати, я думаю, что этот интерфейсдовольно смешно)

0 голосов
/ 07 февраля 2011

Вы можете git revert зафиксировать, например, git revert HEAD.

Имейте в виду, что отправленный вами контент будет находиться в каталоге .git.(Вы ничего не можете с этим поделать)

Фактически удалить коммит из истории невозможно, не имея доступа к каталогу .git.

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