Git不会克隆后续克隆上的所有分支?

时间:2011-04-06 08:16:45

标签: git branch clone

我使用克隆的存储库和分支在Git上遇到了一些问题,而且我不可能找到答案。让我来描述一下:我们在这里有一个简单的主Git存储库,我们都可以从这里下载并推送到位于本地linux机器上并可通过ssh访问。我把这个克隆到我的usb拇指驱动器上,如下所示:

git clone ssh://adahl@gollum//net/repos/netcube/patches.git

这给了我一个本地克隆,在我的拇指驱动器上有一个工作副本。我cd到这个,然后在这个克隆中看到一些分支:

cd patches
git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
  remotes/origin/stable

到目前为止一切都那么好,但是如果我再次将鼠标放在我的拇指驱动器上,那么稳定分支就会丢失。参见:

cd ..
git clone patches patches2

cd patches2

git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

我在克隆时尝试了几个选项,或者克隆后尝试了git fetch,没有任何东西将稳定分支带到 patches2 存储库。我假设我在这里缺乏理解git并且只是以错误的方式使用它。请问有人请指出我在使用和/或理解方面的错误吗?

4 个答案:

答案 0 :(得分:12)

除了@ThiefMaster:

我喜欢

git clone --mirror

git push --mirror 

更新所有(本地和远程)分支引用和标记

其他信息如上所述, - mirror将真正按原样复制repo,从而覆盖目标中的任何更改。源中不存在的分支将无条件修剪。

基本上,它就像使用遥控器并进行'git remote update --prune',不同之处在于受影响的分支可以是本地分支以及'远程'refs [1]

@LeSpocky (以及其他人?)

现在,如果更改消失,它们将永远不会产生合并问题,因此这很容易。

--mirror以现实生活中的概念命名,因此它旨在为目标中的任何差异铺平道路。如果目标是非裸的,并且您提交了本地更改,则可以始终通过目标的本地分支(git log -ggit reflog)的reflog将其恢复。

作为一般安全措施,您可以have a hook to 'git stash save' in the target

请记住, - 镜像设计为,镜像,这个问题实际上是关于如何将所有分支复制到裸机。 :)

[1](refs在那里,但远程定义不会被复制;如果你想要,请在推送目的地上从.git / config手动复制到.git / config)

答案 1 :(得分:3)

请参阅How to clone all remote branches in Git?

如果您确实希望将其包含在克隆中,则需要基于远程分支创建本地分支。但是,由于您无法在远程分支中工作,因此只要您开始在分支上工作,就会创建本地分支。在此之前,您并不需要在克隆中使用它,因为您可以随时从远程获取它。

但是,如果笔记本电脑没有网络连接,则必须为所需的所有远程分支创建本地分支,以便在克隆本地存储库时克隆它们。

如果您确实有网络连接,请使用git remote add origin2 ssh://adahl@gollum//net/repos/netcube/patches.git,然后使用git fetch origin2 - 随意用更有意义的名称替换origin2

答案 2 :(得分:2)

“origin”是您克隆回购地点的默认名称,它自动添加为远程(注意:远程只是表示“回购不是当前的” - 远程可以在同一台机器上)

patches中,“origin”指的是gollum上的原始回购。

patches2中,“origin”指的是patches

远程跟踪引用(以remotes/开头的引用)实际上不是本地分支 - 它们只是指向最后一次知道分支在远程上的位置的指针。因此,在patches中,您有原始仓库的远程跟踪引用,但在patches2上,您只有master中的本地patches分支的远程跟踪引用,因为那是patches2的原点指向的地方。

您可以使用git remote add在克隆之后将原始仓库添加为patches2中的另一个远程仓库 - 或者您可以从原始仓库而不是patches再次克隆。

答案 3 :(得分:0)

$ git remote update
$ git pull --all