Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
本地Git克隆是否可以被视为是从中克隆的repo的完整备份?_Git - Fatal编程技术网

本地Git克隆是否可以被视为是从中克隆的repo的完整备份?

本地Git克隆是否可以被视为是从中克隆的repo的完整备份?,git,Git,假设我已使用以下方法将Git存储库克隆到本地磁盘: git clone username@git.example.com:someproject.git 现在假设,git.example.com没有被备份,它在一片荣耀中消失了。我的克隆是否包含重建丢失的远程回购所需的一切?文章的这一部分暗示答案是“是的”,但我并不清楚 请注意,我不是在问“我的本地克隆是否是主分支的充分备份?”我是在问我的本地克隆是否可以被视为远程repo中包含的所有内容的完整备份;所有的分支,所有的标签,所有的东西。例如,本

假设我已使用以下方法将Git存储库克隆到本地磁盘:

git clone username@git.example.com:someproject.git
现在假设,
git.example.com
没有被备份,它在一片荣耀中消失了。我的克隆是否包含重建丢失的远程回购所需的一切?文章的这一部分暗示答案是“是的”,但我并不清楚

请注意,我不是在问“我的本地克隆是否是
主分支的充分备份?”我是在问我的本地克隆是否可以被视为远程repo中包含的所有内容的完整备份;所有的分支,所有的标签,所有的东西。例如,本地回购协议中未跟踪的远程分支如何


为了进一步混淆这个问题,git clone--mirror的存在向我建议,我的本地克隆不应被视为远程repo的完整备份。

克隆可以被视为远程存储库中所有数据的完整备份,但不一定是元数据(这就是
--mirror
开关的作用所在)。克隆将包含存储库以任何方式引用的所有提交、树、blob、分支和标记对象。这意味着您的备份将包含所有源代码、历史记录和关联的分支或标记

--mirror
开关的不同之处在于,如果没有它,克隆将不会包括在服务器上创建的远程设备之类的东西。这些对于“我希望我没有丢失任何源代码!”之类的方式来说并不重要,但它们可能是为了让服务器恢复正常运行


如果您想创建一个可以像从来没有任何问题一样恢复到服务器上的备份,那么您应该使用
--mirror
,但在大多数情况下,一个简单的克隆是可以的。

您的本地克隆不会是一个完整的备份。它将是该存储库状态的备份,但不会包含所有的sou引用rce存储库(因此它不知道任何远程分支的状态)

对于完整备份,您正确地找到了
git clone--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.

在对
--mirror
做了更多的研究之后更新了我的答案。谢谢你的回答。我应该澄清克隆的存储库是一个裸存储库,我不希望它有远程设备。在包含裸存储库的系统设置为备份之前,我将依赖我的克隆(正在使用CrashPlan对其进行备份)在灾难场景中。根据您的回答,我现在觉得这样做很舒服。我想说的是,
clone--mirror
的存在澄清了这个问题。镜像克隆复制的东西,而普通裸克隆复制的东西,恰恰是使普通克隆成为不完整备份的原因。如果您不清楚,您可以尝试。我知道这是一个30年前的评论,但是…@Cascabel implicit