1. repo和git的区别
	当你完成了repo init以后,你会在你的目录下发现一个.repo的隐藏目录,进到.repo/manifest/中,打开
default.xml,这就是之前所说的用来记录一个版本中需要哪些库的文件。其实manifest目录本身其实也是一
个git库,一个android版本对应一个分支,其中的default.xml就记录着这个版本所需要的库,repo工具再根
据这个文件去把各个库的对应分支最终组合起来。总结一下,git管理单独的模块,而repo管理所有的git库,
将多个git库组合在一起,形成一个完整的大版本。

2. repo在ubuntu上安装[repo安装软件]
	2.1 将附件的两个文件拷贝到 $HOME/bin目录下
	
	2.2 解压repo_mtk.git.tar.gz 文件 tar -xzvf repo_mtk.git.tar.gz
	
	2.3 修改repo_mtk文件里的 REPO_URL = '/bin/repo_mtk.git'
设置完毕,在终端输入repo --version可以查看版本号,使用repo init 路径来初始化代码了,然后使用repo sync来更新代码。

3. repo仓库搭建
    3.1 准备:拉取外部服务器代码,由mtk提供代码地址。本次要搭建的O版本61/62地址为:     
	repo init -u http://user-git@git01.mediatek.com/alps_release/platform/manifest -b bird -m alps-release-o1.mp7-default.xml --no-repo-verify;
	repo sync -c -f -j8 --no-repo-verify --optimized-fetch
	
    3.2 
    同时要在主文件夹中新建文件.netrc,输入mtk提供的账号和密码。文件见.netrc
    3.3 服务器上创建目录
    mkdir BIRD_O1MP1_K39TV1_BSP_8.1
    
    3.4 从default.xml中提取目录,default.xml文件在.repo/manifests/文件夹下,根据版本选择指定的xml文件。
    
	cat default.xml  | grep path= | sed "s/ /\n/g" | grep path | sed "s/path=\"//g" | sed "s/\"//g"| sed "s/\/>//g" | sed  "s/>//g" > project.list
    将project.list拷贝到BIRD_O1MP1_K39TV1_BSP_8.1目录下
    
    3.5 根据project.xml文件生成指定目录
    for proj in `cat ./project.list`; do mkdir -p $proj; done
    
    3.6 对应的目录生成空的git仓库
    for proj in `cat ./project.list`;do pushd $proj; git init --bare --shared ; popd ;done
    
    3.4 | 3.5 | 3.6 脚本的作用就是要根据.repo/manifests文件夹下的default.xml文件生成project.list,再通过project.list生成对应的git仓库目录,将git仓库拷贝到远程服务器工程的文件夹下。
    我的用法是直接用default.xml文件生成git仓库目录,通过脚本实现,再将目录拷至服务器。getnames_and_create_project.py,文件见附录
    添加客制化目录bird目录,mediatek是远程仓库名,refs/heads/alps-release-p0.mp1是远程分支。
    <default remote="mediatek" revision="refs/heads/alps-release-p0.mp1" sync-j="4"/>
    <project name="bird" path="../bird" >
        <linkfile dest="mk" src="script/core/makeBird"/>
        <linkfile dest="../bird/git" src="script/tool/git_wrap.sh"/>
        <linkfile dest="repo" src="script/tool/repo_wrap.sh"/>
        <linkfile dest="../clear.sh" src="script/tool/clear.sh"/>
    </project>
    <project name="modem" path="../modem" >
    </project>
    
    3.7 创建bird仓库,该步骤可以现在添加也可以等上传完成后再添加。
    mkdir bird
    cd bird
    git init --bare
    ps1:在创建bird目录后要通过git clone 命令将bird目录拷贝到本地,同时替换远程库地址和名称,如将origin改成mediatek,另分支也要改成上传对应的分支,要不拉代码会出现报错。
    ps2:在bird目录中要添加链接mk文件,这时要一起添加,因为要在manifest.git文件中配置路径。

    3.8 在BIRD_O1MP1_K39TV1_BSP_8.1下创建一个manifest仓库
    mkdir manifest.git
    git init --bare manifest.git

    3.9 clone manifest.git仓库到本地
    git clone git@192.168.50.56:../../var/repo/BIRD_O1MP1_K39TV1_BSP_8.1/manifest.git
    git是用户名,192.168.50.56是远程服务器IP地址。

    3.10 将default.xml拷贝到manifest目录
    git add default.xml
    git commit -m "init repo base"
    git push origin master
    本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。

    3.11 替换远程库中各个git仓库的url
    find ./projects -name "config" | xargs sed -i "s/username@192.168.50.56:..\/..\/var\/BIRD_VEHICLE_P0MP13_E02/http:\/\/git-user@git01.mediatek.com\/alps_release/g"

    3.12 使用如下命令推送到服务器,这样在服务器上创建了alps-release-o1.mp7分支
    repo forall -c 'git push mediatek HEAD:refs/heads/alps-release-o1.mp7'

    3.13 代码上传后使用下如下命令恢复远程库的url
    find ./projects -name "config" | xargs sed -i "s/http:\/\/git-user@git01.mediatek.com\/alps_release/user@192.168.50.56:..\/..\/var\/vehicle/g"

    3.14 拉取repo仓库
    repo init -u username@192.168.50.56:../../var/project/vehicle/manifest.git -b branch_name -m manifest.xml
    其中-b和-m是指定manifest.git仓库的分支和相应的default.xml。我们这里暂时不需要使用这两个参数
    repo sync

    3.15 代码上传和下拉命令
    repo start branch_name --all
    创建本地分支,否则后续单独库更新的时候无法pull

    3.16 bird仓库修改都要使用如下命令
    git push mediatek HEAD:refs/heads/alps-release-o1.mp7
    git pull mediatek refs/heads/alps-release-o1.mp7:master

