如果不保留OEM厂家给的远程服务器代码路径,在新的git服务器代码路径发生变化的情况下,迁移代码的方式如下:
假定代码下载到zhaojr账号下的AndroidO_Repo目录中,如下:
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927$
repo init -u ssh://b_flyaudio001@release.autochips.com:29418/atc/android/o/manifest -b android-trunk-o1.ac8227L -g all,-notdefault
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927$ repo sync -c -f
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927$ repo forall -c "git checkout -b android-trunk-o1.ac8227L autochips/android-trunk-o1.ac8227L"
在开始创建之前,先说明一下.repo/manifests/default.xml文件的构成:
remote=”” 来指定使用哪一个remote地址。
revision 指定分支,从remote地址拖工程时指定拖哪个分支。
path:本地相对路径,可以不指定,不指定的话表示和name相同。
name:远程相对与remote地址的路径。
version:
groups:
upstream:
这里的每个name就代表一个git子工程,整个android工程有很多个git子工程组成,这里指定了各个子工程相对于remote的路径、版本、拖下来后的本地路径。如下:
/home/zhaojr/project/AndoridOGO_8827L_20180927
以下部分开始创建过程:
1、拷贝.repo/manifests/default.xml文件到git服务器的/home/git/新代码库路径目录中,如下:
git@S2600CP:~$ mkdir -p ./Project/8227L_project
git@S2600CP:~$ cd ./Project/8227L_project
git@S2600CP:~/Project/8227L_project$
scp zhaojr@172.168.1.220:/home/zhaojr/projectAndoridOGO_8827L_20180927/.repo/manifests/default.xml ./
之后修改default.xml,将文件中的name= atc/android/o/xxxxx修改成name= xxxxx 其他不变,如下:
修改前:
<project name="atc/android/o/ccu_tool" path="ccu_tool" />
<project groups="broadcom_pdk,device,fugu,pdk" name="atc/android/o/device/asus/fugu" path="device/asus/fugu" />
<project groups="broadcom_pdk,device,fugu,pdk" name="atc/android/o/device/asus/fugu-kernel" path="device/asus/fugu-kernel" />
<project name="atc/android/o/device/autochips/8227LGO_demo" path="device/autochips/8227LGO_demo" />
<project name="atc/android/o/device/autochips/8227L_demo" path="device/autochips/8227L_demo" />
<project name="atc/android/o/device/autochips/8227L_evb" path="device/autochips/8227L_evb" />
.................................
修改后:
<project name="ccu_tool" path="ccu_tool" />
<project groups="broadcom_pdk,device,fugu,pdk" name="device/asus/fugu" path="device/asus/fugu" />
<project groups="broadcom_pdk,device,fugu,pdk" name="device/asus/fugu-kernel" path="device/asus/fugu-kernel" />
<project name="device/autochips/8227LGO_demo" path="device/autochips/8227LGO_demo" />
<project name="device/autochips/8227L_demo" path="device/autochips/8227L_demo" />
<project name="device/autochips/8227L_evb" path="device/autochips/8227L_evb" />
.....................................................................
之后保存
2、将之前repo代码库迁移1中的getnames_and_create_project.py拷贝到git服务器的新代码库路径中,如下:
git@S2600CP:~/Project/8227L_project$ scp zhaojr@172.168.1.220:/home/zhaojr/project/AndoridOGO_8827L_20180927/getnames_and_create_project.py ./
内容如下:
#!/usr/bin/python3
import os
import sys
if len(sys.argv) == 1:
print('错误!请传入 xml 文件')
elif len(sys.argv) > 2:
print('错误!传入参数太多')
else:
print('传入的文件是 %s' % sys.argv[1])
with open(sys.argv[1], 'r') as fin:
while True:
linestr = fin.readline()
if linestr == '': #表示文件结束
break
print(linestr)
#下面开始对本行内容分析
if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行内容含有name信息
print(linestr)
#下面分析本行内容,并提取name
charistr1 = 'name="'
charistr2 = '"'
gitprojstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
print(gitprojstr)
path_m=gitprojstr
if path_m == 'autochips':
print(path_m)
else:
#下面开始创建git工程
#cmd = 'git init --bare %s.git' % gitprojstr
cmd = 'git init --bare %s' % gitprojstr
print(cmd)
os.system(cmd)
getnames_and_create_project.py文件下载链接:https://download.csdn.net/download/jinron10/10696067
运行脚本批量创建远程服务器新路径的git子库,如下:
git@S2600CP:~/Project/8227L_project$ ls ./
getnames_and_create_project.py
default.xml
git@S2600CP:~/Project/8227L_project$ ./getnames_and_create_project.py default.xml
3、远程代码新路径下创建manifest的git库,用来管理第2章节中批量创建的git子库,如下:
git@S2600CP:~/Project/8227L_project$ mkdir manifest
git@S2600CP:~/Project/8227L_project$ cd manifest
git@S2600CP:~/Project/8227L_project/manifest$ git init --bare
以下在客户端执行:
进入从OEM厂家拉下来的代码的.repo/manifests/路径中,将remote修改成git@172.168.1.63:/home/git/Project/8227L_project/manifest,如下:
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927/.repo/manifests$ git checkout -b android-trunk-o1.ac8227L origin/android-trunk-o1.ac8227L
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927/.repo/manifests$ git remote set-url origin git@172.168.1.63:/home/git/Project/8227L_project/manifest
修改.repo/manifests/default.xml 先进行备份 如下:
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927/.repo/manifests$ cp default.xml atc_default.xml
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
<default remote="autochips" revision="android-trunk-o1.ac8227L" sync-j="4"/>
<project name="atc/android/o/ReleaseNote" path="ReleaseNote" />
<project name="atc/android/o/ccu_tool" path="ccu_tool" />
.....................................
修改成:
<?xml version="1.0" encoding="UTF-8"?>
<manifest>
<remote fetch="ssh://git@172.168.1.63:/home/git/Project/8227L_project/" name="origin"/>或
<remote fetch="ssh://git@172.168.1.63/home/git/Project/8227L_project/" name="origin"/>
<default remote="origin" revision="android-trunk-o1.ac8227L" sync-j="4"/>
<project name="ReleaseNote" path="ReleaseNote" />
<project name="ccu_tool" path="ccu_tool" />
.........................................
其他保持不变。上传到git服务器的/home/git/Project/8227L_project/manifest库中,如下:
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927/.repo/manifests$ git add ./
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927/.repo/manifests$ git commit -m "init mt8827L AndroidO project init"
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927/.repo/manifests$ git push origin android-trunk-o1.ac8227L
4、批量上传OEM厂家给的repo代码子库
将之前在repo代码库迁移1中批量上传代码的脚本文件和之前修改的default.xml文件复制到本地的OEM厂家下载的代码库中,如下:
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927$ cp ~/xxxx/getnames_and_init_push_git_proj.py ./
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927$ cp .repo/manifests/default.xml ./
执行批量上传,如下:
zhaojr@OptiPlex-7040:~/project/AndoridOGO_8827L_20180927$ ./getnames_and_init_push_git_proj.py default.xml
getnames_and_init_push_git_proj.py的内容如下:
#!/usr/bin/python3
import os
import sys
#remote = 'git@127.0.0.1:rk3229'
#git@172.168.1.63/home/git/Project/8227L_project
##remote = 'git@172.168.1.63:atc/android/o'
remote = 'git@172.168.1.63:/home/git/Project/8227L_project' ####注意这个地址,一定要跟服务的getnames_and_create_project.py这个脚本运行路径保持一致,否则会在上传代码时提示找不到repo初始化的情况
#remote = 'ssh://b_flyaudio001@release.autochips.com:29418'
#remote = 'ssh://b_flyaudio001@release.autochips.com:29418'
if len(sys.argv) == 1:
print('错误!请传入 xml 文件')
elif len(sys.argv) > 2:
print('错误!传入参数太多')
else:
print('传入的文件是 %s' % sys.argv[1])
with open(sys.argv[1], 'r') as fin:
while True:
linestr = fin.readline()
if linestr == '': #表示文件结束
break
#####for project-list.txt
#else:
#print(linestr)
#localpath = sys.path[0] + '/' + linestr # git工程的本地绝对路径
#remotepath = remote + '/' + linestr # git工程远程相对路径
#cmd = 'cd %s && git remote set-url autochips %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
#print(cmd)
#os.system(cmd)
#end for project-list.txt
print(linestr)
#下面开始对本行内容分析
if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行内容含有name信息
#print(linestr)
#先无条件提取name路径
charistr1 = 'name="'
charistr2 = '"'
namestr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
if 'path=' in linestr: #如果path存在则用path的路径作为本地路径
charistr1 = 'path="'
charistr2 = '"'
pathstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
else: #如果path不存在,则认为path路径(本地路径)就是name路径
pathstr = namestr
print('name="%s", path="%s"' % (namestr, pathstr))
path_m = pathstr
if path_m == 'autochips': #路径等于origin,那么不创建 这里因为OEM给的git remote -v 指向autochips,如果指向origin,那么这里将使用origin,这个将不上传
print(path_m)
else:
#下面开始初始化并提交git工程
localpath = sys.path[0] + '/' + pathstr # git工程的本地绝对路径
remotepath = remote + '/' + namestr # git工程远程相对路径
print('localpath="%s"' %localpath)
print('remotepath="%s"' %remotepath)
#判断本地目录是否为空,为空的话则新建一个文件,空目录会导致git提交失败
if os.path.exists(localpath): #目录存在上传文件
#cmd = 'touch %s/._USELESSFILE_' % (localpath)
#cmd = 'touch %s/.gitignore' % (localpath)
print(localpath)
#os.system(cmd)
if not os.listdir(localpath): # 本地目录为空 这里首先判断目录是否存在,然后再判断是否为空目录,那么需要创建文件,否则无法上传,如:default.xml下的:groups="notdefault,AndroidO-All-GRP-AVIN"这类型的路径
cmd = 'touch %s/.gitignore' % (localpath)
print(localpath)
os.system(cmd)
#cmd = 'cd %s && git remote add set-url autochips %s && git add . && git commit -m "init base 8827L project" &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
#cmd = 'cd %s && git remote set-url autochips %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
print(remotepath)
###########这里将更新子库的远程服务器地址
cmd = 'cd %s && git remote set-url autochips %s && cd %s' % (localpath, remotepath, sys.path[0])
print(cmd)
os.system(cmd)
#############这里开始上传代码
cmd = 'cd %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, sys.path[0])
print(cmd)
os.system(cmd)
else: #目录不存在不上传
print(localpath)
#cmd = 'cd %s && rm -rf .git && git init && git remote add origin %s && git add . -f && git commit -m "init " &&git push -u origin master && cd %s' % (localpath, remotepath, sys.path[0])
#print(cmd)
#os.system(cmd)
getnames_and_init_push_git_proj.py文件下载链接:https://download.csdn.net/download/jinron10/10696074
5、创建master分支和dev分支
首先下载之前上传的代码,如下:
zhaojr@OptiPlex-7040:~$ mkdir test_AndroidO_Repo_self
zhaojr@OptiPlex-7040:~$ cd test_AndroidO_Repo_self
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ repo init -u git@172.168.1.63:Project/8227L_project/manifest.git -b android-trunk-o1.ac8227L
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ repo sync -c && repo forall -c "git checkout -b android-trunk-o1.ac8227L origin/android-trunk-o1.ac8227L"
创建master分支并上传:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ repo forall -c "git checkout -b master"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ repo forall -c "git push origin master"
为服务器的所有代码子库的master创建default.xml文件,如下:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ cd .repo/manifests$
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git checkout -b master
修改default.xml文件,将version=android-trunk-o1.ac8227L 修改成version=master,保存并上传,如下:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git add ./
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git commit -m "init mt8227l androidO project master barnch default.xml confiogure"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git push origin master
创建Dev分支:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ repo forall -c "git checkout -b dev"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ repo forall -c "git push origin dev"
为服务器的所有代码子库的master创建default.xml文件,如下:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self$ cd .repo/manifests$
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git checkout -b dev
修改default.xml文件,将version=android-trunk-o1.ac8227L 修改成version=dev,保存并上传,如下:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git add ./
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git commit -m "init mt8227l androidO project dev barnch default.xml confiogure"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo_self/.repo/manifests$ git push origin dev
6、下载编译
zhaojr@OptiPlex-7040:~$ mkdir test_AndroidO_Repo1
zhaojr@OptiPlex-7040:~$ cd test_AndroidO_Repo1
master分支:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ repo init -u git@172.168.1.63:Project/8227L_project/manifest.git -b master
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ repo sync -c && repo forall -c "git checkout -b master origin/master"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ ./allmake.sh
Dev分支:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ repo init -u git@172.168.1.63:Project/8227L_project/manifest.git -b Dev
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ repo sync -c && repo forall -c "git checkout -b Dev origin/Dev"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ ./allmake.sh
android-trunk-o1.ac8227L分支:
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ repo init -u git@172.168.1.63:Project/8227L_project/manifest.git -b android-trunk-o1.ac8227L
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ repo sync -c && repo forall -c "git checkout -b android-trunk-o1.ac8227L origin/android-trunk-o1.ac8227L"
zhaojr@OptiPlex-7040:~/test_AndroidO_Repo1$ ./allmake.sh