我使用克隆的存储库和分支在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并且只是以错误的方式使用它。请问有人请指出我在使用和/或理解方面的错误吗?
答案 0 :(得分:12)
除了@ThiefMaster:
我喜欢
git clone --mirror
或
git push --mirror
更新所有(本地和远程)分支引用和标记
其他信息如上所述, - mirror将真正按原样复制repo,从而覆盖目标中的任何更改。源中不存在的分支将无条件修剪。
基本上,它就像使用遥控器并进行'git remote update --prune',不同之处在于受影响的分支可以是本地分支以及'远程'refs [1]
@LeSpocky (以及其他人?)
现在,如果更改消失,它们将永远不会产生合并问题,因此这很容易。
--mirror
以现实生活中的概念命名,因此它旨在为目标中的任何差异铺平道路。如果目标是非裸的,并且您提交了本地更改,则可以始终通过目标的本地分支(git log -g
,git 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