repo+manifests+git方式管理安卓代碼
1.repo的獲取
repo只是google用Python腳本寫的調用git的一個腳本,主要是用來下載、管理Android項目的軟件倉庫。(也就是說,他是用來管理git所管理的一個個倉庫),可以簡化android開發中git的使用。
先從谷歌那裏獲取源,下面腳本是一個樣例腳本,將獲取的repo和谷歌mirror源下的
源代碼
#!/bin/bash BIN=/root/bin REPO=$BIN/repo ANDROID_HOME=/home/androidmirror if [ ! -d $BIN ]; then mkdir -p $BIN if [ -f $REPO ]; then curl https://storage.googleapis.com/git-repo-downloads/repo > $REPO chmod 775 $REPO fi fi if [ ! -d $ANDROID_HOME ]; then mkdir -p $ANDROID_HOME;cd $ANDROID_HOME $REPO init -u https://android.googlesource.com/mirror/manifest --mirror $REPO sync else cd $ANDROID_HOME;$REPO sync fi if [ -d $ANDROID_HOME ]; then cp $ANDROID_HOME/.repo/repo/repo $ANDROID_HOME sed -i -e "s/https:\/\/gerrit.googlesource.com/git:\/\/mirror.core.archermind.com\/android\/aosp/" $ANDROID_HOME/repo Fi cd $ANDROID_HOME rm -rf git-repo git clone https://gerrit.googlesource.com/git-repo.git cd git-repo git checkout -b stable
調用的時候注意獲取repo的路徑,並加執行權限,repo裏面的git-repo的URL要填寫正確。
git-repo的分支,一定要和repo裏填寫的repo_rev是一致的。
http共享repo和git-repo
在/etc/httpd/httpd.conf最下面增加
<VirtualHost *:80> ServerAdmin [email protected] DocumentRoot /work/mirror # ServerName dummy-host.example.com ErrorLog logs/dummy-host.example.com-error_log CustomLog logs/dummy-host.example.com-access_log common </VirtualHost>
修改/etc/httpd/conf.d下welcom.conf
註釋掉所有內容,重啓httpd服務即可
2.如何創建manifests.git文件
在佈置好repo以後,就要建立manifests.git,這個倉庫是用來管理其他git倉庫的,裏面填寫有Android代碼的路徑,方便我們批量下載git庫。
以android源碼Asus爲例,首先我們需要客戶提供project.list,根據project.list創建對應的manifests.xml。
檢查project.list是否含有空的路徑,腳本如下
#/bin/sh source_path=$1 branch_name=LA.BF.1.1.2_rb1.21 function create_git() { git_path=$1 if [ ! -d "$source_path/$git_path" ]; then mkdir -p $source_path/$git_path echo "README" > $source_path/$git_path/README echo "---------: $source_path/$git_path : no this file" >> $source_path/gitstatus.log fi number=`ls $source_path/$git_path | wc -l` if [ $number == 0 ]; then echo "---------: $source_path/$git_path : no child file" >> $source_path/gitstatus.log echo "README" > $source_path/$git_path/README fi cd $source_path/$git_path git init . git add * -f git commit -m "Add the all files" git status | awk -F "\t" '{print $2}' | xargs git add -f git commit -m "Add the ignore files" git checkout -b $branch_name echo $git_path >> $source_path/gitstatus.log git status >> $source_path/gitstatus.log } echo "-------Begin------------------------------ " rm -rf $source_path/gitstatus.log GIT_PROJECTS=`cat $source_path/project.list | xargs` for git_project in ${GIT_PROJECTS} do echo ${git_project} create_git ${git_project} done echo "-------End------------------------------ " ~
#/bin/sh source_path=/work/gerrit/review_site/git/asus function create_git() { git_path=$1 number=`ls $source_path/$git_path | wc -l` if [ $number -eq "0" ] then echo $git_path >> new.list fi } echo "------------------------------------- " # echo ">>>>>>>>>>>>>>>>>> make the mirror dir ----" # mkdir -p ${mirror_source} # echo ">>>>>>>>>>>>>>>>>> cp the project.list to mirror dir ----" # cp ${src_source}/.repo/project.list ${mirror_source}/ GIT_PROJECTS=`cat project.list | xargs` for git_project in ${GIT_PROJECTS} do echo ${git_project} create_git ${git_project} done echo "-------------------------------------
"
manifests.xml的製作腳本樣例如下:
REMOTE_FETCH="ssh://192.168.100.198:29418/" REMOTE_REVIEW="http://192.168.100.198" PROJECT_NAME="asus/project" BRANCH="LA.BF.1.1.2_rb1.21" echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" > manifest.xml echo "<manifest>" >> manifest.xml echo " <remote fetch=\"${REMOTE_FETCH}\" name=\"origin\" review=\"${REMOTE_REVIEW}\"/>" >> manifest.xml echo " <default remote=\"origin\" revision=\"${BRANCH}\"/>" >> manifest.xml echo "" >> manifest.xml GIT_PROJECTS=`cat project.list | xargs` function create_project () { git_path=$1 if [ ${git_path} == "build" ] then echo " <project name=\"${PROJECT_NAME}/${git_path}\" path=\"${git_path}\" >" >> manifest.xml echo " <copyfile dest=\"Makefile\" src=\"core/root.mk\"/>" >> manifest.xml echo " </project>" >> manifest.xml elif [ ${git_path} == "vendor/intel/support" ] then echo " <project name=\"${PROJECT_NAME}/${git_path}\" path=\"${git_path}\" >" >> manifest.xml echo " <copyfile dest=\"device/intel/Android.mk\" src=\"x86_only_Android.mk\"/>" >> manifest.xml echo " <copyfile dest=\"platform/vendor/intel/Android.mk\" src=\"x86_only_Android.mk\"/>" >> manifest.xml echo " </project>" >> manifest.xml else echo " <project name=\"${PROJECT_NAME}/${git_path}\" path=\"${git_path}\" />" >> manifest.xml fi } for git_project in ${GIT_PROJECTS} do create_project ${git_project} done echo "" >> manifest.xml echo "</manifest>" >> manifest.xml # cat manifest.xml | awk -F path=\" '{print $2}' | awk -F \"\ remote= '{print $1}' | awk -F \"\ revision= '{print $1}' > project.list
創建好manifests.xml文件後
mkdir manifests mv manifests.xml manifests cd manifests mv manifests default.xml git init git add default.xml git commit -m “test” default.xml cd .. git clone manifests/.git --mirror
就可以看到manifests.git文件了
3.如何批量創建鏡像
樣例腳本如下:
#/bin/sh src_source=$1 mirror_source=$2 dev_branch="LA.BF.1.1.2_rb1.21" function create_git() { git_path=$1 if [ -d "$src_source/$git_path" ] then cd $src_source/$git_path/ git init git add * git commit -m “test” * git checkout -b ${dev_branch} base_path=`basename $git_path` echo $base_path cd ../ git clone $base_path/.git --mirror mkdir -p $mirror_source/$git_path mv $base_path.git $mirror_source/$git_path/../ rm -r $mirror_source/$git_path fi } echo ">>>>>>>>>>>>>>>>>> prepare --------------------------------------- " # echo ">>>>>>>>>>>>>>>>>> make the mirror dir ----" # mkdir -p ${mirror_source} # echo ">>>>>>>>>>>>>>>>>> cp the project.list to mirror dir ----" # cp ${src_source}/.repo/project.list ${mirror_source}/ cd ${mirror_source} GIT_PROJECTS=`cat ${mirror_source}/project.list | xargs` echo ${GIT_PROJECTS} for git_project in ${GIT_PROJECTS} do echo ${git_project} create_git ${git_project} done echo ">>>>>>>>>>>>>>>>>> Over! Please check and restart the gerrit-server ------------"
4.gerrit網頁上的權限文件如何修改
先創建新的組,加入項目組對應的成員,read_XXX,push_XXX,review_XXX
添加對應成員
開始加項目組對應分支的權限,
方式一:
在projects->All-projects中添加,
這是直接往主線合入,讀取,審覈等權限
方式二:
通過繼承的方式,
Asus項目下git庫比較多,如果一個個單獨設置權限比較麻煩,這裏可以先創建一個新的工程作爲一個father project,
Father樣例工程如下,refs/for/*即是分支的權限,refs/heads/*是主線的權限
Asus下的其他項目如果要設置權限,直接採用繼承的形式即可
5.如何從gerrit服務器上拉取代碼
登錄其他服務器後,首先我們要將ssh的密鑰傳到網站上去。
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub,
拷貝密鑰,到網站下
拷貝完以後增加config文件,vi ~/.ssh/config
增加
Host 192.168.100.198
user n006253
下載git服務,我的git版本是git 1.7.9.6
rpm -ivh git-1.7.9.6-1.el6.rfx.x86_64.rpm perl-Git-1.7.9.6-1.el6.rfx.x86_64.rpm
rpm -ivh git-daemon-1.7.9.6-1.el6.rfx.x86_64.rpm
將以下內容,傳到/etc/xinetd.d/git
# default: off
# description: The git daemon allows git repositories to be exported using # the git:// protocol.
#server_args = --base-path=/var/lib/git --export-all --user-path=public_git --syslog --inetd --verbose
#type = UNLISTED
service git
{
disable = no
# git is in /etc/services only on RHEL5+
type = UNLISTED
port = 9418
socket_type = stream
wait = no
user = nobody
server = /usr/libexec/git-core/git-daemon
server_args = --base-path=/work/mirror --export-all --user-path=/work/mirror/android --syslog --inetd --verbose
log_on_failure += USERID
# xinetd does not enable IPv6 by default
# flags = IPv6
}
/etc/init.d/xinetd restart
下載repo
cd /work/tool
curl http://mirror.core.archermind.com/android/aosp/repo >repo
chmod +x repo
repo init -u ssh://[email protected]:29418/kraft2-m/8939/manifests -b trunk_LA2.15_8939
下下來以後 /work/tool/repo sync -j8
6.修改上傳代碼
以修改庫配置文件manifests.git爲例
vi default.xml
修改好以後
git add *
git commit -m “test” default.xml
git push origin HEAD:refs/for/trunk****
Push的時候如果出現missing change ID,按照報錯的提示傳輸第一下ID即可
上傳好以後到網頁上submit提交的內容,在ALL->OPEN下
如果想要直接合入主線則是git push origin HEAD:refs/heads/trunk****
如果出現user或者郵箱名字不對的情況,輸入
git config --global user.name "Your Name"
git config --global user.email [email protected]
git commit --amend --author 'fengxinfeng <[email protected]>'