① 如何根据账号权限读取gerrit上某些库的列表
-- sqlServer:一、操作步骤 首先进入数据库级别的【安全性】-【登录名】-【新建登录名】 (图1:新建登录名) 2. 在【常规】选项卡中,如下图所示,创建登陆名,并设置默认的数据库。 (图2:设置选项) 3. 在【用户映射】选项卡中
② 字符终端如何访问gerrit管理的git服务器
首先创建这个项目
user@host:~$ ssh -p 29418 user@localhost gerrit create-project --name demo-project
user@host:~$
You need to make sure that at least initially your account is granted "Create Reference" privileges for the refs/heads/* reference. This is done via the web interface in the Admin/Projects/Access page that correspond to your project.
After that it’s time to upload the previous history to the server:
把数据传到新建立的git仓库中去
user@host:~/my-project$ git push ssh://user@localhost:29418/demo-project *:*
Counting objects: 2011, done.
Writing objects: 100% (2011/2011), 456293 bytes, done.
Total 2011 (delta 0), reused 0 (delta 0)
To ssh://user@localhost:29418/demo-project
* [new branch] master -> master
user@host:~/my-project$
③ 如何访问gerrit的h2数据库
访问gerrit的h2数据库步骤:
1、从 https://code.google.com/p/gerrit/downloads/list 页面下载gerrit的war包到某个目录
2、数据库准备,懒得设置用了默认的H2 DB
3、创建gerrit2用户,初始化
sudo adser gerrit2
sudo su gerrit2
java -jar gerrit.war init -d /home/gerrit2/site
一些交互式提问,默认或自定义,同样懒得设置apache,认证用了 development_become_any_account 选项,反向代理没有;
设置完成就自动启动了~; 如果没有启动手动 ./site/bin/gerrit.sh start
4、创建标准 后台服务连接
sudo ln -snf `pwd`/site/bin/gerrit.sh /etc/init.d/gerrit.sh
sudo ln -snf ../init.d/gerrit.sh /etc/rc3.d/S110gerrit
sudo ln -snf ../init.d/gerrit.sh /etc/rc5.d/S110gerrit
5、登陆http://10.20.20.XX:9080,页面右上角点击become :
注册用户 fullname emailaddress name ssh公钥(.ssh/id_rsa.pub)设置保存,
设置保存后,在客户端验证一下,命令及输出如下:
[$name@$hostname ~]$ ssh -p 29418 [email protected]
**** Welcome to Gerrit Code Review ****
Hi $fullname, you have successfully connected over SSH.
Unfortunately, interactive shells are disabled.
To clone a hosted Git repository, use:
git clone ssh://$name@$hostName.$domainname:29418/REPOSITORY_NAME.git
Connection to 10.20.20.XX closed.
6、从gerrit服务器,clone代码工
git clone ssh://[email protected]:29418/$repoName.git
7、进入项目目录cd $repoName 安装hook; 钩子的目的是在提交信息中自动创建 'Change-Id:' 标签
scp -p -P 29418 [email protected]:hooks/commit-msg .git/hooks/
8、修改提交
9、push 到gerrit服务器
git push origin HEAD:refs/for/$branchName
#直接git push会失败,原因还不知道~~ ~~
10、push成功后web页面All->open和My->changes标签下面,就可以看到提交的修改了
11、web的review没有approve选项,需要在project的accecss中增加相应权限; 还有后面的verify权限也是类似操作;
④ 如果发现git push到gerrit的文件不全怎么办
今天上午同事和我说neutron项目要换成全新的内部代码,原先仓库里的代码要全部废弃掉。于是我就简单地创建了一个空项目使用git push --force将其置空。
下午的时候,麻烦事情就来了,同事发现提交patch的时候,会发现如下报错:
remote: Resolving deltas: 100% (2/2)
error: unpack failed: error Missing unknown
fatal: Unpack error, check server log
To ssh://[email protected]:29418/neutron.git
! [remote rejected] HEAD -> refs/publish/datong (n/a (unpacker error))
error: failed to push some refs to 'ssh://[email protected]:29418/neutron.git'
通过google我找到了两篇文章:
《Gerrit Code Review - Unpack error Missing unknown》一文是说git的某object受损导致:
http://asheepapart.blogspot.jp/2011/10/gerrit-code-review-unpack-error-missing.html
我使用文提供的方法发现根本就不存在 object。
然后我又搜到了一个在stackoverflow上的相关提问:
http://stackoverflow.com/questions/16586642/git-unpack-error-on-push-to-gerrit
提问指出如果你使用了git 1.8 + gerrit 2.7版本的组合,就会出现这样的问题,可惜的是我所使用的git和gerrit版本均低于此。
鉴于网上没有靠谱的解决办法,只能自己去查问题所在了。先查看了gerrit的日志:
[2014-01-07 03:57:15,400] ERROR com.google.gerrit.sshd.BaseCommand : Internal server error (user newptone account 1) ring git-receive-pack '/neutron.git'
com.google.gerrit.sshd.BaseCommand$Failure: fatal: Unpack error, check server log
at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:157)
at com.google.gerrit.sshd.AbstractGitCommand.service(AbstractGitCommand.java:106)
at com.google.gerrit.sshd.AbstractGitCommand.access$000(AbstractGitCommand.java:34)
at com.google.gerrit.sshd.AbstractGitCommand$1.run(AbstractGitCommand.java:72)
at com.google.gerrit.sshd.BaseCommand$TaskThunk.run(BaseCommand.java:430)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ScheledThreadPoolExecutor$ScheledFutureTask.access$101(ScheledThreadPoolExecutor.java:165)
at java.util.concurrent.ScheledThreadPoolExecutor$ScheledFutureTask.run(ScheledThreadPoolExecutor.java:266)
at com.google.gerrit.server.git.WorkQueue$Task.run(WorkQueue.java:337)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1146)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:701)
Caused by: java.io.IOException: Unpack error on project "neutron":
AdvertiseRefsHook: org.eclipse.jgit.transport.AdvertiseRefsHookChain@77348c71class org.eclipse.jgit.transport.AdvertiseRefsHookChain
at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:156)
... 13 more
Caused by: org.eclipse.jgit.errors.UnpackException: Exception while parsing pack stream
at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:202)
at org.eclipse.jgit.transport.ReceivePack.receive(ReceivePack.java:142)
at com.google.gerrit.sshd.commands.Receive.runImpl(Receive.java:98)
... 13 more
Caused by: org.eclipse.jgit.errors.MissingObjectException: Missing unknown
at org.eclipse.jgit.storage.file.WindowCursor.open(WindowCursor.java:125)
at org.eclipse.jgit.lib.ObjectReader.open(ObjectReader.java:228)
at org.eclipse.jgit.revwalk.RevWalk.parseAny(RevWalk.java:812)
at org.eclipse.jgit.transport.BaseReceivePack.checkConnectivity(BaseReceivePack.java:956)
at org.eclipse.jgit.transport.BaseReceivePack.(BaseReceivePack.java:756)
at org.eclipse.jgit.transport.ReceivePack.service(ReceivePack.java:167)
... 15 more
那么就定义到这串哈希值,为什么会丢失这个object ?
我顺手敲了一个 git review -l,发现gerrit上居然有一个还没有关闭的patch:
1974 master Add two interfaces for manipulate forwarding indivially
我打开Gerrit web界面,点击这个patchset,跳出一段错误说明: cannot found.
啊哈,到这里真相就大白了。原因就是上午我在删除原先的旧有neutron代码时,忘记把gerrit上相关的neutron提交做关闭处理,而输入git review命令时,gerrit会先做一个rebase操作,再做提交,然而neutron仓库发生变化后,存在数据库中的1974号patch_set找不到对应的object了,所以在执行:git push gerrit HEAD:refs/publish/datong 操作时发生了前面的问题。
事已至此,解决的办法就是到reviewdb数据库里,先从patch_sets表中找出change_id是1974的记录,确定无误后,我们从changes表中找出对应的记录:
mysql> select * from changes where change_id=1974\G;
*************************** 1. row ***************************
change_key:
created_on: 2014-01-06 12:20:07
last_updated_on: 2014-01-07 03:02:09
sort_key: 002a4736000007b6
owner_account_id: 25
dest_project_name: neutron
dest_branch_name: refs/heads/master
open: Y
status: n
nbr_patch_sets: 1
current_patch_set_id: 1
subject: Add two interfaces for manipulate forwarding indivially
topic: portforwarding-api
last_sha1_merge_tested: NULL
mergeable: N
row_version: 2
change_id: 1974
1 row in set (0.00 sec)
我们要做的是将其关闭,并把状态置为Abandon。(友情提醒,涉及重要业务,注意备份数据库)
mysql> update changes set open='N',status='A' where change_id=1974;
Query OK, 1 row affected (0.05 sec)
Rows matched: 1 Changed: 1 Warnings: 0
OK,现在neutron的提交已经恢复正常,我可以安心地去做其他事情了:)
⑤ 如何搭建基于ldap和mysql的gerrit服务
一.搭建数据库以及配置数据库
1.使用yum install mysql-server安装mysql
2.mysqladmin -u root password archermind(第一次设置密码).设置密码
3.修改 vi /etc/my.cnf
增加[client]项以及修改[mysqld]项.具体如下所示:
[client]
#password = your_password
port = 3306
socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs
# The MySQL server
default-character-set=utf8
[mysqld]
default-storage-engine = innodb-----这一行要加上
character-set-server=utf8-----这一行要加上
coll
⑥ 如何添加已有的本地repo仓库到本地的gerrit服务器
那些xml文件是分支配置的文件,使用的话直接init 后再sync就可以了 repo init git地址 -b 分支名 -m xml文件名 repo sync 如果要将本地代码回到某个历史版本直接checkout 或者 reset checkout 支持将文件切换到历史版本,数据库不会修改,还可以
⑦ 为什么commit会产生大量的merge记录
如标题描述,最近关于这个gerrit的submit type的设置引起了一个问题,我大概模拟了下开发的提交场景,如下:
开发A和开发B都在修改仓库repo_test的代码,开发A修改test1.txt 然后提交到gerrit上,并在gerrit上合入了这个提交(commitA),开发B没有执行git pull, 直接修改了test2.txt, 这个test2.txt和test1.txt没有任何关联性,是完全不相关的模块,然后开发B提交gerrit,然后gerrit上合入了这个提交(commitidB),此时,由于开发B的这个提交相对服务器少了开发A的改动提交,就自动生成了一条merge(叫commitB+吧),比如如下:
以上,B+是自动生成的merge,这个自动merge的记录在gerrit上是看不到的,真正的修改是在B,所以开发在gerrit上找到B,让我(职位:CM)在B节点标记tag,我在B标记tag后打包(我执行git checkout B),发现没有A的修改了,这就出问题了!!!但是git checkout B+就有A的提交!!
然后发现,是因为开发B没执行git pull ,没把A的改动带进去,所以提交的时候就自动产生了这个merge的提交记录,话说,使用rebase就不会产生,但是怎么搞呢?
然后发现了gerrit的submit type 可以控制:
默认的是“Merge if Necessary”, 这个就是在有差异的时候自动生成一条merge记录
所以换成“Rebase if Necessary”,这个会自动rebase,不会自动产生merge记录
如下是gerrit换成“rebase if Necessary”的提交记录:
STM32 对内部FLASH读写接口函数(转)
ymodem协议c实现(转)
STM32启动模式及API(转)
Keil STM32调试,使用ST-Link下载程序时提示“flash timeout.reset the target and try it again”
UVA 11020
LeetCode Maximal Square
Android中的消息机制
关于DPM(Deformable Part Model)算法中模型可视化的解释
Node.js能够做什么?
h 1071 The area
Linux经常使用命令(九)
[ACM] h 4248 A Famous Stone Collector (DP+组合)
linux程序设计——个人总结
poj3252-Round Number 组合数学
QML与C++交互:登陆界面设计
delphi2010发送邮件—中文显示为乱码解决
WCF探索之旅(五)——WCF与WebService的异同
数据库备份还原,日志清理代码
【Android】自己定义View、画家(画布)Canvas与画笔Paint的应用——绘图、涂鸦板app的实现
Berkeley DB基础教程
SSL和SSH的差别