我克隆了一个远程仓库,并希望在我的本地 git 服务器上拥有一个自己的副本。
所以我做了:
git clone ssh...
我在我的服务器上创建了一个新的 repo
git init --bare
我添加了新服务器
git remote add bm ssh...
比我推到新的遥控器
git push --mirror bm
现在我可以在我的裸服务器 repo 上看到:
[gitmini@blaumeise simulavr]$ git branch -a
* master
remotes/bm/master
remotes/savannah/HEAD
remotes/savannah/devel-tomk
remotes/savannah/master
remotes/savannah/oldstable
remotes/savannah/python_3
remotes/savannah/rel-1.0
remotes/savannah/rel-1.1
remotes/savannah/sbi_cbi_rework
看起来不错我觉得。
但是现在我从本地服务器签出
git clone ssh...
我只得到:
git branch -a
[krud@blaumeise simulavr]$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
我已经这样做了:git fetch --all
并且git pull --all
,没有任何改变。
我自己的服务器存储库有问题还是克隆时有问题?在这么糟糕的情况下我能做什么。
我已经阅读:如何获取所有 Git 分支
git clone
默认只复制其他 Git 的(本地)分支和标签。你可以得到更多的参考资料,包括像远程跟踪名称remotes/savannah/oldstable
。但这通常不是一个好主意。相反,在你的裸库,使之有分支机构与这些名字。
起初这一切都有些棘手,但最终这一切都开始变得有意义了。这些名称源于使用两个单独的 Git 存储库。每个 Git 存储库都有自己的分支名称,因此:
一个分支名是一个引用,其全名开头refs/heads/
。Sorefs/heads/master
代表 branch master
,依此类推。
一个远程跟踪名称为参考,其全名打头refs/remotes/
。全名的下一部分与remote的名称相同,在此之后(以及另一个斜杠)您将获得从另一个 Git 中获取的分支名称。
这是正常克隆的正常使用模式。有一些现有的存储库,有人(或许多人)在网络上的某个地方(例如,可能在 GitHub 上)建立了这些存储库,并且它有一堆分支:master
、develop
、feature/A
、feature/B
等等。您将该存储库克隆到您自己的机器(笔记本电脑或其他机器),并希望您的 Git为您记住它们的分支,但不要创建一堆(本地)分支。也许您现在选择做一些您想稍后作为 .js 文件的一部分发送给他们的工作feature/A
,因此您可以创建自己的名称feature/A
以进行新的提交以发送给他们,并建议他们将这些提交放在他们的 feature/A
. 你不工作feature/B
根本没有,所以你没有得到feature/B
,而且你没有使用,master
所以你可以删除你自己的master
.
一旦你这样做有一些新的提交,您将使用:
git push origin feature/A
将您的新提交发送到他们的 Git,并立即(作为git push
其自身的一部分)要求他们的Git 设置他们的 feature/A
分支以记住这些新提交。
当您第一次设置集中式服务器存储库时,您通常不想遵循正常模式。你有——或者想要复制——一些现有的存储库,比如,有十几个分支名称。如果此存储库还没有在您自己的笔记本电脑上,您可以使用git clone --mirror
它在您自己的笔记本电脑上制作临时副本:
git clone --mirror <url> [<path>]
现在,您的笔记本电脑上有一个完全没有远程跟踪名称的裸克隆(--mirror
暗示--bare
)。相反,Git 在您的存储库副本中创建了与其分支名称相对应的常规旧分支名称(而不是远程跟踪名称)。因此,您拥有与他们相同的十几个分支名称。 origin/*
镜像克隆对于您自己的任何工作都没用!您临时创建此镜像克隆,以获取其存储库的副本,其中的分支名称也是您的分支名称。如果您已经拥有一个包含十几个(或其他)分支的完整工作存储库,请跳过此步骤。
现在您拥有了包含所有分支的克隆,现在您可以在服务器(或 GitHub)上创建一个空存储库。现在你可以运行:
git push --all <url-of-server-repository>
现在,如果您制作了镜像克隆,则可以将镜像克隆扔掉。您所做的只是为了将所有内容(包括所有分支名称)发送到服务器。所以现在您可能想要删除镜像克隆并制作服务器克隆的正常克隆以用于执行实际工作。
(如果您git push
从已经全部设置的本地存储库中执行了a,则您不想或不需要删除本地克隆,并且您可能希望git remote add
在git push
.之前使用。见下文。)
您可能反对必须制作这个愚蠢的镜像克隆,然后才不得不在将镜像克隆推送到服务器后将其丢弃并制作一个正常的非裸克隆。
您不必进行镜像克隆。这只是为了方便。
相反,您可以:
git push --all
将这些全部发送到服务器或者,您可以:
git push
without --all
: 相反,使用refspecs将您端的远程跟踪名称推送到它们端的分支名称。最后一种方法在某些方面是最简洁的,但它需要理解 refspecs。
refspec 是第二简单形式的一对引用——全名如refs/heads/master
或refs/remotes/feature/A
,用冒号分隔:
。冒号左侧的名称是来源,右侧的名称是目的地。Refspecs 在git fetch
和 中的行为类似,但不完全相同git push
:源引用在发送 Git 中提供提交哈希,目标引用提供在接收Git 中设置的名称。由于从您的Git 存储库发送到他们的Git 存储库,您可以在左侧使用远程跟踪名称,在右侧使用它们的分支名称:git push
# after creating an empty repository on github
git remote add origin <url-on-github>
git push origin master # send your refs/heads/master to theirs
git push origin refs/remotes/savannah/devel-tomk:refs/heads/devel-tomk
git push origin refs/remotes/savannah/python_3:refs/heads/python_3
(假设您希望远程跟踪savannah/devel-tomk
成为他们的devel-tomk
分支,依此类推)。
你可以把所有的 refspecs 放在一个大行中git push
,但是拼写其中的一部分非常容易,这很烦人:
git push origin master refs/remotes/savannah/devel-tomk:refs/heads/devel-tomk refs/remotes/savannah/python_3:refs/heads/python_3
例如,如果我没有打错任何东西。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句