赞
踩
部署的原则,参考本地已有的git库部署到git服务器上的方法
本地已经git库,我们将其部署到git服务器上步骤:
第一种:将已经存在的git库添加remote的方式,让已经存在的git库即指向BSP厂家的git库,要指向我们自己git服务器的git库,原厂有更新时,使用git fetch xxx(git fetch autochips(从autochips这个远程指向地址更新)或git fetch origin(从origin这个远程指向地址更新)),然后使用git push origin android-dev-p0.ac8257方式就可以间接更新代码。即可autochips指向BSP厂家git库,origin指向我们服务器git库。
- 参考命令字:
- git服务器端:
- git@zhaojingrong-S2600CP:~$ git init --bare atc/android/p/test_project
- 客户端:
- //从BSP厂家下载源码
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git clone ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/test_project -b android-dev-p0.ac8257
- //添加remote_path指向BSP厂家服务器地址
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git remote add remote_path ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/test_project
- //将origin指向BSP服务器的remote名称删除
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git remote remove origin
- //添加origin指向我们自己服务上创建的test_project地址
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git remote add origin git@172.168.1.63:/home/git/atc/android/p/test_project
- //将代码上传到我们服务器中,保留git commit日志
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git push -u origin android-dev-p0.ac8257
第二种方法:
使用代码镜像方式更新和迁移代码。
- 直接在git服务器上运行:
- 远程镜像获取
- git clone --mirror ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/platform/art.git -b android-dev-p0.ac8257
- 或者
- git clone --mirror http://release.autochips.com:29418/atc/android/p/platform/art.git -b android-dev-p0.ac8257
- 注意default.xml文件中BSP厂家代码服务器的远端路径
- 把镜像仓库推送到我们git服务器
- 在我们的git服务器新建好空项目:git init --bare atc/android/p/platform/art.git
- git push --mirror git@172.168.1.63:/home/git/atc/android/p/platform/art.git //这里用绝对路径,直接推送即可,推送的是android-dev-p0.ac8257,并没有master分支。所以后面下载的时候请将上分支名称,否则会报错误
- 验证:
- git clone git@172.168.1.63:/home/git/atc/android/p/platform/art.git -b android-dev-p0.ac8257
- 验证OK了之后,在使用当前验证的分支,在远程服务器上创建master分支,如下:
- git push origin android-dev-p0.ac8257:master
-
- 更新:
- 1)先执行远程更新命令
- git remote update //从BSP厂家服务器获取(ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/platform/art.git),因为git remove -v指向BSP厂家服务器
- 2)再执行推送命令
- git push --mirror git@172.168.1.63:/home/git/atc/android/p/platform/art.git //这里用绝对路径,并且推送到我们自己服务器

基于以上原理,目前我们项目使用第一种方法创建的,是基于代码库中的.repo/manifests/default.xml文件编写脚本批量创建git库,同时批量上传代码。而第二种方法更快更迅速(直接编写个脚本全自动话即可),没尝试,下次需要,尝试一下。
1、基于原厂给的BSP下载方式下载代码,将androidP项目的代码拉到本地,如下:
- zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror$ repo init -u ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/manifest -b android-dev-p0.ac8257 -g all,-notdefault
- zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror$ repo sync –c
2、基于.repo/manifests/default.xml文件在git服务器上批量创建git子库
编写脚本,脚本如下:
- //git 服务器上批量创建子库,运行方法:
- ###getnames_and_create_project.py default.xml
- #!/usr/bin/python3
-
- import os
- import sys
-
- ###该脚本在default.xml的remote地址绝对路径下运行,即/home/git 目录下运行,运行方式
- #getnames_and_create_project_autochips.py atc_default.xml即可
-
- 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)]
- ###gitprojstr为default.xml左边的name= xxx/xxx的路径,如name="atc/android/p/device/generic/arm64
- print(gitprojstr)
- path_m=gitprojstr
- if path_m == 'autochips':
- print(path_m)
- else:
- #下面开始创建git工程
- #cmd = 'git init --bare %s.git' % gitprojstr
- syspath = sys.path[0]
- print(syspath)
- #cmd = 'cd %s && mkdir %s.git && cd %s && git init --bare && cd %s' % (sys.path[0], gitprojstr, gitprojstr, sys.path[0])
- ####在/home/git/路径下批量创建name= xxx/xxx的路径并初始化init,即根据default.xml来批量创建空的git库
- cmd = 'git init --bare %s' % gitprojstr
- print(cmd)
- os.system(cmd)
- #cmd = 'git init --bare %s' % gitprojstr
- #cmd = 'git init --bare %s.git' % gitprojstr
- #cmd = 'mkdir %s.git && cd %s && git init --bare && cd %s' % (localpath, localpath, sys.path[0])
- #print(cmd)
- #os.system(cmd)

