Git ref master теперь пуст, как восстановить?

Я не совсем уверен, что произошло, но по какой-то причине мой главный файл refreitory git теперь пуст. Мы размещаем репозиторий на Dropbox, так что, возможно, это связано с этим... но теперь я не могу от него отказаться. В нем говорится следующее:

Your configuration specifies to merge with the ref 'master' from the remote, but no such ref was fetched.

Dropbox хранит версии файлов, поэтому, если я вернусь к предыдущей версии "master", он говорит:

fatal: object 2d154f82e59a4156a5d3ea04a0617c243ae6dc3a is corrupted
fatal: The remote end hung up unexpectedly

Как мне оправиться от этого?

Ответ 1

Вздох.

Мне нравится Dropbox, но я бы никогда не рекомендовал его для "хостинга" репозиториев Git. Его синхронизация работает достаточно хорошо для однофайловых документов, но не приближается к предоставлению семантики распределенной/удаленной файловой системы, которая необходима для безопасного размещения репозитория Git.

Надеюсь, вы просто "размещаете" голый репозиторий Git в Dropbox. Если это так, вы должны иметь возможность собирать коммиты и ссылки из ваших не-голых (рабочих) репозиториев. Также должно быть возможно вручную восстановить существующий репозиторий, но вам все равно придется копировать объекты из других репозиториев, так что вы также можете сделать это следующим образом: "высокий уровень" (вместо перехода на "низкий уровень" ) и копирование объектов из других репозиториев (или копирование файлов пакетов и распаковка их частей)).

Начните с создания независимого клона одного из ваших рабочих каталогов.

git clone file://path/to/myrepo /path/to/myrepo-recovery-work

Импортируйте ссылки и объекты из других рабочих репозиториев.

# If you have network access to the other repositories:
cd /path/to/myrepo-recovery-work
git remote add other1 [email protected]:path/to/other/working-repo-1
git remote add other2 ssh://[email protected]/path/to/other/working-repo-2
# etc.
git fetch --all


# If you do not have network access:
cd /path/to/other/working-repo-1 &&  # on machine with working-repo-1
  git bundle create /path/to/other1.gitbundle --all HEAD
cd /path/to/other/working-repo-2 &&  # on machine with working-repo-2
  git bundle create /path/to/other2.gitbundle --all HEAD
# etc.
# Transfer the bundle files to the machine that has "myrepo-recovery-work"
# (Dropbox is OK to copy the bundles, they are just single files),
# then on that machine:
cd /path/to/myrepo-recovery-work
git remote add other1 /path/to/transferred/other1.gitbundle
git remote add other2 /path/to/transferred/other2.gitbundle
# etc.
git fetch --all

Затем просмотрите все ветки ваших новых пультов и определите, какие ветки должны указывать на то, что фиксирует ваш восстановленный центральный репозиторий.

git log --oneline --graph --decorate --abbrev-commit --all
# In addition to looking at the history graph, you might need to examine
# the content of certain commits. Just check them out as a detached HEADs.
git branch recovered/maintenance decafbad
git branch recovered/master cafebabe
git branch recovered/development deadbeef
git branch recovered/bug-1234 8badf00d

Создайте и переместите восстановленные ветки (и теги) в новый открытый репозиторий.

git init --bare /path/to/new-central-bare-repo.git # or real Git hosting service!
git remote add new /path/to/new-central-bare-repo.git
git push --tags new 'refs/heads/recovered/*:refs/heads/*'