Подтвердить что ты не робот

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

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

git clone [email protected]:someproject.git

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

ВАЖНО

Без --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.