是否可以将本地Git克隆视为克隆它的存储库的完整备份?

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

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

现在,假设没有备份git clone --mirror,而它掉在一片光荣中。 我的克隆是否包含重建丢失的远程存储库所需的一切? Git Magic的Ultimate Backups部分建议答案是“是”,但我不清楚。

请注意,我不是在问“本地克隆是否是git clone --mirror分支的足够备份?” 我在问我的本地克隆是否可以视为远程回购中包含的所有内容的完整备份; 所有分支,所有标签,所有内容。 例如,在本地存储库中未跟踪的远程分支怎么办?

更令人困惑的是,git clone --mirror的存在向我表明我的本地克隆不应被视为远程回购的完整备份。

Matt Hurne asked 2020-06-27T02:51:18Z
3个解决方案
51 votes

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

--mirror交换机的不同之处在于,没有它,克隆将不包括在服务器上创建的远程对象之类的东西。 在“我希望我没有丢失任何消息!”中,这些都不重要! 的方式,但它们可能是为了使服务器恢复正常运行。

如果您有兴趣创建可以像从来没有任何问题一样可以还原到服务器上的备份,则应该使用--mirror,但是对于大多数情况而言,简单的克隆就可以了。

James Gregory answered 2020-06-27T02:51:49Z
3 votes

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

对于完整的备份,您正确地找到了git clone --mirror。这不仅将具有原始存储库的分支。 它还将映射所有引用,包括远程分支。

Abizern answered 2020-06-27T02:52:14Z
1 votes

重要

没有--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

rk

bobbogo answered 2020-06-27T02:53:04Z
translate from https://stackoverflow.com:/questions/4658451/can-a-local-git-clone-be-considered-a-complete-backup-of-the-repo-it-was-cloned