S:服务器端(Server)
C:客户端(Client)
sudo apt-get install git-core openssh-server openssh-client
初次使用git,记得配置用户信息
$ git config --global user.name “John Doe”
$ git config --global user.email [email protected]
2.1、下载gitosis(S)
mkdir ~/gitosis_setup
cd ~/gitosis_setup
git clone https://github.com/res0nat0r/gitosis.git
2.2、安装gitosis(S)
cd gitosis
sudo python setup.py install
注意:如果python setup.py install失败,需要安装python-setuptools.py
sudo apt-get install python-setuptools
2.3、为gitosis创建系统用户(S)
sudo adduser --system --shell /bin/sh --gecos ‘git SCM user’ --group --disabled-password --home /home/git git
这种方法是网上比较常见的方法,创建的是一个禁用密码的git用户,但在使用su命令切换git用户的时候,空密码老是
验证失败,建议大家可以使用下面的方法来创建git用户:
sudo useradd -m git
sudo passwd git
之前设置无密码时,clone时总要我输密码。
2.4、创建配置gitosis管理员©
(1)将管理员生成的公钥(即B)上传或拷贝到服务器(即A)上。这里的公钥需要在git服务器管理员(B)下使用ssh-keygen -t rsa命令来创建
2.4.1、生成admin端的公钥©
ssh-keygen -t rsa
根据提示输入一些信息之后,会在/home/admin/.ssh/下生成id_rsa.pub,如下图:
然后将id_rsa.pub拷贝到服务器(S)的tmp目录下:
scp ~/.ssh/id_rsa.pub [email protected]:/tmp/id_rsa_admin.pub
2.4.2、执行gitosis-init(S)
进入到拷贝过来的id_rsa.pub所在目录:cd /tmp
sudo chmod 777 id_rsa.pub
sudo -H -u git gitosis-init < id_rsa.pub
sudo chmod 755 /home/git/repositories/gitosis-admin.git/hooks/post-update
至此,gitosis的安装工作已完成,其相关配置可以由管理员(B)来操作,然后再提交到服务器上。
2.4.3、然后在客户端©从服务器(S)克隆gitosis-admin.git
此操作在客户端完成
mkdir -p ~/git/
cd ~/git/
git clone [email protected]:gitosis-admin.git
cd gitosis-admin.git
其中,gitosis.conf是gitosis的配置文件,用于配置用户和用户所拥有的权限,keydir是所有组成员的公钥。如果要添加用户,则根据2.4.1章节生成其公钥拷贝到keydir目录下,查看gitosis.conf配置文件如下:(这里要注意下,如果conf文件有任何改动记得同步到远程仓库,否则后面会出现权限不够,导致克隆失败git add gitosis.conf git commit -m “modify gitosis.conf” gitosis.conf git push origin master)
gitosis-admin指示管理员用户组,有用户hanmeng@likai-System,其可以读写gitosis-admin和manifest仓库。manifest后面介绍。
至此,gitosis配置完成,后面介绍如何添加组成员。
3.编辑gitosis.conf(配置gitosis信息)
cd gitosis-admin
你将看到以下文件gitosis.conf和keydir/,gitosis.conf是gitosis的配置文件,用于配置用户和权限,keydir/是所有组成员的公钥。
vi gitosis.conf, 打开gitosis.conf文件,内容为:
[group gitosis-admin]
writable = gitosis-admin
members = asus-wh@asus ##这里的asus-wh@asusr就相当于B的名片,与B的id_rsa.pub中的内容一致,红框中内容
这个是[group gitosis-admin]管理组的权限,members中的用户名就是刚才上传的公钥里面的用户名。
把内容修改为:
[group gitosis-admin]
writable = gitosis-admin
members = asus-wh@asus
[group apps ]
writable = apps
members = asus-wh@asus c-user
这里的c-user其实就是电脑C的名片,同样也需要C的公钥。
这里定义了一个叫apps 的组,这个apps与后来建立的仓库名对应,授予asus-wh@asus和 c-user两个用户写“apps ”这个repo的权限
然后push到服务端后,服务器端就立刻生效。
git commit -a -m “created a new repository”
git push
这样就 更新了服务端的权限。
4.在test目录下创建一个apps的repo
mkdir apps
cd apps
git init
5.加点东西测试
echo “hello” >1.txt (在apps目录下下创建一个内容为hello的1.txt文件)
6. 提交代码
git remote add origin [email protected]:apps.git
git add .
git commit -am “imitial import”
git push origin master:refs/heads/master
7.增加成员的公钥到系统中
这里就是把C(192.168.1.3)的公钥加进来拷贝到gitosis-admin/keydir目录下
会发现这里面已经有一个公钥了,就是B的公钥,C生成的公钥是id_rsa.pub,避免重复,建议将其重名为
c-user.pub,这个‘c-user’与之前的它的公钥最后那部分内容相同,跟之前的B的“asus-wh@asus”类似。
cd gitosis-admin
git add keydir/c-user.pub
修改gitosis.conf,并提交
[group apps ]
writable = apps
members = asus-wh@asus c-user ##这个c-user与前面c的公钥命名要相同
git commit -a -m “Granted new members commit rights to apps”
git push
8.其它成员获取apps的代码
git clone [email protected]:apps.git
1、 配置repo
1.1、下载git-repo.git©(这里需要能)
mkdir -p ~/gitCfg
cd ~/gitCfg
git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
1.2、配置repo©
1.2.1、将git-repo.git目录下的repo拷贝到/usr/bin下面:
cd git-repo
sudo cp repo /usr/bin/repo
1.2.2、修改repo
vim /usr/bin/repo
修改
REPO_URL = ‘https://gerrit.googlesource.com/git-repo’
REPO_REV = ‘stable’
为
REPO_URL = ‘/root/gitCfg/git-repo.git’
REPO_REV = ‘master’
2、 创建版本根目录(S)
进入repositories初始化manifest仓库,这里最好是用git用户来,或者记得更改manifest.git的所属主组。
cd repositories
git init --bare manifest.git
sudo apt-get install git-daemon-sysvinit
3、 配置default.xml文件©
default.xml是repo用来管理多个git仓库的。
3.1、克隆manifest.git
这里可能会因为权限问题导致克隆失败,需要在gitosis.conf中writable值加上manifest
并,同步到远程服务器端
mkdir ~/repo
cd ~/repo
git clone [email protected]:manifest.git
###clone这一步能成当然是很好,不成的话试试这个git clone git://192.168.1.1/manifest.git
3.2、配置default.xml
这里配置如下:(创建三个测试仓库:project1、project2、project3)
将default.xml保存push到远程仓库:
git add –all
git commit -a -m “add default.xml”
git push --all
如果上面推送报错,请检查远程仓库manifest的所属主组
4.建立测试仓库(S)
cd /home/git/repositories/
git init --bare project1.git
git init --bare project2.git
git init --bare project3.git
修改仓库的文件属性:
sudo chmod 777 -R /home/git/repositories/project1.git project2.git project3.git
上传代码到仓库©
cd /home/git/repositories/ (这个路径是灵活的,我使用的~/repo路径)
git clone [email protected]:project1.git
git clone [email protected]:project2.git
git clone [email protected]:project3.git
git clone git://192.168.27.139/project1.git
当有代码更改是一定要记得先同步到远程仓库,要不然下面repo sync时会报错
注意:这里如果克隆失败请在gitosis.conf写入下图,并同步到远程目录,否则不生效
然后在对应仓库添加代码,并推送到远程服务器
测试repo服务器
mkdir ~/repotest
cd ~/repotest
repo init -u [email protected]:manifest.git
主要:或试试repo init -u git://192.168.1.117/manifest.git
repo sync
此处如果同步不下来 1.检查gitosis.conf 中是否配置 2.检查default.xml 3.是否在git目录下init 创建 4.将project1.git文件clone 下来提交操作一次
这样就会根据default.xml配置的project拉下来三个代码仓库。
最后去客户机C(192.168.1.3)测试下
C:
安装 Repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
修改repo文件内容中的 export REPO_URL=‘https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/’
这一切都是为了让你能够舒适的使用repo
开始刺激的测试:
创建一个测试目录
mkdir test
cd test
repo init -u git://192.168.1.117/manifest.git
repo sync
只需要这两行就会把我们的之前的项目apps同步到test目录下。
Gerrit搭建
https://blog.csdn.net/twilightdream/article/details/72953282
1、 安装apache2服务器
sudo apt-get install --reinstall apache2
2、 建立gerrit账户(S)
sudo adduser gerrit
sudo passwd gerrit
su gerrit
2.配置java环境
oracle官网下载对应平台的jdk并安装,这里我下载:jdk-7u45-linux-i586.tar.gz
使用下面命令安装:
sudo tar zxvf ./jdk-7u45-linux-i586.tar.gz -C /opt
vim ~/.bashrc sudo vim /etc/profile
添加如下内容:
JAVA_HOME=/opt/jdk1.8.0_191
export JRE_HOME= J A V A H O M E / j r e e x p o r t C L A S S P A T H = JAVA_HOME/jre export CLASSPATH= JAVAHOME/jreexportCLASSPATH=JAVA_HOME/lib: J R E H O M E / l i b : JRE_HOME/lib: JREHOME/lib:CLASSPATH
export PATH= J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:JRE_HOME/bin:$PATH
wq保存后,记得source一下
3下载gerrit(S)
这里我直接在百度搜的某个固定版本,gerrit的war包,通常包名为gerrit-xxx.war
,xxx为版本号,这里我下载gerrit-2.11.war
4 安装gerrit
java -jar gerrit-2.15.3.war init -d review_site
以下不使用代理 可以配置
Behind reverse proxy [y/N]? n
auth type = DEVELOPMENT_BECOME_ANY_ACCOUNT
其他默认
Installing plugins.
Install plugin commit-message-length-validator version v2.15.3 [y/N]? y
Installed commit-message-length-validator v2.15.3
Install plugin download-commands version v2.15.3 [y/N]? y
Installed download-commands v2.15.3
Install plugin hooks version v2.15.3 [y/N]? y
Installed hooks v2.15.3
Install plugin replication version v2.15.3 [y/N]? y
Installed replication v2.15.3
Install plugin reviewnotes version v2.15.3 [y/N]? y
Installed reviewnotes v2.15.3
Install plugin singleusergroup version v2.15.3 [y/N]? y
Installed singleusergroup v2.15.3
Initializing plugins.
使用代理配置如下:
gerrit数据库选择默认H2
身份验证时输入http
Authentication method [openid/?]: http
这里配置反向代理,选择y
Behind reverse proxy [y/N]? y
Installing plugins.
Install plugin commit-message-length-validator version v2.15.3 [y/N]? y
Installed commit-message-length-validator v2.15.3
Install plugin download-commands version v2.15.3 [y/N]? y
Installed download-commands v2.15.3
Install plugin hooks version v2.15.3 [y/N]? y
Installed hooks v2.15.3
Install plugin replication version v2.15.3 [y/N]? y
Installed replication v2.15.3
Install plugin reviewnotes version v2.15.3 [y/N]? y
Installed reviewnotes v2.15.3
Install plugin singleusergroup version v2.15.3 [y/N]? y
Installed singleusergroup v2.15.3
Initializing plugins.
修改gerrit配置文件
vim review_site/etc/gerrit.config
修改如下
vim review_site/etc/gerrit.config
[gerrit]
basePath = git
canonicalWebUrl = http://192.168.1.252:8888/
[database]
type = h2
database = db/ReviewDB
[index]
type = LUCENE
[auth]
type = HTTP
[sendemail]
smtpServer = smtp.exmail.qq.com
smtpServerPort = 465
smtpEncryption = SSL
smtpUser = [email protected]
smtpPass = Sunny1214
from = [email protected]
[container]
user = gerrit
javaHome = /opt/jdk1.7.0_45/jre
[sshd]
listenAddress = :29418
[httpd]
listenUrl = proxy-http://:8888/
[cache]
directory = cache
修改配置
sudo vim /etc/apache2/ports.conf
新增9999端口
. . . . . .admins
Listen 80
Listen 9999
. . . . . .
配置反向代理
sudo vim /etc/apache2/httpd.conf
ServerName gerrit.com
ProxyRequests Off
ProxyVia Off
ProxyPreserveHost On
AllowEncodedSlashes On
RewriteEngine On
RewriteRule ^/(.) http://192.168.137.6:8888/$1 [NE,P]
Order deny,allow
Allow from all
AuthType Basic
AuthName "Gerrit Code Review"
Require valid-user
AuthBasicProvider file
AuthUserFile /home/gerrit/review_site/etc/passwd
ProxyPass / http://192.168.137.6:8888/
主配置文件中加入httpd.conf,使其生效 sudo vim /etc/apache2/apache2.conf 加一句
Include httpd.conf
新建gerrit管理员用户,设置帐号密码
touch ./review_site/etc/passwd
htpasswd -b ./review_site/etc/passwd admin 123
(后续再添加gerrit用户可使用: $: htpasswd -b ./review_site/etc/passwd UserName PassWord )
开启一些模块
sudo a2enmod proxy
sudo a2enmod rewrite
sudo a2enmod ssl
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
启动服务
./review_site/bin/gerrit.sh restart
sudo /etc/init.d/apache2 restart
客户端可通过http://192.168.27.139:9999访问啦
gerrit网页端配置:
1:登录,浏览器输入192.168.1.252:8080回车验证身份
2:账户信息配置,点击右上角Settings
Contact Information配置全名和邮箱,全名会在界面右上角显示,邮箱用户后续操作中的提示。
添加个人公钥:客户端执行:ssh-keygen -t rsa
复制公钥内容 add进去
添加完公钥之后,可以通过:ssh -p 29418 [email protected](如果测试不通,请检查gerrit界面“SSH Public Keys”是否配置了公钥)来测试ssh是否可以连接,如果连接成功,那么就可以做接下来的操作了。成功提示如下:
失败情况如下,需要把客户端的公钥添加到gerrit界面“SSH Public Keys”
创建项目:
ssh -p 29418 user@localhost gerrit create-project --empty-commit --name demo-project
例如创建清单库和测试库:
ssh -p 29418 [email protected] gerrit create-project --empty-commit --name manifest
ssh -p 29418 [email protected] gerrit create-project --empty-commit --name test
这个时候可以在远程服务器的gerrit服务器的git目录下看到manifest.git和test.git两个仓库,在gerrit网页端的projects->List下也可以看到这两个仓库。
repo默认是通过清单库的default.xml来管理其他项目的,这里单独clone下manifest仓库,添加default.xml文件
上面的fetch因该是fetch=“ssh://[email protected]:29418/”
然后推送default.xml到远程manifest仓库
git add default.xml
git commit -m “add default.xml” default.xml
git push origin HEAD:refs/for/master //这句话是推送到gerrit,可以通过管理员审核,然后合并,也就是必须等管理员审核后才能进行下面的。
网页中创建工程
clone工程后 push
git clone ssh://[email protected]:29418/MyDemo
vim default.xml
git add .
git status
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
git commit -m ‘add’
git push origin HEAD:refs/for/master
上面的fetch因该是fetch=“ssh://[email protected]:29418/”
然后本地创建目录,通过以下操作,同时管理多个git仓库
repo init -u ssh://[email protected]:29418/manifest.git
//这里会在当前目录下生成.repo目录,里面会包含完整的repo和清单库
repo sync //这里会根据清单库的xml文件来同步下载xml里面的project标签定义的所以项目
这里如果有报错,请检查gitosis.conf中是否添加了客户端操作test项目的权限
上传Android代码到gerrit服务器
https://blog.csdn.net/qq_28449863/article/details/80084660
https://www.cnblogs.com/eastnapoleon/p/6595952.html
name 处的android88是为了在gerrit仓库中区分 ,name对应的就是远程仓库的地址
path代表本地同步时的本地路径
上传到远程仓库,
git add .
gitdir=$(git rev-parse --git-dir); scp -p -P 29418 [email protected]:hooks/commit-msg ${gitdir}/hooks/
git commit -m "add default.xml"
git push origin HEAD:refs/for/master
2.创建git仓库
进入Android代码目录,新建脚本文件,
vim gerrit_create.sh
shidx@Shidx:~/AOSP_Test$ cat gerrit_create.sh
LOCAL_PATH=pwd
MANIFEST_XML_FILE=$LOCAL_PATH/…/HHH/manifest/default.xml #该处是default.xml 的路径
USER_NAME=“admin”
SERVER_IP=“192.168.115.135”
SERVER_PORT=“29418”
OUTPUT_PROJECT_LIST_FILE_NAME= L O C A L P A T H / p r o j e c t l i s t n a m e O U T P U T P R O J E C T L I S T F I L E P A T H = LOCAL_PATH/project_list_name OUTPUT_PROJECT_LIST_FILE_PATH= LOCALPATH/projectlistnameOUTPUTPROJECTLISTFILEPATH=LOCAL_PATH/project_list_path
function getNameAndPath()
{
echo > $OUTPUT_PROJECT_LIST_FILE_NAME
echo > $OUTPUT_PROJECT_LIST_FILE_PATH
while read LINE
do
command_line=`echo $LINE | grep " git_projects.txt`c%%\"*}
echo "$reposity_name" >> $OUTPUT_PROJECT_LIST_FILE_NAME
echo "$reposity_path" >> $OUTPUT_PROJECT_LIST_FILE_PATH
fi
fi
done < $MANIFEST_XML_FILE
}
function creatEmptyGerritProject()
{
for i in cat $OUTPUT_PROJECT_LIST_FILE_NAME
;
do
echo $i
echo “ssh -p $SERVER_PORT U S E R N A M E @ USER_NAME@ USERNAME@SERVER_IP gerrit create-project --empty-commit $i”
ssh -p $SERVER_PORT U S E R N A M E @ USER_NAME@ USERNAME@SERVER_IP gerrit create-project --empty-commit $i
done
}
function removeFiles()
{
rm -rf $LOCAL_PATH/project_list_name
rm -rf $LOCAL_PATH/project_list_path
}
getNameAndPath
creatEmptyGerritProject
removeFiles
运行脚本,创建git仓库: . gerrit_create.sh
vim gerrit_push.sh
shidx@Shidx:~/AOSP_Test$ cat gerrit_push.sh
LOCAL_PATH=pwd
MANIFEST_XML_FILE=$LOCAL_PATH/…/HHH/manifest/default.xml
USER_NAME=“admin”
SERVER_IP=“192.168.115.135”
SERVER_PORT=“29418”
function pushLocalToRemote()
{
while read LINE
do
cd $LOCAL_PATH
command_line=`echo $LINE | grep "
}
pushLocalToRemote
运行脚本,push代码: . gerrit_push.sh
创建 default.xml 文件
1.从源码 aosp/ 找出所有 git 仓库
从厂商得到的 Android 源码 aosp/ 目录大致如下,
aosp
|- art
|- /abi
|- cpp
|- /developers
|- build
|- demos
|- samples
|- /android
…
因为厂商不用 Repo 管理,所以源码里也没有 manifest/default.xml 文件。
幸好,仔细查看 aosp/ 之后发现,里面有些目录下有 .git/ 目录,说明它就是一个 git 项目。因此可以通过找出所有带 .git/ 目录的目录,来确定 aosp/ 有哪些 git 项目。代码如下:
find aosp/ -type d -name ‘.git’ > git_projects.txt
最终在这份 aosp/ 共找到 531 个 git 项目。
得到 git_projects.txt 后,就可以据此创建 default.xml 文件。git_projects.txt 每一行的内容是这样的:
使用 bash 指令去掉最后开头的 S905X_0907_4G/和末尾的 /.git :
cat git_projects.txt | cut -c 15- | sed ‘s/…$//’ > path.txt
得到的内容如下:
生成 xml 文件的脚本 gen_xml.sh :
#!/bin/bash
echo -e "
while read line; do
echo “
done
echo -e “\n” >>$1
bash 指令创建 default.xml:
cat path.txt | ./gen_xml.sh default.xml
得到的 default.xml 里, 示例如下:
tongxing3288/android-5.1/source/
%s#m-amlogic/platform#source#g