Git:git 获取 <branch> 结束于 "xxx/xxx does not appear to be a git repository"

Git: git fetch <branch> ends in "xxx/xxx does not appear to be a git repository"

我在从我的远程仓库中获取一个特定分支时遇到问题。

如果我做 git branch -a 输出是:

* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/release/2.0.23175_BBDDv10
...

没关系,我所有的分支机构都在远程但只要我这样做

git fetch origin/release/2.0.23175_BBDDv10

我收到:

fatal: 'origin/release/2.0.23175_BBDDv10' does not appear to be a git repository
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

我是回购协议的所有者,我拥有它的权利,如果我这样做:

git remote -v

输出为:

origin  https://xxxm@xxx.org/xxxxx/xxxxxxx.git (fetch)
origin  https://xxx@xxx.org/xxxxx/xxxxxxx.git (push)

所以 'origin' 指向它必须指向的地方。

此时我无法获取一个特定的分支(还没有尝试获取 --all)

以防万一添加一些内容:

不确定这可能与它有关,但以防万一,如果它有任何帮助,我可以补充一点,我昨天错误地推送了两个非常大的文件,然后在 [=45] 之后将它们都删除了=] 说明 (https://rtyley.github.io/bfg-repo-cleaner/)。它们很容易跟踪,我不需要的大文件从本地和 remote/history.

中消失了

git fetch 命令接受零个、一个或两个或更多个参数:

  • git fetch:调用默认远程(通常origin)并获取所有内容
  • git fetch <em>remote</em>: 调用named 遥控器。通常你必须在这里使用origin
  • git fetch <em>remote</em> <em>branch1 ... branchN</em>:调用named 远程,当它列出其分支时,仅选择特定的 named 分支。

您正在尝试使用这三种形式中的最后一种,但犯了两个不同的错误:

  1. 必须提供遥控器的名称,在本例中为origin
  2. 你的Git中的origin/*名字是你Git重命名他们的的结果] Git 的 分支 名称,这样它们就不会与您自己的分支名称冲突。

因此你想要的是:

git fetch origin release/2.0.23175_BBDDv10

调用 他们的 Git,询问他们 他们的 release/2.0.23175_BBDDv10 分支,并更新 你的origin/release/2.0.23175_BBDDv10名字。

如果您觉得这令人困惑,请放心,它令人困惑的

直到您意识到两件事之前,关于斜杠的去向和时间的整个事情都很混乱:

  • 第三个字——普通的origin部分——不是分支名称(master , release/2.0.23175_BBDDv10) 并且不是 远程跟踪 名称 (origin/master, origin/release/2.0.23175_BBDDv10)。这是第三种名称,远程名称。
  • Branch 名称,如 masterrelease/2.0.23175_BBDDv10 对每个存储库都是私有的,您可以 查看 他们的名称git fetch 但您的 git fetch 重命名了 它们,使您的 远程跟踪名称 类似于 origin/release/2.0.23175_BBDDv10.

所以你总是要记得问,当你有一个分支名称时,谁的分支名称:你的,还是他们的?好吧,只有当您 连接 两个 Git 时,您才真正需要记住这一点,使用 git pushgit fetchgit pull(运行 git fetch):

  • 使用 git push,您将让您的 Git 要求他们的 Git 设置他们的 分支机构 名称之一.您将根据需要向他们发送一些提交,然后您的 Git 会询问他们:请将 ______(分支名称)设置为 ______(提交哈希ID),如果可以的话。(使用git push --force将这个礼貌的请求变成命令。)

  • 使用 git fetch,您将让他们的 Git 查看他们的 分支 名称,获取任何新提交 他们到你自己的Git,然后更新你的远程跟踪origin/*)名称。

  • git pull 运行 git fetch,因此它的作用与 git fetch 相同。 (在 git fetch 成功完成后,git pull 运行第二个 Git 命令,通常是 git merge。我通常建议 避免 git pull 直到你真正理解 git fetch 第二个 Git 命令是如何工作的,因为每个步骤本身就足够令人困惑,但这是你的个人选择应该自己做。)

放在一边

这里有一条适用于大多数 Git 用户的简单规则:永远不要使用 git fetch --all

(它没有打破任何东西,但它并不代表人们认为的意思。)

(高级Git用户的规则是还没有使用它。等等,不,这是optimization的规则。)