Создание клонированного репозитория в git мастер

У меня есть два хранилища git:

  • report.git(мастер на удаленном месте)
  • cloned.git(локальный)

Я потерял report.git. У меня есть cloned.git. Я хочу клонировать другие репозитории из этого cloned.git. Это возможно, но мой вопрос: я что-то упускаю? Является cloned.git действительно таким же, как master report.git?

cloned.git по-прежнему указывает на главный отчет .git. Я изменил это, удалив параметры в .git/config. Достаточно ли этого?

Ответ 1

Ваш репозиторий cloned.git является клоном (копией) report.git в состоянии, в котором report.git был, когда вы клонировали или последний вытащил из report.git

Ваш cloned.git всегда был мастером, report.git всегда был мастером. Это красота git.

Ответ 3

Примечание. Сложная техника, описанная ниже, требуется только в том случае, если "клонированный" репозиторий - это рабочий репозиторий (т.е. не-голый репозиторий, который вы фиксируете, используя отдельный макет пультов), а не голый (или зеркальный) репозиторий. Если "cloned.git" - это голый репозиторий, достаточно сделать git clone --bare (или git clone --mirror) для восстановления исходного репозитория "report.git" (например, alinrus написал).


Предполагая, что вы использовали конфигурацию по умолчанию и современный Git, что означает макет "отдельные пульты", у вас будут ветки удаленного отслеживания "report.git" в "remotes/origin" (или "remotes/report" ) Пространство имен.

Чтобы повторно создать репозиторий "report.git" , вам придется нажать (или извлечь) один раз из ветвей удаленного отслеживания на обычные ветки, возвращая обычную fetch refspec (по крайней мере для ветвей: теги всегда зеркалируются). Таким образом, refspec для однократного нажатия (или выборки) будет выглядеть следующим образом: refs/remotes/origin/*:refs/heads/* plus refs/tags/*:refs/tags/*.


Пример сеанса восстановления

Предположим, что исходный репозиторий "report.git" содержит две ветки: "мастер" и "следующий", а не теги (метки отображаются 1-1, поэтому они не должны быть проблемой):

$ git init --bare report.git
# ...
[report.git] $ git branch -a
* master
   next

Пусть 'клонированный/.git' репозиторий является ординарным (не голым и не зеркальным) клоном 'report.git':

$ git clone [email protected]:report.git cloned
Initialized empty Git repository in /tmp/jnareb/cloned/.git/
# ...
[cloned] $ git branch -a
* master
   remotes/origin/HEAD -> origin/master
   remotes/origin/master
   remotes/origin/next
[cloned] $ git remote show origin
* remote origin
  Fetch URL: [email protected]:report.git
  Push  URL: [email protected]:report.git
  HEAD branch: master
  Remote branches:
    master tracked
    next    tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

Разумеется, статус ваших веток и количество ваших локальных веток могут отличаться для вашей ситуации. Это простой пример.

Теперь удалите или еще лучше переименуйте (отодвиньте) исходный репозиторий "report.git" , чтобы проверить нашу операцию восстановления

$ mv report.git report-copy.git

Теперь мы recovet состояние 'report.git', которое оно имело при последней операции fetch/pull в 'cloned/.git':

$ git init report.git    # push won't create new repository
# move to 'cloned' repository
[cloned] $ git push [email protected]:report.git 'refs/remotes/origin/*:refs/heads/*'
Counting objects: 12, done.
Compressing objects: 100% (6/6), done.
Writing objects: 100% (12/12), 839 bytes, done.
Total 12 (delta 1), reused 0 (delta 0)
Unpacking objects: 100% (12/12), done.
warning: updating the current branch
# long warning about pushing into current branch
To [email protected]:report.git
 * [new branch]      origin/HEAD -> HEAD
 * [new branch]      origin/master -> master
 * [new branch]      origin/next -> next

Теперь вы можете сравнить "report.git" и "report-copy.git", если они идентичны. Если "report.git" был не голым, они могут отличаться, потому что push не будет обновлять рабочий каталог (и вам нужно будет делать git reset --hard HEAD или git checkout в 'report.git' самостоятельно), но это голый репозиторий, не так ли?

HTH (надеюсь, что это поможет).