如何将Git浅层克隆转换为完整克隆?

Mot*_*Mot 193 git clone

这个问题的后续跟进:如果我有一个浅层克隆,如何获取所有旧提交以使其成为完整克隆?

Ram*_*r D 633

下面的命令(git版本1.8.3)将浅层克隆转换为常规克隆

git fetch --unshallow
Run Code Online (Sandbox Code Playgroud)

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

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin
Run Code Online (Sandbox Code Playgroud)

  • 这不会撤消--single-branch副作用.为此,编辑.git/config并将fetch = + refs/heads/BRANCHNAME:refs/remotes/origin/BRANCHNAME更改为fetch = + refs/heads/*:refs/remotes/origin/* (34认同)
  • 另见http://stackoverflow.com/questions/17714159/how-do-i-undo-a-single-branch-clone:`git config remote.origin.fetch"+ refs/heads/*:refs/remotes /来自答案的origin/*";``git fetch origin`应该与手动编辑.git/config相同 (25认同)
  • `git fetch --unshallow --update-head-ok origin '+refs/heads/*:refs/heads/*'` 对我有用 (5认同)
  • `fatal: --unshallow 在一个完整的存储库上没有意义`如果 799 人同意,那么我这边一定出了问题。我还没有确定是什么。 (4认同)
  • 这不会创建跟踪远程分支的本地分支,因此您仍需要签出-b BRNAME origin/BRNAME来进行设置. (3认同)

svi*_*ick 63

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

  • 现在`git fetch --unshallow`存在(如在@ sdram的回答中),这个答案不再是最好的答案了. (224认同)
  • 我使用`git fetch --unshallow`,但它仍然没有显示所有分支. (4认同)
  • `git fetch --depth = 2147483647`是为命令提供的最大可能深度. (3认同)
  • @Sid,/sf/ask/813670371/ 为我解决了这个问题。 (3认同)
  • 这两个答案都不适合我.两个命令都成功获取了所有丢失的提交,但是当我尝试推送新的提交时,我得到一个关于服务器的错误,不知道'浅'的引用 (2认同)

Vic*_*nko 17

我需要深化一个只有特定提交的回购.

阅读之后man git-fetch,我发现一个人无法指定提交,但可以指定一个日期:

git fetch --shallow-since=15/11/2012
Run Code Online (Sandbox Code Playgroud)

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

--deepen=<depth>
Run Code Online (Sandbox Code Playgroud)

与--depth类似,不同之处在于它指定了当前浅边界而不是每个远程分支历史记录的提交数.


小智 5

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

  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    
Run Code Online (Sandbox Code Playgroud)

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

然后,访问所有分支。

f. git remote set-branches origin '*'
Run Code Online (Sandbox Code Playgroud)

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

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

到(用 * 替换 master):

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

g. git fetch -v
Run Code Online (Sandbox Code Playgroud)

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


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

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