我们的目标是使用git和gerrit基于托管在外部仓库(github)上的项目进行内部开发。我们会定期从外部回购中提取新的更改和分支,并使用gerrit来管理审核流程(以及Jenkins构建所有内容)。
我们的初始过程是通过git从外部仓库克隆到本地仓库,然后在gerrit中创建一个空项目,最后将本地克隆推送到gerrit。
然而,在那时,我们看到gerrit repo中没有分支!现在我们通过手动添加分支和refids来解决这个问题,但这看起来很复杂和脆弱。我认为外部分支会默认进入,没有额外的扭曲。他们肯定是在github repo制作的克隆中。
理想情况下,能够直接从github克隆到gerrit并让它正常工作是很好的...不清楚为什么额外的本地回购只需要转移东西,或为什么分支没有出现当本地克隆被推到它时,在gerrit克隆中。建议?
答案 0 :(得分:4)
当你执行git push时,它只会推动活动分支(HEAD)。如果您希望推送所有分支和标记,请执行git push origin refs/heads/* --tags
在推送到Gerrit之前,技术上不需要拥有存储库的本地副本,但这可能是最简单的方法。
答案 1 :(得分:4)
我相信我已经为自己找到了答案。它归结为你如何创建存储库(这是我对裸存储库的正式介绍)。
简而言之,您可以使用默认方式克隆回购:
git clone https://github.com/foobar/myrepo.git
这会生成一个带有工作目录 myrepo 的本地克隆,其中包含 myrepo / .git 目录树。
或者你可以克隆它。 There are a couple of ways to do this,但--mirror选项显示为,产生最完整的副本:
git clone --mirror https://github.com/foobar/myrepo.git
这会产生 myrepo.git 目录(正如人们在gerrit或gitolite中看到的那样),它与上面的 myrepo / .git 目录具有相同的结构,但是没有工作目录位。
注意:我将补充一点,我现在不确定镜像是否比带有远程引用的裸克隆更适合分支...我已经another thread going查询了这个。为了完整起见,这里有一种方法来创建一个带有远程引用的裸克隆(该键不是工作目录):
git init --bare ${LOCAL_REPO}
cd ${LOCAL_REPO}
git remote add origin ${REMOTE_URL}
git fetch origin --tags
git fetch origin
我将镜像的想法作为一次性测试,将一个repo直接克隆到本地gerrit安装文件夹中,其中 All-Projects.git 也存在,重新启动gerrit并且它看到了repo以及所有分支机构。然而,它不是gerrit的理想方式。你应该从本地克隆(最好是一个裸的克隆)推送。
所以在gerrit中,通过Web管理界面创建一个新的空项目(我没有在其中放置一个初始的空提交 - 不确定这是否会导致问题),然后从repo的本地镜像中你'重新尝试复制,将其推送到新的空的gerrit repo以及分支和标签:
git push <gerrit_repo> refs/heads/* refs/tags/*