【问题标题】:How to convert a Git shallow clone to a full clone?如何将 Git 浅克隆转换为完整克隆?
【发布时间】:2020-06-26 15:07:20
【问题描述】:

跟进this so-question:如果我有一个浅克隆,如何获取所有较旧的提交以使其成为完整克隆?

【问题讨论】:

标签: git clone


【解决方案1】:

编辑: git fetch --unshallow 现在是一个选项(感谢 Jack O'Connor)。

您可以运行git fetch --depth=1000000(假设存储库的提交少于一百万)。

【讨论】:

  • 现在git fetch --unshallow 存在(如@sdram 的答案),这个答案不再是最好的。
  • 这两个答案都不适合我。两个命令都成功获取了所有丢失的提交,但是当我尝试推送新提交时,我收到一个错误,提示服务器不知道“浅”参考
  • git fetch --depth=2147483647 是提供给命令的最大可能深度。
  • 我使用了git fetch --unshallow,但仍然没有显示所有的分支。
  • @Sid, stackoverflow.com/questions/11623862/… 为我解决了这个问题。
【解决方案2】:

下面的命令 (git version 1.8.3) 将浅克隆转换为普通克隆

git fetch --unshallow

然后,访问所有原点分支(感谢 cmets 中的@Peter)

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

【讨论】:

  • 这不会撤消 --single-branch 的副作用。为此,请编辑 .git/config 并将 fetch = +refs/heads/BRANCHNAME:refs/remotes/origin/BRANCHNAME 更改为 fetch = +refs/heads/*:refs/remotes/origin/*
  • 这不会创建跟踪远程分支的本地分支,因此您仍然需要检查 -b BRNAME origin/BRNAME 才能进行设置。
  • 另见 stackoverflow.com/questions/17714159/…: git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"; git fetch origin 来自答案应该与手动编辑 .git/config 相同
  • 这仅在 repo 被标记为浅的情况下才有效。我不记得怎么做了,但是在某些情况下,您最终可能会得到一个不完整的 repo,而无需明确地进行浅层克隆。 @svick 的 stackoverflow.com/a/6802238/260122 是每次都有效的答案。
  • git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*' 为我工作
【解决方案3】:

我只需要将 repo 深化到特定的提交。

看了man git-fetch,发现不能指定提交,但是可以指定日期:

git fetch --shallow-since=15/11/2012

对于那些需要增量深化的人,另一个man引用:

--deepen=<depth>

类似于--depth,除了它指定的数量 从当前浅边界而不是从尖端提交 每个远程分支的历史记录。

【讨论】:

    【解决方案4】:

    你可以试试这个:

    git fetch --update-shallow
    

    【讨论】:

      【解决方案5】:

      以上消息都没有起到作用。我正在尝试从浅克隆开始使用 git 标签。

      第一次尝试

      git fetch --update-shallow
      

      哪种方式工作到一半。 然而,没有可用的标签!

      git fetch --depth=1000000
      

      最后一条命令真的提取了标签,我终于可以执行了

      git checkout -b master-v1.1.0 tags/v1.1.0
      

      并完成它。

      HTH

      【讨论】:

      • 反对票有什么用?请解释一下,以便我对此进行改进。谢谢。
      【解决方案6】:

      实现从浅克隆到深克隆的两种方法。 :

      1. 使用以下步骤下载分支:(这会下载分支的浅拷贝,然后将其转换为完整克隆,即带来完整的分支及其历史记录)。

        一个。 git clone -b 分支http://git.repository/customSP01.git --depth 1

      这会做一个浅层克隆(使用深度选项)只获取一个分支(在您请求的深度)。

      b. cd customSP01
      c. git fetch -depth=100
      d. get fetch -depth=500
      ....
      e. git fetch --unshallow    
      

      //上述命令会将浅克隆转换为普通克隆。 然而,这并没有带来所有的分支:

      然后,访问所有分支。

      f. git remote set-branches origin '*'
      

      [此步骤也可以通过编辑 .git/config 中的以下行来手动完成。

      fetch = +refs/heads/master:refs/remotes/origin/master

      to(用 * 代替 master):

      fetch = +refs/heads/*:refs/remotes/origin/* ]

      g. git fetch -v
      

      这会将浅克隆转换为具有所有历史记录和分支详细信息的深度克隆。


      1. 如果您使用以下命令代替步骤 a 中的命令,则可以避免步骤 f 和 g。做浅克隆:

        git clone -b 分支 --no-single-branch http://git.repository/customSP01.git --depth 1

      【讨论】:

      • 我只需要步骤 F。我做了git clone --depth=1 &lt;url&gt;,但后来git fetch --unshallow 没有修复它,git fetch --all 也没有修复它:远程分支列表仍然只有 master 和 HEAD。步骤 F 修复了它。
      猜你喜欢
      • 1970-01-01
      • 2017-04-25
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多