修改default.xml文件,将文件中的
- <remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
- 修改成:
- <?xml version="1.0" encoding="UTF-8"?>
- <manifest>
- <!-- 注意:这里使用的远程的地址,在运行脚本的时候只能在/home/git/目录运行,后面使用getnames_and_init_push_git_proj_ok.py default.xml脚本的时候,
- 上传代码的origin 指向的remote地址必须使用git@172.168.1.63:/home/git/xxxx/xxxx/xxxx/xxx/xxx.git绝对路径,不能使用使用相对路径,否则会存在异常无法上传的情况
- 而name=autochips这个不影响在git服务器上批量创建文件,只跟 remote地址有关-->
- <remote fetch="ssh://git@172.168.1.63:/home/git" name="autochips"/> //主要修改这里,其它不变
-
- <default remote="autochips" revision="android-dev-p0.ac8257" sync-j="4"/>
git 服务器上运行(将修改好的getnames_and_create_project.py文件和default.xml文件拷贝到/home/git/目录中运行):
git服务器端:
注意:以上default.xml文件中我们定义remote是:ssh://git@172.168.1.63:/home/git,所以该脚本在/home/git 目录下运行,否则后面上传代码路径会有差异。
git@zhaojingrong-S2600CP:~$ getnames_and_create_project.py default.xml
即可创建default.xml文件中的左边的name="atc/android/p/xxxxx/xxxx/xxxx的所有子库。
3、将本地从BSP厂家下载的repo代码库批量上传到git 服务器端创建的所有子库上
3.1 先单独创建manifests库,用来管路所有子库,主要是xxx.xml文件上传到这个库中,方法如下:
- 一)从BSP厂家的repo代码库中单独下载manifests库,如下:
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests$ git clone ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/manifest -b android-dev-p0.ac8257
- 二)修改manifest库的远程指向,让origin指向我们的git服务器的manifest库(git@172.168.1.63:atc/android/p/manifest)
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git remote add remote_path ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/manifest
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git remote remove origin
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git remote add origin git@172.168.1.63:atc/android/p/manifest
- 2) 修改./manifest/default.xml文件,如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <manifest>
- <remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
- <default remote="autochips" revision="android-dev-p0.ac8257" sync-j="4"/>
- 修改成:
- <?xml version="1.0" encoding="UTF-8"?>
- <manifest>
- <remote fetch="ssh://git@172.168.1.63:/home/git" name="origin"/> //name为我们远程服务器地址的别名 remote fetch为我们的git服务器的地址,注意这里的地址为第1步中批量创建git库中的default.xml修改时的地址,必须保持一致,否则后面的上传和下载会提示找不到路径
- <default remote="origin" revision="android-dev-p0.ac8257" sync-j="4"/> //revision为创建代码的分支名称
- 保存,退出。
- 三、添加修改并上传到我们服务器的manifest库的android-dev-p0.ac8257分支和master分支中
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git add ./
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git commit -m "init New xxx Project"
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git push origin android-dev-p0.ac8257
- zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git push origin android-dev-p0.ac8257:master

3.2 编写脚本,基于BSP厂家给的.repo/manifests/default.xml文件批量上传代码
3.2.1)因为在第一步中从BSP原厂拉的代码到本地,是没有指定分支的,如下:
- zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror/art$ git branch -a
- * defult
- remotes/autochips/android-dev-p0.ac8257
- remotes/m/android-dev-p0.ac8257 -> autochips/android-dev-p0.ac8257
所以我们需要先切换分支,不要使用repo forall -c "git checkout -b xxxx autochips/xxxx的方式切换,要跟批量上传脚本保持一致,使用如下脚本(getnames_and_checkout_proj.py):
- #!/usr/bin/python3
- ###running:getnames_and_checkout_proj.py default.xml
-
- import os
- import sys
-
- #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'
-
- 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信息
- #先无条件提取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,那么不创建
- if path_m == '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): # 本地目录为空
- cmd = 'touch %s/.gitignore' % (localpath)
- print(localpath)
- #print('localpath NULL="%s"' %localpath)
- #print('localpath NULL cmd="%s"' %cmd)
- print(cmd)
- 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])
- #cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0])
- #cmd = 'cd %s && git remote remove origin && cd %s' % (localpath, sys.path[0]) ##如果代码库中有origin的远程指向将移除origin
- #print(cmd)
- #os.system(cmd)
- #代码下载之后没切换分支,先切换分支
- cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
- print(cmd)
- os.system(cmd)
- #添加remote为origin 指向我们的git 服务器地址
- ##cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
- ##print(cmd)
- ##os.system(cmd)
- ##开始批量上传代码
- cmd = 'cd %s && git push -u origin android-dev-p0.ac8257 && 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)

