Git克隆一个已经是克隆的存储库

标签 git git-clone

git clone 是否有任何不良副作用?已克隆另一个远程存储库的存储库?

最佳答案

没有副作用,但您应该确切了解克隆存储库时会发生什么。

一些理论

“问题”在于,当您以“正常方式”克隆存储库时,即在调用 git clone 时没有调整任何时髦的旋钮。 —您最终不会得到与源代码相同的存储库。它确实包含完全相同的历史记录,但具有不同的分支布局。

为了以非科学的方式解释它,让我们举个例子:

  • 源代码库包含分支“master”、“dev”和“release”。

    它还包含两个标签,“v1”和“v2”。

    该存储库中的“HEAD”引用指向分支“master”。
  • 当您克隆此 repo 时,您的本地克隆将具有:
  • 三个远程跟踪分支:“origin/master”、“origin/dev”
    和“起源/发布”。
  • 两个标签,“v1”和“v2”。
  • 一个名为“master”的本地分支指向同一个提交
    远程跟踪分支“origin/master”可以。
  • 如果你现在克隆这个克隆,结果将是:
  • 单个远程跟踪分支“origin/master”。
  • 单个本地分支“master”。
  • 两个标签,“v1”和“v2”。

  • 这可能看起来很奇怪,但实际上这在
    手册页:

    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 initializing remote.origin.url and remote.origin.fetch configuration variables.



    所以“克隆”在 git clone意味着所有历史都被克隆(除非另有说明)但分支的布局是不同的。

    理由是:正是因为 Git 是一个分布式 VCS,
    从某种意义上说,非裸存储库中的所有分支都是“您的”
    你确实在处理它们,只有你决定它们如何同步
    其他存储库中的分支,何时以及为什么。

    因此,当您以“正常方式”克隆一个仓库时,Git:
  • 只获取该仓库的本地分支:没有远程跟踪分支
    被视为。

    这是因为远程跟踪分支充当状态的书签
    其他存储库,并且没有对它们进行任何工作。

    要理解 Git 为何如此行为,请考虑在您克隆时
    大多数时候你想要 Joe 的工作,而不是那些东西
    他从他与之通信的任何随机存储库中获取。
  • 将所有获取的分支转换为生成的 repo 中的远程跟踪分支。
  • 创建一个本地分支并检查它。

    这只是一种便利,只会增加可能的混淆。

  • 该怎么办

    那么,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/

    相关文章:

    github:没有可用的受支持的身份验证方法

    git - 在 git 中一次提交一个

    远程服务器上未使用 Git ssh forward-agent

    git - 如何知道一个标签是否快进到 BARE 存储库中的另一个标签?

    git - 如何自动化git在服务器上自动克隆一个repo?

    相同工作目录的 git remotes 是不同的(或者至少看起来是这样)

    git - 在 git 散列标签处进行浅克隆

    eclipse - 删除本地 git 仓库会影响远程仓库吗?

    git - 如何在 Jenkins 中设置 "Git Changelog"?

    git - 将 git repo 发送给非技术人员的标准方法