4. repo操作指令
4.1 清理工程命令
    repo forall -c 'git checkout -f'
    repo forall -c 'git clean -df'

4.2 后续修改代码使用如下命令提交
    repo forall -c 'git add -A'
    repo forall -c 'git commit -m "仓库推送后的修改"'
    repo forall -c 'git push mediatek HEAD:refs/heads/alps-release-o1.mp7'
    repo upload

二 代码同步步骤:
1. 创建本地分支
repo init -u git@192.168.50.55:../../var/repo/BIRD_O1MP1_K39TV1_BSP/manifest.git
repo sync -c
repo start branch_name --all
使用repo branch可以查看目前处于branch_name分支。

2. 修改各git仓库的config url使之指向远程仓库对应地址。这一步可以使用脚本执行替换动作

3. repo forall -c 'git fetch mediatek refs/tags/t-alps-release-o1.mp7-V1.167'
refs/tags/t-alps-release-o1.mp7-V1.167 是远程仓库的分支

4. repo forall -c 'git merge origin/master'

5. 修改各git仓库的config url,使之指向本地仓库对应的地址。这一步可以使用脚本执行替换动作

6. repo forall -c 'git push origin HEAD:master' //将当前分支直接push到远程仓库的主线上,这一步如果主线有上传代码会有冲突。
因为我们alps目录是不会修改,所以一般情况下是不会有冲突的。我们自己修改的只是bird目录

7. 每次同步后要将此次同步的标签一起上传
repo forall -c 'git tag t-alps-release-01.mp1-V1.42'  //创建t-alps-release-01.mp1-V1.41标签
repo forall -c 'git push origin t-alps-release-01.mp1-V1.42'  //将标签t-alps-release-01.mp1-V1.41上传到远端服务器
将本地代码切换到某一个tag
repo forall -c 'git checkout t-alps-release-01.mp1-V1.42'

下面介绍下tag的用法
1) 添加标签: git tag -a version -m "note"
注解:git tag 是打标签的命令,-a 是添加标签,其后要跟新标签号,-m 及后面的字符串是对该标签的注释。
2) 提交标签到远程仓库 :git push origin -tags
注解:就像git push origin master 把本地修改提交到远程仓库一样,-tags可以把本地的打的标签全部提交到远程仓库。
3) 删除标签:git tag -d version
git tag -d test_tag        //本地删除tag
注解:-d 表示删除,后面跟要删除的tag名字
4) 删除远程标签:git push origin :refs/tags/version 可以不用删除本地tag,直接删除远端tag
git push origin :refs/tags/test_tag    //删除远端tag
注解:就像git push origin :branch_1 可以删除远程仓库的分支branch_1一样, 冒号前为空表示删除远程仓库的tag。
5) 查看标签:git tag或者git tag -l