注意:以上脚本在checkout分支的时候,remote使用autochips,主要原因是我们在下载原厂BSP的时候代码库的remote名称是autochips,指向原厂BSP的gerrite路径,如下:
- zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror/art$ git branch -a
- * defult
- remotes/autochips/android-dev-p0.ac8257
- remotes/m/android-dev-p0.ac8257 -> autochips/android-dev-p0.ac8257
主要使用的脚本内容:
- #代码下载之后没切换分支,先切换分支
- cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
- print(cmd)
- os.system(cmd)
修改default.xml文件,内容修改如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <manifest>
- <remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
- <default remote="autochips" revision="android-dev-p0.ac8257" sync-j="4"/>
- <project name="atc/android/p/ReleaseNote" path="ReleaseNote" />
- 修改成:
- <?xml version="1.0" encoding="UTF-8"?>
- <manifest>
- <remote fetch="ssh://git@172.168.1.63:/home/git" name="origin"/>
- <default remote="origin" revision="android-dev-p0.ac8257" sync-j="4"/>
- <project name="atc/android/p/ReleaseNote" path="ReleaseNote" />
在本地的test_mt8257/目录中运行(将修改好的getnames_and_checkout_proj.py文件和default.xml文件拷贝到test_mt8257/目录中运行):
zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror$ getnames_and_checkout_proj.py default.xml
完成后,开始代码库的批量上传
3.2.2)编写脚本进行代码库的批量上传(上传要求保留原厂的修改日志)
1)编写批量上传代码的脚本
- #!/usr/bin/python3
- #####running: getnames_and_init_push_git_proj.py default.xml
-
- 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'
- #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,那么不创建
- if path_m == '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): # 本地目录为空
- cmd = 'touch %s/.gitignore' % (localpath)
- print(localpath)
- #print('localpath NULL="%s"' %localpath)
- #print('localpath NULL cmd="%s"' %cmd)
- print(cmd)
- 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])
- #cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0])
- #cmd = 'cd %s && git remote remove origin && cd %s' % (localpath, sys.path[0]) ##如果代码库中有origin的远程指向将移除origin
- #print(cmd)
- #os.system(cmd)
- #代码下载之后没切换分支,先切换分支
- ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
- ##print(cmd)
- ##os.system(cmd)
- #添加remote为origin 指向我们的git 服务器地址
- cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
- print(cmd)
- os.system(cmd)
- ##开始批量上传代码
- cmd = 'cd %s && git push -u origin android-dev-p0.ac8257 && 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)

以上脚本中的关键代码:
-
- if path_m == 'origin': #路径等于origin,那么不创建,这个很关键,在name=origin时(即default.xml中的<default remote="origin" revision="android-dev-p0.ac8257" sync-j="4"/>这个语句要判断一下,否则会报错误)
- print(path_m)
- else:
- ..................................
- if not os.listdir(localpath): # 本地目录为空,这个需要,在上传文件时防止有空目录
- cmd = 'touch %s/.gitignore' % (localpath)
- print(localpath)
- #print('localpath NULL="%s"' %localpath)
- #print('localpath NULL cmd="%s"' %cmd)
- print(cmd)
- os.system(cmd)
- ............................................
- ####添加origin的别名的指向,因为BSP厂家给的只有autochips别名,并且指向BSP厂家自己的代码服务器,需要添加我们自己的别名并指向我们自己的代码服务器
- cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
- print(cmd)
- os.system(cmd)
- ##开始批量上传代码,保留BSP厂家的修改
- cmd = 'cd %s && git push -u origin android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
- print(cmd)
- os.system(cmd)

