repo+manifests+git方式管理安卓代碼

repo+manifests+git方式管理安卓代碼

1.repo的獲取

repogooglePython腳本寫的調用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-repoURL要填寫正確。

git-repo的分支,一定要和repo裏填寫的repo_rev是一致的。

 

http共享repogit-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.dwelcom.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_XXXpush_XXXreview_XXX

添加對應成員

wKiom1boslfweFExAAA-8FmuNw0256.png 

 

 

開始加項目組對應分支的權限,

方式一:

projects->All-projects中添加,

這是直接往主線合入,讀取,審覈等權限

wKioL1bosvvAkUkVAAAWTxPlgB4054.png 

 

方式二:

通過繼承的方式,

Asus項目下git庫比較多,如果一個個單獨設置權限比較麻煩,這裏可以先創建一個新的工程作爲一個father project

wKioL1bosxrQDzMfAAA1lw-QXjA203.png 

 

Father樣例工程如下,refs/for/*即是分支的權限,refs/heads/*是主線的權限

wKiom1bosqCjs5RkAAAxp0qOgFY158.png 

 

Asus下的其他項目如果要設置權限,直接採用繼承的形式即可

wKioL1bosz-SlotZAAAacfSBrpI968.png 

5.如何從gerrit服務器上拉取代碼

登錄其他服務器後,首先我們要將ssh的密鑰傳到網站上去。

ssh-keygen -t rsa

cat ~/.ssh/id_rsa.pub,

拷貝密鑰,到網站下

 wKioL1boul7ggChYAADJfP48FGE975.png

 

拷貝完以後增加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

wKiom1boueTxlgxRAABBFxRelCY112.png 

如果想要直接合入主線則是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]>'

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章