如何使用 git 获取完整的 repo 副本

克劳斯

我克隆了一个远程仓库,并希望在我的本地 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 上)建立了这些存储库,并且它有一堆分支:masterdevelopfeature/Afeature/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 addgit push.之前使用。见下文。)

以上有点浪费!

您可能反对必须制作这个愚蠢的镜像克隆,然后才不得不在将镜像克隆推送到服务器后将其丢弃并制作一个正常的非裸克隆。

不必进行镜像克隆这只是为了方便。

相反,您可以:

  • 做一个普通的克隆
  • 根据需要创建本地分支来表示所有远程跟踪名称
  • 用于git push --all将这些全部发送到服务器
  • 删除您创建的所有本地名称(但保留任何您不必创建的名称)。

或者,您可以:

  • 制作(或拥有)一个普通的克隆
  • 使用git pushwithout --all: 相反,使用refspecs您端远程跟踪名称送到它们端的分支名称

最后一种方法在某些方面是最简洁的,但它需要理解 refspecs。

refspec 是第二简单形式的一对引用——全名如refs/heads/masterrefs/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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

git:如何获取冲突文件的副本?

对git repo的完整贡献

如何在维护本地副本的同时在git repo中保留默认的,未跟踪的文件?

如何使用 DockerFile 从 git repo 获取源代码

如何在git中获取工作副本的树形哈希?

没有完整本地副本的Git

使用 Git Pull 覆盖本地文件 | 丢弃所有本地文件和目录,并从 repo git 中获取完整的最新代码

如何获取对象的副本

如何备份git repo?

如何使用git比较文件的工作副本,登台副本和已提交副本

如何在远程 git repo 中获取单个文件的 sha

如何手动设置git repo的获取来源?

如何获取git repo中<username>应用的最早的更改?

如何从 GitPython 中的 repo 获取目录 git 详细信息?

Cocoapods:如何获取已安装Pod的git repo地址?

如何仅从远程 git repo 中获取分支名称?

为什么“ git describe”在我的干净git repo副本上显示较旧的标记版本?

如何使用Dockerfile克隆git repo

如何使用Git Repo文件子集?

如何获取Webgl纹理的副本

如何在git repo中对所有源代码进行完整的平面转储?

如何从短哈希获取完整的git commit哈希?

从 Vault 获取 Jenkins git repo 凭据

从远程git repo获取特定的提交

如何克隆 git repo 并在 repo 目录中运行代码

如何获取git diff文件,并将其应用于作为同一存储库副本的本地分支?

如何从文件中获取要添加到 git repo 的文件?

git clone repo A到新的repo B,同时仍从repo A获取更新

无法在gitlab-ci中使用.gitmodules获取另一个git repo