default.xml文件使用3.2.1中修改好的xml文件,将getnames_and_init_push_git_proj.py文件和default.xml文件拷贝到本地代码镜像目录test_mt8257/目录中执行即可。
zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror$ getnames_and_init_push_git_proj.py default.xml
上传完成之后进行部署代码库的验证工作。
3.2.3 上传时建立master分支
在以上上传基础上修改如下:
- #!/usr/bin/python3
- #####running: getnames_and_init_push_master_proj.py default.xml
-
- 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'
- #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
- 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,那么不创建
- if path_m == '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): #目录存在上传文件
- print(localpath)
- if not os.listdir(localpath): # 本地目录为空
- cmd = 'touch %s/.gitignore' % (localpath)
- print(localpath)
- #print('localpath NULL="%s"' %localpath)
- #print('localpath NULL cmd="%s"' %cmd)
- print(cmd)
- 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])
- #cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0])
- #cmd = 'cd %s && git remote remove origin && cd %s' % (localpath, sys.path[0]) ##如果代码库中有origin的远程指向将移除origin
- #print(cmd)
- #os.system(cmd)
- #代码下载之后没切换分支,先切换分支
- ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
- ##print(cmd)
- ##os.system(cmd)
- #添加remote为origin 指向我们的git 服务器地址
- ##cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
- ##print(cmd)
- ##os.system(cmd)
- ##开始批量上传代码
- cmd = 'cd %s && git push -u origin android-dev-p0.ac8257:masetr && 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)

关键脚本如下:
- ####3.2.3中在上传完成android-dev-p0.ac8257分支之后,再单独批量上传master分支,master分支和android-dev-p0.ac8257分支指向同一个节点:
- #代码下载之后没切换分支,先切换分支
- ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
- ##print(cmd)
- ##os.system(cmd)
- #添加remote为origin 指向我们的git 服务器地址
- ##cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
- ##print(cmd)
- ##os.system(cmd)
- ##开始批量上传代码并创建master分支
- cmd = 'cd %s && git push -u origin android-dev-p0.ac8257:master && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
- print(cmd)
- os.system(cmd)
- 在3.2.2中可以一次到位,如下脚本:
- ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
- ##print(cmd)
- ##os.system(cmd)
- #添加remote为origin 指向我们的git 服务器地址
- cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
- print(cmd)
- os.system(cmd)
- ##开始批量上传代码并创建master分支
- cmd = 'cd %s && git push -u origin android-dev-p0.ac8257 && git push -u origin android-dev-p0.ac8257:master && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
- print(cmd)
- os.system(cmd)

