gpt4 book ai didi

git - 这些 `git fetch` 语法有什么区别?

转载 作者:太空狗 更新时间:2023-10-29 13:33:50 25 4
gpt4 key购买 nike

我已经裸克隆了一个存储库( git clone --bare ),显然是 git fetch不更新它,但 git fetch origin master:master做。我不明白这些语法之间的所有细微差别:

  • git fetch
  • git fetch origin
  • git fetch origin master
  • git fetch origin master:master
  • origin是我唯一的 Remote 和 master是我唯一的分支,帮助说:

    When no remote is specified, by default the origin remote will be used



    那么为什么这四行不一样呢?

    编辑:前三个命令似乎在名为 FEATCH_HEAD 的临时分支中获取。 .但由于我使用的是裸克隆,我不能使用 git merge获取获取的结果。

    编辑 2:从@torek 的回答中,我做了一个小测试并区分了一个 --bare 和一个 --mirror 克隆目录。结果如下:
    diff -ru mesa.bare.git/config mesa.mirror.git/config
    --- mesa.bare.git/config 2014-10-14 20:01:42.812226509 -0400
    +++ mesa.mirror.git/config 2014-10-14 20:00:53.994985222 -0400
    @@ -4,3 +4,5 @@
    bare = true
    [remote "origin"]
    url = git://anongit.freedesktop.org/mesa/mesa
    + fetch = +refs/*:refs/*
    + mirror = true
    Only in mesa.bare.git/objects/pack: pack-17005b7e1020d291eb86d778a174ecf0d60d92a9.idx
    Only in mesa.bare.git/objects/pack: pack-17005b7e1020d291eb86d778a174ecf0d60d92a9.pack
    Only in mesa.mirror.git/objects/pack: pack-c08b44b7f290ef0bc9abe3a0b974695c85a69342.idx
    Only in mesa.mirror.git/objects/pack: pack-c08b44b7f290ef0bc9abe3a0b974695c85a69342.pack

    谢谢!

    最佳答案

    Andrew C's comment包含此处的 key ,但我将详细说明:

  • git fetch ,不带附加参数,通过查看当前分支选择远程名称,或使用 origin (有关详细信息,请参阅文档)。选择了一个 Remote 后,它会继续下一个表格。
  • git fetch remote ,同样没有额外的参数,使用给定的 Remote ,并提取 fetch =该 Remote 的行以获得一组“refspecs”。然后它以类似于最后一种情况的方式进行。
  • git fetch remote refspec使用给定的远程和给定的 refspec(您可以在此处提供多个 refspec)来选择要更新的引用。

  • 曾经 git fetch有一个 Remote 或 URL——给定 Remote 的名称,它提取 url =获取 URL 的行——它联系远程服务器上的其他 git 命令,并要求他们提供所有远程存储库引用(分支、标签和其他引用,都在 refs/* 命名空间中,带有 HEAD 的特殊添加物,它也可以获得,但通常不在这里使用——它用于初始克隆步骤)。

    对于由此获得的每个引用, git fetch查看您是否要求它带来该引用,如果是,您要求 git 在您的存储库中使用什么名称。

    同样,可用的名称是从远程获得的。所需的名称是从您的 refspecs 中获得的,并且它们将在您的存储库中给出的名称也是从您的 refspecs 中获得的。

    形式为 a:b 的引用规范表示“引用 a ,但在本地将其称为 b。”

    refspec 缺少 b部分表示“引用 a ,但将其放入特殊的 FETCH_HEAD 文件中。” ( FETCH_HEAD 然后变得像一个普通的引用,像 MERGE_HEADORIG_HEAD 等等,除了它有一些额外的文本用于 pull 脚本,所以它只是有时像你可能的方式一样工作预计。)

    refspec 可能包含通配符: refs/heads/*表示“采用所有分支”(根据定义,分支是以 refs/heads/ 开头的引用)。通常是 fetch =您的 git 配置中的一行显示 refs/heads/*:refs/remotes/origin/* .1 和以前一样,这意味着重命名匹配的分支,使用 *在右边扩展到任何 *左边的冒号匹配。因此,这会将所有分支都带过来,但将它们重命名为 origin/master之类的。这通常是您想要的非 --bare存储库。

    有时这也是您想要的 --bare存储库,有时不是。特别是,有时您需要一个“镜像”存储库,它是一个简单的从属复制其他存储库的裸克隆。把普通的裸仓库改成这样的镜像,只需要修改 fetch =即可。行:而不是 refs/heads/*:refs/remotes/origin/*该行应为 fetch = refs/heads/*:refs/heads/* .事实上,你可能想用 fetch = refs/*:refs/* 带上所有东西(标签甚至笔记)。 .当然,您是否真的想要这只是您可以决定的事情。

    请注意,这很常见,以至于 git clone有一个自动设置的标志:clone with --mirror你会得到一个带有修改后的裸克隆 fetch =线。

    1实际上该行是 +refs/heads/*:refs/remotes/origin/* ,即还有一个领先的 +特点。这个加号设置了“强制标志”,就像你用过 git fetch --force ,对于那个特定的引用更新。这与此处的拼写问题并不是特别相关,但我会注意到,通常您希望对此处列出的远程分支以及纯镜像存储库进行强制更新。

    如果您要镜像标签,您可能希望这些标签进行强制更新。理想情况下,当然,标签永远不会改变(也不会被删除),因此在理想世界中这无关紧要,但在现实世界中,它们有时会改变或被删除。

    要处理引用删除,您必须告诉 git fetch--prune (或者,类似地,提供 --prunegit remote update )。 refspecs 中没有用于自动修剪的语法(虽然它是合理的,但我还没有看到任何建议)。

    关于git - 这些 `git fetch` 语法有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26350876/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com