Можно ли считать локальный клон Git полной резервной копией репозитория, из которого он был клонирован? - PullRequest
46 голосов
/ 11 января 2011

Предположим, я клонировал Git-репозиторий на свой локальный диск, используя:

git clone username@git.example.com:someproject.git

Теперь предположим, что git.example.com не резервируется, и он гаснет в сиянии славы.Содержит ли мой клон все необходимое для восстановления удаленного репо, которое было потеряно? Ultimate Backups раздел Git Magic предполагает, что ответ «да», но мне не ясно.

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

Чтобы еще больше запутать проблему, наличие git clone --mirror подсказывает мне, что мой локальный клон должен не считается полной резервной копией удаленного репо.

Ответы [ 3 ]

50 голосов
/ 11 января 2011

Клон можно считать полной резервной копией всех данных в вашем удаленном хранилище, но не обязательно метаданных (вот где появляется переключатель --mirror).Ваш клон будет содержать все объекты commit, tree, blob, branch и tag, на которые так или иначе ссылается хранилище.Это означает, что ваша резервная копия будет содержать весь ваш исходный код, историю и связанные ветви или теги.

Разница с переключателем --mirror заключается в том, что без него клон не будет включать в себя такие вещи, как удаленныесоздан на сервере.Это не важно в «Я надеюсь, что я не потерял ни одного источника!»в некотором роде, но они могут быть для того, чтобы ваш сервер снова заработал и работал, как он был.

Если вы заинтересованы в создании резервной копии, которая может быть восстановлена ​​на сервере, как будто никогда не было проблем, тоВы должны использовать --mirror, но для большинства сценариев подойдет простой клон.

3 голосов
/ 11 января 2011

Ваш локальный клон не будет полной резервной копией. Это будет резервная копия состояния этого репозитория, но он не будет иметь все ссылки на исходный репозиторий (поэтому он не будет знать о состоянии любого удаленного ветви).

Для полного резервного копирования вы правильно нашли git clone --mirror. Это будет иметь не только ветви для исходного хранилища. Он также отобразит все ссылки, включая удаленные ветви.

1 голос
/ 22 ноября 2017

ВАЖНО

Без --mirror, клон не будет полной резервной копией. Любая строка работы, не видимая в git branch -r, будет удалена из клона.

Простая демоверсия

Станьте свидетелем простого репо.

$ git init G
$ cd G
$ for f in 1 2 3 4; do date >1 && git add 1 && git commit -m $f; sleep 1.1; done
$ git log --oneline --graph --all --decorate
* 3c111bd (HEAD -> master) 4
* a08fea4 3
* d5c8d73 2
* 802856b 1

Добавить ветку:

$ git checkout d5c8d73
HEAD is now at d5c8d73... 2
$ git branch starts-at-2
$ git checkout starts-at-2
Switched to branch 'starts-at-2'
$ for f in 1 2 3 4; do date >1 && git add 1 && git commit -m 2-$f; sleep 1.1; done
$ git log --oneline --graph --all --decorate
* 6bb05bf (HEAD -> starts-at-2) 2-4
* fe1b635 2-3
* a9323fb 2-2
* 33502af 2-1
| * 3c111bd (master) 4
| * a08fea4 3
|/
* d5c8d73 2
* 802856b 1

Клонировать репо.

$ cd ..
$
$ git clone G G2
Cloning into 'G2'...
$ cd G2
$ git log --oneline --graph --all --decorate
* 6bb05bf (HEAD -> starts-at-2, origin/starts-at-2, origin/HEAD) 2-4
* fe1b635 2-3
* a9323fb 2-2
* 33502af 2-1
| * 3c111bd (origin/master) 4
| * a08fea4 3
|/
* d5c8d73 2
* 802856b 1

Fine. Клонировать снова.

$ cd ..
$ git clone G2 G3
$ cd G3
$ git log --oneline --graph --all --decorate
* 6bb05bf (HEAD -> starts-at-2, origin/starts-at-2, origin/HEAD) 2-4
* fe1b635 2-3
* a9323fb 2-2
* 33502af 2-1
* d5c8d73 2
* 802856b 1

Urk.

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