Git:难以获取现有 Git 存储库以跟踪新的裸远程存储库

Git: Difficulty Getting Existing Git Repository to Track New Bare Remote Repository

总结: 我很难让现有的本地存储库跟踪新的裸远程存储库。

我试过的: 我试图在设置上游跟踪时将我的本地回购推送到新的裸回购。 Git 告诉我上游跟踪正在进行,但我仍然没有在本地仓库的日志中看到被跟踪的分支,即使在获取远程仓库之后也是如此。

我也试过从本地仓库创建一个裸克隆,希望这能以类似于克隆另一个自动设置跟踪的本地仓库的方式工作,但我仍然没有看到跟踪的迹象在本地仓库的日志中。

要求: 谁能看看下面的背景信息,并指导我可能出错的地方,或者对如何让我现有的回购跟踪新的裸远程回购有不正确的理解?谢谢,我已经尽力研究了。

背景 我在一个小团队中担任制造工程师。我们想为团队使用中央共享远程 Git 存储库设置工作流程。我一直在尝试设置一个演示如何运行,下面的 "centralRepo.git" 目录是我们的中央仓库,让其他文件夹团队成员可以将中央遥控器克隆到。

因为我们已经有现有的工作,但没有现有的中央远程仓库,我们将从 "davesClones" 中的现有仓库开始,将其推送到中央远程,然后克隆到其他团队成员的文件夹根据需要,例如 "stevesClones."

跟踪是否有效我希望看到的内容: 如果我克隆一个常规的本地存储库,跟踪会自动设置并且日志会显示我的克隆自己的分支,以及它从克隆目录中跟踪的 "origin" 分支,如下面圈出的屏幕截图所示蓝色:

尝试 #1:推动 w/--Set-Upstream:

我已经尝试使用将我现有的本地仓库推送到新的中央远程仓库 git push --set-upstream <remote> master 如下所示,即使输出显示跟踪已设置,我也没有看到 git 日志中发生任何跟踪,就像我在克隆常规存储库时所做的那样,即使在使用 fetch 之后也是如此.下面的示例显示了在尝试上述步骤后我是如何在日志中丢失原点跟踪分支的:

尝试#2:克隆-bare:

我还尝试将现有的回购克隆到一个新的裸回购,希望这会自动建立跟踪,但如下所示,日志似乎没有显示任何跟踪发生,即使在获取之后也是如此:

知道为什么我在日志中看不到跟踪吗? (意思是在克隆标准本地回购后我如何看到一个跟踪 [origin/master,origin head] 但是当使用 push --set-upstream 将本地回购推送到远程时我无法在我的日志中获取它,或者当使用 git clone --bare 将本地仓库克隆到裸远程时?)

此外,本地存储库中确实有一个提交,因此在推送或克隆到远程时它不是空的。

谢谢!

TL;DR

您需要通过在您自己的 Git 存储库中设置一个 远程 来启动整个过程:

git remote add <name> <URL-or-path>

之后您必须使用您使用的 name 部分,而不是输入(可能更长)URL-or-路径。也就是说,你会做:

git remote add origin /d/Seafile/...
git push --set-upstream origin master

先声明一下,我很不喜欢tracking这个词,因为它误导了大家。它对你也是如此。

我们必须使用 git remote 来创建或以其他方式操作 遥控器 。遥控器只是一个短名称,如 origin,这是遥控器使用的标准名字,它将存储 URL(以及其他一些更内部的-Git信息)。

我正在根据你的截图重新打字,所以我可能会出现错别字,但关键在这一行:

git push --set-upstream /d/Seafile/Development/gitTest/centralRepo.git master

让我们快速浏览一下 Git 文档。 git push 的语法在 the SYNOPSIS lines of the documentation 中描述为(缩写):

<strong>git push</strong> [options] [repository [refspec...]]

在这里,您唯一的选择是 --set-upstream(它本身很好),您的存储库作为路径名给出,/d/Seafile/...。如果你跳到 OPTIONS 部分,存储库参数的描述太简单了,如下所示:

<repository>
The "remote" repository that is destination of a push operation. This parameter can be either a URL ... or the name of a remote ....

不幸的是,这里省略的是 --set-upstream,以及您想要的那种跟踪,仅当给定的参数是远程时才有效

/d/Seafile/... 这样的路径名——你的 Git 在内部翻译成 D:/Seafile/... 正如你在其他输出中看到的那样——算作 URL 而不是 "remote".

遥控器和远程跟踪名称

与其说分支名称 tracks 其他名称,我更喜欢使用短语 has as upstream。不幸的是,这个短语有点尴尬(因此 Git 使用 track 作为动词)。任何分支名称都可以没有上游,也可以只有一个上游。当分支 确实 有上游时,可以是:

  • 另一个分支名称,例如,develop 可以将 master 作为其上游,或者
  • 一个远程跟踪名称 例如origin/master.

我称这些名称为 origin/master 远程跟踪名称(Git 文档大多称这些 远程跟踪分支名称).它们通过将 远程 的名称与分支名称串在一起而存在:Git 中的分支名称Git converses-with,当你的 Git phone 使用存储在 URL 下的另一个 Git "remote".

当您使用 git fetchgit push 时,您的 Git phone 又增加了一个 Git。有两个Git;每个 Git 都有 自己的 分支。你的 Git 有你的分支,他们的 Git 有他们的。你的 Git 愿意为你记住 他们的 名字,作为一项服务......但是为了让你的 Git 记住他们的分支名称,你的 Git必须为每个不干扰您自己的分支名称的名称。你的 Git 通过在他们的分支名称前面粘贴一些东西来做到这一点。1

此处粘贴在前面的部分是 远程 名称,例如 origin。没有遥控器——用 URL 代替——没有什么可以粘贴在前面,所以粘贴在前面永远不会发生。 --set-upstream 选项失效。

那么为什么你的 Git 打印:

Branch 'master' set up to track remote branch 'master' from 'D:/Seafile/Development/gitTest/centrapRepo.git'.

?这里唯一可能的答案是 Git 非常 Gitty。它只是说它做了一些物理上不能做的事情,因此没有做。


1从技术上讲,远程跟踪名称位于单独的 namespace: 分支名称中,分支名称具有以 refs/heads/ 开头的全拼名称,因此master 实际上是 refs/heads/master。远程跟踪名称以 refs/remotes/ 开头,然后继续包括远程名称和另一个斜线。名称的其余部分是在 URL 的那个遥控器上看到的精简分支名称。所以他们的 refs/heads/master 变成了你的 refs/remotes/origin/master,它被精简显示为 origin/master