【问题标题】:Shallow clone cannot fetch new commits/branches?浅克隆无法获取新的提交/分支?
【发布时间】:2019-10-04 06:09:07
【问题描述】:

我有这个:

git clone --depth=1 <repo> app
cd app
git fetch origin
git checkout a119b1076dd45a88a3609c4f7893ef3d82f9a4ee

但它说:

fatal: reference is not a tree: a119b1076dd45a88a3609c4f7893ef3d82f9a4ee

如果我使用分支的名称:

 git checkout me/work

我明白了:

error: pathspec 'me/work' did not match any file(s) known to git.

是因为我做了一个浅克隆吗?对我没有多大意义。提交在远程,至少具有该名称的分支/提交在远程。

更新:

所以我在git fetch --all 中添加了一个--all,然后运行git branch -vv --all,我看到了:

* master                4761f83 [origin/master] timeline event update date should not be the review date.  Every time it is inserted or updated the update date should be the current utc date
  remotes/origin/HEAD   -> origin/master
  remotes/origin/master 4761f83 timeline event update date should not be the review date.  Every time it is inserted or updated the update date should be the current utc date

所以分支不在那个列表中,如果这对我有帮助的话。

【问题讨论】:

    标签: git git-clone git-checkout


    【解决方案1】:

    A shallow clone is also, by default, a single-branch clone:

    --深度
    创建一个浅克隆,其历史记录被截断为指定的提交次数。暗示 --single-branch 除非 ...

    single-branch 克隆就是它所说的:一个只从上游复制一个分支的克隆。 (底层机制是通过默认的fetch refspecs,因此您可以通过提供 refspecs 临时覆盖它以进行一次提取。)

    如果您希望浅克隆复制多个分支,则必须将其转换为非单分支克隆,或者将其作为非单分支克隆开始。要从一个人开始,请继续阅读引用的句子的其余部分。要将现有的单分支克隆更改为两个、三个或全分支克隆,请参阅How do I "undo" a --single-branch clone?

    【讨论】:

    • 是的,这是有道理的,我对 FETCH_HEAD 的回答似乎有效
    • 是的:您正在覆盖默认的 fetch refspec。您提供的 refspec 说要获取他们的 me/work,通过您的 FETCH_HEAD 文件临时记住提交,而不创建任何其他名称。然后git checkout -b 使用.git/FETCH_HEAD 中记住的数据(直到下一个fetch)创建一个新的本地分支名称。
    【解决方案2】:

    正如--depth 的文档所说,

    暗示--single-branch,除非给出--no-single-branch

    如果你愿意的话

    获取所有分支尖端附近的历史记录

    在你的克隆上给--no-single-branch,或者为了一次性更正自己获取,

    git fetch --depth=1 origin +refs/heads/*:refs/remotes/origin/*
    

    或追溯关闭单分支设置

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

    然后是git fetch

    【讨论】:

      【解决方案3】:

      我认为如果你做一个浅层克隆,这种方法是可行的

      git fetch origin me/work
      git checkout -b temp FETCH_HEAD
      

      【讨论】:

        【解决方案4】:

        当您进行浅层克隆时,您可能需要指定要获取的分支:

        git clone --depth=1 --branch=me/work <repo> app
        

        【讨论】:

        • 这是在一个Dockerfile中,clone部分被缓存了,我不知道以后要checkout哪个分支,一般来说很正常
        • 不幸的是,浅克隆不是这样工作的。如果你想在分支之间切换 - 那么你需要克隆整个树。
        • 是的,我认为你是对的,我添加了一个可行的答案(我认为)
        猜你喜欢
        • 2018-02-13
        • 1970-01-01
        • 2012-08-14
        • 1970-01-01
        • 2011-06-23
        • 2014-03-17
        • 2019-10-25
        • 1970-01-01
        • 2017-04-25
        相关资源
        最近更新 更多