假设我使用以下方法将Git存储库克隆到本地磁盘:
git clone username@git.example.com:someproject.git
现在假设git.example.com
没有被备份,而且它在荣耀的火焰中消失了。我的克隆是否包含重建丢失的远程仓库所需的所有内容? Ultimate Backups的Git Magic部分表明答案是肯定的,但我不清楚。
请注意,我不是在问“我的本地克隆是master
分支的足够备份吗?”我问我的本地克隆是否可以被视为远程仓库中包含的所有的完整备份;所有分支,所有标签,一切。例如,那些未在本地仓库中跟踪的远程分支呢?
为了进一步混淆该问题,git clone --mirror
的存在向我建议我的本地克隆不应被视为远程仓库的完整备份。
答案 0 :(得分:50)
克隆可以被视为远程存储库中所有数据的完整备份,但不一定是元数据(--mirror
交换机所在的位置)。您的克隆将包含存储库以任何方式引用的所有提交,树,blob,分支和标记对象。这意味着您的备份将包含所有源代码,历史记录以及相关的分支或标记。
与--mirror
开关的区别在于,如果没有它,克隆将不会包含已在服务器上创建的遥控器等内容。这些并不重要“我希望我没有失去任何消息来源!”一种方式,但它们可能是让你的服务器恢复运行,就像它一样。
如果您有兴趣创建一个可以恢复到服务器上的备份,就像从来没有任何问题一样,那么您应该使用--mirror
,但对于大多数情况,一个简单的克隆就可以了。
答案 1 :(得分:3)
您的本地克隆将不是完整备份。它将是 存储库状态的备份,但它不会所有源存储库的refs(所以它不会知道的状态任何远程分支机构。)
要进行完整备份,您已正确找到git clone --mirror
。这不仅具有原始存储库的分支。它还将映射包括远程分支在内的所有引用。
答案 2 :(得分:1)
如果没有--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
精细。 再次克隆。
$ 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。