将脚本getnames_and_init_push_master_proj文件和py default.xml文件拷贝到~/project/mt8257_mirror/目录中执行:
执行:zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror$ getnames_and_init_push_master_proj.py default.xml
4、代码验证
在本地编译环境中下载刚刚我们创建好的代码,本地编译环境预留180G的空间,防止编译过程中硬盘空间不够,如下:
- 1、单独下载android-dev-p0.ac8257分支
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ repo init -u git@172.168.1.63:atc/android/p/manifest -b android-dev-p0.ac8257
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257r$ repo sync -c
- 2、所有分支全部下载,下载完成后自己切换分支,如下:
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ repo init -u git@172.168.1.63:atc/android/p/manifest
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ repo sync
-
- 我们使用第一种,因为方便同步ATC的代码,我们不使用3.2.3批量上传master分支的方法(这种方法在我们中间代码库(BSP厂家代码服务器拉的库,它同时指向BSP厂家服务器和我们自己的git服务器)),我们将在下载编译OK之后,使用拉我们服务器(git@172.168.1.63:atc/android/p/manifest)ropo代码库到本地,然后使用
- repo forall -c "git push origin android-dev-p0.ac8257:master"的方式创建master分支
在代码编译过程中提示以下信息:
- FAILED: out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system.img
- /bin/bash -c "(if [ -d out/target/product/k61v1_demo_64_bsp/system/vendor ] && [ ! -h out/target/product/k61v1_demo_64_bsp/system/vendor ]; then echo 'Non-symlink out/target/product/k61v1_demo_64_bsp/system/vendor detected!' 1>&2; echo 'You cannot install files to out/target/product/k61v1_demo_64_bsp/system/vendor while building a separate vendor.img!' 1>&2; exit 1; fi ) && (ln -sf /vendor out/target/product/k61v1_demo_64_bsp/system/vendor ) && (mkdir -p out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/ out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates && rm -rf out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"ext_mkuserimg=mkuserimg_mke2fs.sh\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"fs_type=ext4\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"system_size=3221225472\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"userdata_size=3221225472\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"cache_fs_type=ext4\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"cache_size=452984832\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"vendor_fs_type=ext4\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"vendor_size=838860800\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"extfs_sparse_flag=-s\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"squashfs_sparse_flag=-s\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"selinux_fc=out/target/product/k61v1_demo_64_bsp/obj/ETC/file_contexts.bin_intermediates/file_contexts.bin\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"system_verity_block_device=/dev/block/platform/bootdevice/by-name/system\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"vendor_verity_block_device=/dev/block/platform/bootdevice/by-name/vendor\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_avbtool=avbtool\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_system_hashtree_enable=true\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_system_add_hashtree_footer_args=--rollback_index 0 --setup_as_rootfs_from_kernel\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_system_key_path=device/mediatek/common/system_prvk.pem\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_system_algorithm=SHA256_RSA2048\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_system_rollback_index_location=2\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_vendor_hashtree_enable=true\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_vendor_add_hashtree_footer_args=\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_product_hashtree_enable=true\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"avb_product_add_hashtree_footer_args=\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"system_root_image=true\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt; echo \"ramdisk_dir=out/target/product/k61v1_demo_64_bsp/root\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (echo \"skip_fsck=true\" >> out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt ) && (mkdir -p out/target/product/k61v1_demo_64_bsp/system/data ) && (python ./build/tools/releasetools/rootcheck.py out/target/product/k61v1_demo_64_bsp/system out/target/product/k61v1_demo_64_bsp/lk.bin out/target/product/k61v1_demo_64_bsp/recovery.img out/target/product/k61v1_demo_64_bsp/boot.img out/target/product/k61v1_demo_64_bsp/logo.bin out/target/product/k61v1_demo_64_bsp/system/data out/target/product/k61v1_demo_64_bsp/trustzone.bin ) && (PATH=out/host/linux-x86/bin/:\$PATH build/make/tools/releasetools/build_image.py out/target/product/k61v1_demo_64_bsp/system out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system_image_info.txt out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system.img out/target/product/k61v1_demo_64_bsp/system || ( echo \"Out of space? the tree size of out/target/product/k61v1_demo_64_bsp/system is (MB): \" 1>&2 ; du -sm out/target/product/k61v1_demo_64_bsp/system 1>&2; if [ \"ext4\" == \"ext4\" ]; then maxsize=3221225472; echo \"The max is \$(( maxsize / 1048576 )) MB.\" 1>&2 ; else echo \"The max is \$(( 3221225472 / 1048576 )) MB.\" 1>&2 ; fi; mkdir -p out/dist; cp out/target/product/k61v1_demo_64_bsp/installed-files.txt out/dist/installed-files-rescued.txt; exit 1 ) )"
- crc and md5 generate start
- out/target/product/k61v1_demo_64_bsp/lk.bin
- out/target/product/k61v1_demo_64_bsp/recovery.img
- out/target/product/k61v1_demo_64_bsp/boot.img
- out/target/product/k61v1_demo_64_bsp/logo.bin
- out/target/product/k61v1_demo_64_bsp/system
- cal system file crc begin
- cal_system_file_crc in_dir:out/target/product/k61v1_demo_64_bsp/system
- Traceback (most recent call last):
- File "./build/tools/releasetools/rootcheck.py", line 321, in <module>
- main(sys.argv[1:])
- File "./build/tools/releasetools/rootcheck.py", line 295, in main
- cal_system_file_crc(file_count,in_dir)
- File "./build/tools/releasetools/rootcheck.py", line 215, in cal_system_file_crc
- frb.close()
- UnboundLocalError: local variable 'frb' referenced before assignment
- ninja: build stopped: subcommand failed.
- 18:57:02 ninja failed with: exit status 1

