2011-02-07 4 views
29

Предположим, я совершу ошибку при первом нажатии на удаленный репозиторий Git. Могу ли я каким-то образом вернуть это, чтобы хранилище вернулось в исходное состояние? У меня нет доступа к удаленному компьютеру, поэтому удаление каталога .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 гт & & GIT толчок, который по-прежнему оставить бы ошибочный коммит, но файлы не будут беспокоить второй толчок.

+0

http://stackoverflow.com/questions/588414/git-rolling-back-a-remote-repository – Christian

+0

Похоже, это случай, когда вы по-прежнему остаетесь хотя бы с одним фиксатором. Я не хочу, чтобы у меня была одна фиксация. – Makis

ответ

51

Я думаю, что вы можете иметь проблемы 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 в удаленный репозиторий и нажать-удалить все ветви , включая текущий. Хотя я не понимаю, почему вам действительно нужно!

+0

ОК, это действительно работает! – Makis

+0

Зачем нужен флаг '-f' в этой третьей команде? –

+2

@John: '-f' означает' --force'. Это необходимо для не-быстрой перемотки вперед (нажатие на ветви, у которых нет прежней позиции ветви как предка). – Cascabel

0

git revert совершает, например. git revert HEAD.

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

Невозможно на самом деле удалить a зафиксировать историю, не имея доступа к директории .git.

+0

Итак, ответ «нет». – Makis

+1

@Makis: Этот ответ неверен. Вы можете удалить ветви на пульте дистанционного управления и принудительно вернуть основную ветку к своей первой фиксации. Это правда, что вы не можете оставить его без каких-либо коммитов вообще *, но вы можете заменить корневую фиксацию. * Оригинальные коммиты будут оставлены болтающимися и в конечном итоге очищены 'git gc -auto', который автоматически запускается а потом. – Cascabel

+0

Jonas, git команды (включая толкание) работают путем доступа и, возможно, изменения содержимого каталога .git. У вас * есть * доступ к каталогу .git удаленного пользователя через 'git push'. Это косвенное и неполное, но этого также достаточно для выполнения этой задачи. – Cascabel

0

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

Если вы хотите, чтобы подтолкнуть местное отделение Foo на удаленный филиал в первый раз, вы могли бы сделать это:

git push origin foo:foo 

Чтобы удалить удаленный филиал Foo, вы говорите мерзавца не нажать «ничего» к нему:

git push origin :foo 

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

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

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

+0

Как вы это делаете с мастер-веткой, когда там единственная ветка? Я добавил рабочий процесс к моему вопросу выше. – Makis

+1

'git push origin: master' - потому что это единственная ветвь и одна, которую вы проверили, это создаст некоторые ошибки, которые объяснят, как обойти эту проблему. (снова - это удалит _everything_ в этой удаленной ветке!) –

+0

(одним простым способом является 'git checkout -b master_tmp; git push origin: master') –

Смежные вопросы