做 git clone
是否有任何不良副作用?已克隆另一个远程存储库的存储库?
最佳答案
没有副作用,但您应该确切了解克隆存储库时会发生什么。
一些理论
“问题”在于,当您以“正常方式”克隆存储库时,即在调用 git clone
时没有调整任何时髦的旋钮。 —您最终不会得到与源代码相同的存储库。它确实包含完全相同的历史记录,但具有不同的分支布局。
为了以非科学的方式解释它,让我们举个例子:
它还包含两个标签,“v1”和“v2”。
该存储库中的“HEAD”引用指向分支“master”。
和“起源/发布”。
远程跟踪分支“origin/master”可以。
这可能看起来很奇怪,但实际上这在
手册页:
Clones a repository into a newly created directory, creates remote-tracking branches for each branch in the cloned repository (visible using
git branch -r
), and creates and checks out an initial branch that is forked from the cloned repository’s currently active branch.After the clone, a plain git fetch without arguments will update all the remote-tracking branches, and a git pull without arguments will in addition merge the remote master branch into the current master branch, if any (this is untrue when "--single-branch" is given; see below).
This default configuration is achieved by creating references to the remote branch heads under
refs/remotes/origin
and by initializingremote.origin.url
andremote.origin.fetch
configuration variables.
所以“克隆”在
git clone
意味着所有历史都被克隆(除非另有说明)但分支的布局是不同的。理由是:正是因为 Git 是一个分布式 VCS,
从某种意义上说,非裸存储库中的所有分支都是“您的”
你确实在处理它们,只有你决定它们如何同步
其他存储库中的分支,何时以及为什么。
因此,当您以“正常方式”克隆一个仓库时,Git:
被视为。
这是因为远程跟踪分支充当状态的书签
其他存储库,并且没有对它们进行任何工作。
要理解 Git 为何如此行为,请考虑在您克隆时
大多数时候你想要 Joe 的工作,而不是那些东西
他从他与之通信的任何随机存储库中获取。
这只是一种便利,只会增加可能的混淆。
该怎么办
那么,
git clone
接受“--mirror”命令行选项生成原始存储库的真实副本,但生成的存储库将
光着身子。
您是否应该再次使用“--mirror”重新克隆生成的存储库
命令行选项,您将再次获得真正的副本。
如果你做了一个“正常”的克隆(我认为你做了),你仍然可以
从该存储库中获取所有内容,但
git clone
不会剪掉它:你需要做
git init
其次是 git remote add origin <url>
其次是特制的git fetch
.究竟如何制作
git fetch
, 取决于你真正想要什么从源代码库中获取,以及将它放在哪里。
首先,请考虑源存储库现在具有“origin/master”和“master”,它们很可能包含不同的历史记录。
另请注意,使用
git clone --mirror
克隆非裸存储库会工作,但结果不会很明智,因为在这种情况下 git clone
将忠实地从源代码库中逐字复制所有分支(本地和远程跟踪),并将远程跟踪分支复制到您通常不希望出现在裸代码库中的内容中。
关于Git克隆一个已经是克隆的存储库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33874166/