请按照以下方法修改:
方法1:修改build\make\core\Makefile中的create-system-vendor-symlink函数,在编译vendor.img存在时,不执行
$(hide) ln -sf /vendor $(TARGET_OUT)/vendor软连接动作
- 修改:build\make\core\Makefile
- # Create symlink /system/vendor to /vendor if necessary.
- ifdef BOARD_USES_VENDORIMAGE
- define create-system-vendor-symlink
- $(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \
- echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \
- echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \
- exit 1; \
- fi
- ##$(hide) ln -sf /vendor $(TARGET_OUT)/vendor //注释掉这行,因为在编译成vendor.img的时候就不再需要软连接了,系统已经在out/target/product/k61v1_demo_64_bsp/下面生成vendor,而并不是从system/目录下软连接过来,当然不同的编译环境会有不同,有些环境是不需要修改的,目前使用的环境(gcc version 4.8.4 (Ubuntu 4.8.4-2ubuntu1~14.04.3))
- endef
- else
- define create-system-vendor-symlink
- $(hide) ln -sf /vendor $(TARGET_OUT)/vendor //在这里添加这行,在有vendor.img时脚本根本跑不到这里
- endef
- endif
-
- # Create symlink /system/product to /product if necessary.
- ifdef BOARD_USES_PRODUCTIMAGE //这个是没有定义的,即可没有prodect.img编译,所以根本就跑不到以下代码
- define create-system-product-symlink
- $(hide) if [ -d $(TARGET_OUT)/product ] && [ ! -h $(TARGET_OUT)/product ]; then \
- echo 'Non-symlink $(TARGET_OUT)/product detected!' 1>&2; \
- echo 'You cannot install files to $(TARGET_OUT)/product while building a separate product.img!' 1>&2; \
- exit 1; \
- fi
- $(hide) ln -sf /product $(TARGET_OUT)/product
- endef
- else //没有product.img编译就直接退出,不做任何操作
- define create-system-product-symlink
- endef
- endif

以上方法编译之后,如果系统不能正常启动到主界面,请使用第二种方法.
方法二:修改build\make\tools\releasetools\rootcheck.py
- def cal_system_file_crc(file_count,in_dir):
- value=-1
- global ENCRYPT_KEY
- key=ENCRYPT_KEY
- number=0
- crc=0
- fo=open(file_count,"w")
- fo.write(str(value))
- fo.write("\t")
- fo.write("file_number_in_system_dayu")
- fo.write("\t")
- fo.write(str(fileCountIn(in_dir)))
- fo.write("\n")
- for root, dirs, files in os.walk(in_dir):
- for file in files:
- crc32=0
- #mymd5=hashlib.md5()
- if file=="file_count":
- continue
- if os.path.isfile(os.path.join(root,file)) and not os.path.islink(os.path.join(root,file)):
- #crc32 = binascii.crc32((os.path.join(root,file)))+crc32
- mymd5=hashlib.md5()
- frb=open(os.path.join(root,file),'rb')
- while True:
- tmp=frb.read(4*1024)
- if tmp=='':
- break
- crc32 += fileCRC32(os.path.join(root,file),crc32,tmp)
- mymd5.update(tmp)
- #print("%x" %(crc32&0xffffffff))
- #print ("%s:0x%x \n" %(os.path.join(root,file),crc32&0xffffffff))
- crc32=crc32&0xffffffff ###这行开始
- fo.write(str(number))
- fo.write("\t")
- filepath=encrypt(key,os.path.join(root,file))
- fo.write(filepath)
- fo.write("\t")
- filecrc=encrypt(key,crc32)
- fo.write(filecrc)
- fo.write("\t")
- if not os.path.islink(os.path.join(root,file)):
- filemd5=encrypt(key,mymd5.hexdigest())
- else:
- filemd5=encrypt(key,0)
- fo.write(filemd5)
- fo.write("\n")
- number+=1
- frb.close() ##这行结束的代码段tab缩进符必须跟frb=open(os.path.join(root,file),'rb')语句保持一致
- crc=crc+crc32 ##缩进一个tab键
- crc=crc&0xffffffff
- fo.close()

主要原因我有些环境python工具对python脚本语法检查很严格,tab键的缩进符不对导致局部变量在外层引用而导致错误。经过验证,方法二修改是OK的。
编译方式:
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ source ./build/envsetup.sh
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ lunch full_k61v1_demo_64_bsp-userdebug
- zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ ./allmake.sh -p k61v1_demo_64_bsp
编译完成后使用flashtools下载编译后的代码,在BSP厂家开发板上验证是否OK,BSP厂家一般会给release_image,可以对比这个release_image进行 验证,也可以直接下载BSP包,编译后对比进行验证即可。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。