Перезаписал каталог .git, восстанавливая состояние из объектов - PullRequest
0 голосов
/ 09 июня 2018

Я небрежно скопировал .git из одного проекта (A) в другой (B) с помощью удаленного scp -r (A) (B).

Я хотел бы восстановить работоспособное состояние git-репо.Я могу удалить объекты .git (A).Оттуда, как мне лучше всего найти советы по веткам git и перестроить полезное состояние репо.

К сожалению, у меня нет другой копии (B), и моя ошибка уничтожила метаданные,

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Ваша единственная проблема - восстановление ссылок.Все B объекты все еще там, но любые имена A (ветви, удаленные объекты, теги, ...), которые соответствуют B именам, перезаписывают указатели объектов.

Начните с

git fsck --root

, который покажет вам висячие коммиты и все корни, у большинства проектов есть только один, затем вы можете сделать git log --graph --decorate --oneline --ancestry-path $the $dangling $commits --not $the $roots.Так как копия также перезаписывала ваши reflogs, если вы нажали на all , ссылки найдут всю вашу пропавшую историю.

0 голосов
/ 09 июня 2018

Для A вы можете просто клонировать свежую копию (если есть пульт) в новую папку "A_copy":

  • git clone <url> A_copy

или для конкретной ветви:

  • git clone <url> -b some_branch A_copy

Затем возьмите папку .git из этой копии и поместите ее в свой "сломанный" A. Затемиспользуйте git status, чтобы увидеть, что изменилось.

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

  • git reset HEAD --hard - это вернет вас ксостояние HEAD.

Для B, если у вас есть хотя бы файлы и вы хотите превратить их в репозиторий, вы можете просто сделать следующее:

  • git init - делает папку git-репо
  • git add -A - обратите внимание, что это добавит все в эту папку, поэтому приведите в порядок сначала, если вам нужно, и, возможно, добавьте .gitingore, если требуется.
  • git commit -m "gehhh... had to start again :("
...