Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于github项目使本地gerrit和存储库工作(包括分支)_Git_Github_Gerrit - Fatal编程技术网

基于github项目使本地gerrit和存储库工作(包括分支)

基于github项目使本地gerrit和存储库工作(包括分支),git,github,gerrit,Git,Github,Gerrit,我们的目标是基于使用git和gerrit托管在外部回购(github)上的项目进行内部开发。我们将定期从外部回购中提取资金,引入新的变化和分支机构,并使用gerrit来管理审查流程(Jenkins来构建所有流程) 我们的初始过程是通过git将外部回购克隆到本地回购,然后在gerrit中创建一个空项目,最后将本地克隆推送到gerrit 然而,在这一点上,我们在gerrit回购协议中没有看到分支机构!现在,我们正在通过手动添加分支和refid来解决这个问题,但这似乎很复杂和脆弱。我认为外部分支会在默

我们的目标是基于使用git和gerrit托管在外部回购(github)上的项目进行内部开发。我们将定期从外部回购中提取资金,引入新的变化和分支机构,并使用gerrit来管理审查流程(Jenkins来构建所有流程)

我们的初始过程是通过git将外部回购克隆到本地回购,然后在gerrit中创建一个空项目,最后将本地克隆推送到gerrit

然而,在这一点上,我们在gerrit回购协议中没有看到分支机构!现在,我们正在通过手动添加分支和refid来解决这个问题,但这似乎很复杂和脆弱。我认为外部分支会在默认情况下进入,没有额外的扭曲。它们当然是从github repo复制的


理想情况下,能够直接从github克隆到gerrit并让它正常工作会很好。。。目前还不清楚为什么仅仅为了转移东西就需要额外的本地回购,或者为什么当本地克隆被推送到gerrit克隆中时,分支没有出现在gerrit克隆中。建议?

当您执行git推送时,它只推送活动分支(HEAD)。如果希望推送所有分支和标记,请执行类似于
git推送原点参考/heads/*--tags的操作


从技术上讲,在推给Gerrit之前不需要存储库的本地副本,但这可能是最简单的方法。

我相信我自己已经找到了答案。它归结为如何创建存储库(这是我对裸回购的正式介绍)

简而言之,您可以使用默认方式克隆回购:

git clone https://github.com/foobar/myrepo.git
这将生成一个具有工作目录myrepo的本地克隆,其中包含myrepo/.git目录树

或者你可以把它克隆成裸体,但是--mirror选项似乎可以生成最完整的副本:

git clone --mirror https://github.com/foobar/myrepo.git
这将生成myrepo.git目录(如gerrit或gitolite中所示),该目录与上面的myrepo/.git目录具有相同的结构,但没有工作目录位

注意:我要补充一点,我现在不确定镜像是否比分支具有远程引用的裸克隆更可取。。。我有人问过这件事。为了完整起见,下面是一种使用远程引用(键为“无工作目录”)创建裸克隆的方法:

我一次性测试了镜像思想,将repo直接克隆到本地gerrit安装文件夹中,All-Projects.git也在该文件夹中,重新启动了gerrit,它可以看到repo及其所有分支。然而,这不是gerrit的理想方式。您应该从本地克隆(最好是裸克隆)进行推送

因此,在gerrit中,通过web管理界面创建一个新的空项目(我没有在其中放入初始的空提交-不确定这是否会导致问题),然后从您尝试复制的repo的本地镜像中,将其推送到新的空gerrit repo以及分支和标记:

git push <gerrit_repo> refs/heads/* refs/tags/*
git推送引用/头/*refs/tags/*

我会尝试一下,然后跟进。与gerrit仅拥有一份本地回购协议副本相比,拥有额外的本地回购协议副本在哪些方面更容易?(我意识到一定有一个不平凡的原因——我只是想更好地理解它是什么。)我采取了一种不同的方法,似乎更直接地解决了这个问题,但我非常感谢你的回答!使用存储库的本地副本的主要原因是,您不必登录服务器来更新任何上游更改—这一切都可以通过客户端计算机完成。基本上,您的客户端将充当容纳gerrit的服务器、回购协议和外部回购协议之间的代理(无论是从服务器中拉出还是推送到服务器)。准确吗?没错。在服务器上做任何日常活动通常都是不好的,尤其是在Gerrit背后。您将丢失Gerrit提供的任何安全检查、日志记录、审核等功能。您还可以使用更强大的功能来处理问题—如果在服务器上运行
rm
命令,则会导致havok,但很容易从客户端恢复。
git push <gerrit_repo> refs/heads/* refs/tags/*