当前位置:   article > 正文

本地已存在repo代码部署到git服务器上的方法_本地的repo工程如何 同步到服务器中

本地的repo工程如何 同步到服务器中

部署的原则,参考本地已有的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库。

  1. 参考命令字:
  2. git服务器端:
  3. git@zhaojingrong-S2600CP:~$ git init --bare atc/android/p/test_project
  4. 客户端:
  5. //从BSP厂家下载源码
  6. 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
  7. //添加remote_path指向BSP厂家服务器地址
  8. zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git remote add remote_path ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/test_project
  9. //将origin指向BSP服务器的remote名称删除
  10. zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git remote remove origin
  11. //添加origin指向我们自己服务上创建的test_project地址
  12. zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git remote add origin git@172.168.1.63:/home/git/atc/android/p/test_project
  13. //将代码上传到我们服务器中,保留git commit日志
  14. zhaojr@zhaojr-OptiPlex-7040:~/project/test_project$ git push -u origin android-dev-p0.ac8257

第二种方法:

使用代码镜像方式更新和迁移代码。

  1. 直接在git服务器上运行:
  2. 远程镜像获取
  3. git clone --mirror ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/platform/art.git -b android-dev-p0.ac8257
  4. 或者
  5. git clone --mirror http://release.autochips.com:29418/atc/android/p/platform/art.git -b android-dev-p0.ac8257
  6. 注意default.xml文件中BSP厂家代码服务器的远端路径
  7. 把镜像仓库推送到我们git服务器
  8. 在我们的git服务器新建好空项目:git init --bare atc/android/p/platform/art.git
  9. git push --mirror git@172.168.1.63:/home/git/atc/android/p/platform/art.git //这里用绝对路径,直接推送即可,推送的是android-dev-p0.ac8257,并没有master分支。所以后面下载的时候请将上分支名称,否则会报错误
  10. 验证:
  11. git clone git@172.168.1.63:/home/git/atc/android/p/platform/art.git -b android-dev-p0.ac8257
  12. 验证OK了之后,在使用当前验证的分支,在远程服务器上创建master分支,如下:
  13. git push origin android-dev-p0.ac8257:master
  14. 更新:
  15. 1)先执行远程更新命令
  16. git remote update //从BSP厂家服务器获取(ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/platform/art.git),因为git remove -v指向BSP厂家服务器
  17. 2)再执行推送命令
  18. git push --mirror git@172.168.1.63:/home/git/atc/android/p/platform/art.git //这里用绝对路径,并且推送到我们自己服务器

基于以上原理,目前我们项目使用第一种方法创建的,是基于代码库中的.repo/manifests/default.xml文件编写脚本批量创建git库,同时批量上传代码。而第二种方法更快更迅速(直接编写个脚本全自动话即可),没尝试,下次需要,尝试一下。

1、基于原厂给的BSP下载方式下载代码,将androidP项目的代码拉到本地,如下:

  1. 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
  2. zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror$ repo sync –c

2、基于.repo/manifests/default.xml文件在git服务器上批量创建git子库

编写脚本,脚本如下:

  1. //git 服务器上批量创建子库,运行方法:
  2. ###getnames_and_create_project.py default.xml
  3. #!/usr/bin/python3
  4. import os
  5. import sys
  6. ###该脚本在default.xml的remote地址绝对路径下运行,即/home/git 目录下运行,运行方式
  7. #getnames_and_create_project_autochips.py atc_default.xml即可
  8. if len(sys.argv) == 1:
  9. print('错误!请传入 xml 文件')
  10. elif len(sys.argv) > 2:
  11. print('错误!传入参数太多')
  12. else:
  13. print('传入的文件是 %s' % sys.argv[1])
  14. with open(sys.argv[1], 'r') as fin:
  15. while True:
  16. linestr = fin.readline()
  17. if linestr == '': #表示文件结束
  18. break
  19. print(linestr)
  20. #下面开始对本行内容分析
  21. if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行内容含有name信息
  22. print(linestr)
  23. #下面分析本行内容,并提取name
  24. charistr1 = 'name="'
  25. charistr2 = '"'
  26. gitprojstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  27. ###gitprojstr为default.xml左边的name= xxx/xxx的路径,如name="atc/android/p/device/generic/arm64
  28. print(gitprojstr)
  29. path_m=gitprojstr
  30. if path_m == 'autochips':
  31. print(path_m)
  32. else:
  33. #下面开始创建git工程
  34. #cmd = 'git init --bare %s.git' % gitprojstr
  35. syspath = sys.path[0]
  36. print(syspath)
  37. #cmd = 'cd %s && mkdir %s.git && cd %s && git init --bare && cd %s' % (sys.path[0], gitprojstr, gitprojstr, sys.path[0])
  38. ####在/home/git/路径下批量创建name= xxx/xxx的路径并初始化init,即根据default.xml来批量创建空的git库
  39. cmd = 'git init --bare %s' % gitprojstr
  40. print(cmd)
  41. os.system(cmd)
  42. #cmd = 'git init --bare %s' % gitprojstr
  43. #cmd = 'git init --bare %s.git' % gitprojstr
  44. #cmd = 'mkdir %s.git && cd %s && git init --bare && cd %s' % (localpath, localpath, sys.path[0])
  45. #print(cmd)
  46. #os.system(cmd)

修改default.xml文件,将文件中的

  1. <remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
  2. 修改成:
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <manifest>
  5. <!-- 注意:这里使用的远程的地址,在运行脚本的时候只能在/home/git/目录运行,后面使用getnames_and_init_push_git_proj_ok.py default.xml脚本的时候,
  6. 上传代码的origin 指向的remote地址必须使用git@172.168.1.63:/home/git/xxxx/xxxx/xxxx/xxx/xxx.git绝对路径,不能使用使用相对路径,否则会存在异常无法上传的情况
  7. 而name=autochips这个不影响在git服务器上批量创建文件,只跟 remote地址有关-->
  8. <remote fetch="ssh://git@172.168.1.63:/home/git" name="autochips"/> //主要修改这里,其它不变
  9. <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文件上传到这个库中,方法如下:

  1. 一)从BSP厂家的repo代码库中单独下载manifests库,如下:
  2. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests$ git clone ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/manifest -b android-dev-p0.ac8257
  3. 二)修改manifest库的远程指向,让origin指向我们的git服务器的manifest库(git@172.168.1.63:atc/android/p/manifest)
  4. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git remote add remote_path ssh://b_flyaudio001@release.autochips.com:29418/atc/android/p/manifest
  5. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git remote remove origin
  6. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git remote add origin git@172.168.1.63:atc/android/p/manifest
  7. 2) 修改./manifest/default.xml文件,如下:
  8. <?xml version="1.0" encoding="UTF-8"?>
  9. <manifest>
  10. <remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
  11. <default remote="autochips" revision="android-dev-p0.ac8257" sync-j="4"/>
  12. 修改成:
  13. <?xml version="1.0" encoding="UTF-8"?>
  14. <manifest>
  15. <remote fetch="ssh://git@172.168.1.63:/home/git" name="origin"/> //name为我们远程服务器地址的别名 remote fetch为我们的git服务器的地址,注意这里的地址为第1步中批量创建git库中的default.xml修改时的地址,必须保持一致,否则后面的上传和下载会提示找不到路径
  16. <default remote="origin" revision="android-dev-p0.ac8257" sync-j="4"/> //revision为创建代码的分支名称
  17. 保存,退出。
  18. 三、添加修改并上传到我们服务器的manifest库的android-dev-p0.ac8257分支和master分支中
  19. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git add ./
  20. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git commit -m "init New xxx Project"
  21. zhaojiawei@zhaojingrong-S2600CP:~/test_manifests/manifest$ git push origin android-dev-p0.ac8257
  22. 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原厂拉的代码到本地,是没有指定分支的,如下:

  1. zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror/art$ git branch -a
  2. * defult
  3. remotes/autochips/android-dev-p0.ac8257
  4. 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):

  1. #!/usr/bin/python3
  2. ###running:getnames_and_checkout_proj.py default.xml
  3. import os
  4. import sys
  5. #git@172.168.1.63/home/git/Project/8227L_project
  6. ##remote = 'git@172.168.1.63:atc/android/o'
  7. remote = 'git@172.168.1.63:/home/git'
  8. if len(sys.argv) == 1:
  9. print('错误!请传入 xml 文件')
  10. elif len(sys.argv) > 2:
  11. print('错误!传入参数太多')
  12. else:
  13. print('传入的文件是 %s' % sys.argv[1])
  14. with open(sys.argv[1], 'r') as fin:
  15. while True:
  16. linestr = fin.readline()
  17. if linestr == '': #表示文件结束
  18. break
  19. print(linestr)
  20. #下面开始对本行内容分析
  21. if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行内容含有name信息
  22. #先无条件提取name路径
  23. charistr1 = 'name="'
  24. charistr2 = '"'
  25. namestr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  26. if 'path=' in linestr: #如果path存在则用path的路径作为本地路径
  27. charistr1 = 'path="'
  28. charistr2 = '"'
  29. pathstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  30. else: #如果path不存在,则认为path路径(本地路径)就是name路径
  31. pathstr = namestr
  32. print('name="%s", path="%s"' % (namestr, pathstr))
  33. path_m = pathstr
  34. #if path_m == 'autochips': #路径等于origin,那么不创建
  35. if path_m == 'origin': #路径等于origin,那么不创建
  36. print(path_m)
  37. else:
  38. #下面开始初始化并提交git工程
  39. localpath = sys.path[0] + '/' + pathstr # git工程的本地绝对路径
  40. remotepath = remote + '/' + namestr # git工程远程相对路径
  41. print('localpath="%s"' %localpath)
  42. print('remotepath="%s"' %remotepath)
  43. #判断本地目录是否为空,为空的话则新建一个文件,空目录会导致git提交失败
  44. if os.path.exists(localpath): #目录存在上传文件
  45. #cmd = 'touch %s/._USELESSFILE_' % (localpath)
  46. #cmd = 'touch %s/.gitignore' % (localpath)
  47. print(localpath)
  48. #os.system(cmd)
  49. if not os.listdir(localpath): # 本地目录为空
  50. cmd = 'touch %s/.gitignore' % (localpath)
  51. print(localpath)
  52. #print('localpath NULL="%s"' %localpath)
  53. #print('localpath NULL cmd="%s"' %cmd)
  54. print(cmd)
  55. os.system(cmd)
  56. #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])
  57. #cmd = 'cd %s && git remote set-url autochips %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
  58. #print(remotepath)
  59. #cmd = 'cd %s && git remote set-url autochips %s && cd %s' % (localpath, remotepath, sys.path[0])
  60. #cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0])
  61. #cmd = 'cd %s && git remote remove origin && cd %s' % (localpath, sys.path[0]) ##如果代码库中有origin的远程指向将移除origin
  62. #print(cmd)
  63. #os.system(cmd)
  64. #代码下载之后没切换分支,先切换分支
  65. cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
  66. print(cmd)
  67. os.system(cmd)
  68. #添加remote为origin 指向我们的git 服务器地址
  69. ##cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
  70. ##print(cmd)
  71. ##os.system(cmd)
  72. ##开始批量上传代码
  73. cmd = 'cd %s && git push -u origin android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
  74. ##print(cmd)
  75. ##os.system(cmd)
  76. else: #目录不存在不上传
  77. print(localpath)
  78. #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])
  79. #print(cmd)
  80. #os.system(cmd)

注意:以上脚本在checkout分支的时候,remote使用autochips,主要原因是我们在下载原厂BSP的时候代码库的remote名称是autochips,指向原厂BSP的gerrite路径,如下:

  1. zhaojr@zhaojr-OptiPlex-7040:~/project/mt8257_mirror/art$ git branch -a
  2. * defult
  3. remotes/autochips/android-dev-p0.ac8257
  4. remotes/m/android-dev-p0.ac8257 -> autochips/android-dev-p0.ac8257

主要使用的脚本内容:

  1. #代码下载之后没切换分支,先切换分支
  2. cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
  3. print(cmd)
  4. os.system(cmd)

 

修改default.xml文件,内容修改如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <manifest>
  3. <remote fetch="../../.." name="autochips" review="release.autochips.com:8080"/>
  4. <default remote="autochips" revision="android-dev-p0.ac8257" sync-j="4"/>
  5. <project name="atc/android/p/ReleaseNote" path="ReleaseNote" />
  6. 修改成:
  7. <?xml version="1.0" encoding="UTF-8"?>
  8. <manifest>
  9. <remote fetch="ssh://git@172.168.1.63:/home/git" name="origin"/>
  10. <default remote="origin" revision="android-dev-p0.ac8257" sync-j="4"/>
  11. <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)编写批量上传代码的脚本

  1. #!/usr/bin/python3
  2. #####running: getnames_and_init_push_git_proj.py default.xml
  3. import os
  4. import sys
  5. #remote = 'git@127.0.0.1:rk3229'
  6. #git@172.168.1.63/home/git/Project/8227L_project
  7. ##remote = 'git@172.168.1.63:atc/android/o'
  8. remote = 'git@172.168.1.63:/home/git'
  9. #remote = 'ssh://b_flyaudio001@release.autochips.com:29418'
  10. #remote = 'ssh://b_flyaudio001@release.autochips.com:29418'
  11. if len(sys.argv) == 1:
  12. print('错误!请传入 xml 文件')
  13. elif len(sys.argv) > 2:
  14. print('错误!传入参数太多')
  15. else:
  16. print('传入的文件是 %s' % sys.argv[1])
  17. with open(sys.argv[1], 'r') as fin:
  18. while True:
  19. linestr = fin.readline()
  20. if linestr == '': #表示文件结束
  21. break
  22. #####for project-list.txt
  23. #else:
  24. #print(linestr)
  25. #localpath = sys.path[0] + '/' + linestr # git工程的本地绝对路径
  26. #remotepath = remote + '/' + linestr # git工程远程相对路径
  27. #cmd = 'cd %s && git remote set-url autochips %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
  28. #print(cmd)
  29. #os.system(cmd)
  30. #end for project-list.txt
  31. print(linestr)
  32. #下面开始对本行内容分析
  33. if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行内容含有name信息
  34. #print(linestr)
  35. #先无条件提取name路径
  36. charistr1 = 'name="'
  37. charistr2 = '"'
  38. namestr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  39. if 'path=' in linestr: #如果path存在则用path的路径作为本地路径
  40. charistr1 = 'path="'
  41. charistr2 = '"'
  42. pathstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  43. else: #如果path不存在,则认为path路径(本地路径)就是name路径
  44. pathstr = namestr
  45. print('name="%s", path="%s"' % (namestr, pathstr))
  46. path_m = pathstr
  47. #if path_m == 'autochips': #路径等于origin,那么不创建
  48. if path_m == 'origin': #路径等于origin,那么不创建
  49. print(path_m)
  50. else:
  51. #下面开始初始化并提交git工程
  52. localpath = sys.path[0] + '/' + pathstr # git工程的本地绝对路径
  53. remotepath = remote + '/' + namestr # git工程远程相对路径
  54. print('localpath="%s"' %localpath)
  55. print('remotepath="%s"' %remotepath)
  56. #判断本地目录是否为空,为空的话则新建一个文件,空目录会导致git提交失败
  57. if os.path.exists(localpath): #目录存在上传文件
  58. #cmd = 'touch %s/._USELESSFILE_' % (localpath)
  59. #cmd = 'touch %s/.gitignore' % (localpath)
  60. print(localpath)
  61. #os.system(cmd)
  62. if not os.listdir(localpath): # 本地目录为空
  63. cmd = 'touch %s/.gitignore' % (localpath)
  64. print(localpath)
  65. #print('localpath NULL="%s"' %localpath)
  66. #print('localpath NULL cmd="%s"' %cmd)
  67. print(cmd)
  68. os.system(cmd)
  69. #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])
  70. #cmd = 'cd %s && git remote set-url autochips %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
  71. #print(remotepath)
  72. #cmd = 'cd %s && git remote set-url autochips %s && cd %s' % (localpath, remotepath, sys.path[0])
  73. #cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0])
  74. #cmd = 'cd %s && git remote remove origin && cd %s' % (localpath, sys.path[0]) ##如果代码库中有origin的远程指向将移除origin
  75. #print(cmd)
  76. #os.system(cmd)
  77. #代码下载之后没切换分支,先切换分支
  78. ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
  79. ##print(cmd)
  80. ##os.system(cmd)
  81. #添加remote为origin 指向我们的git 服务器地址
  82. cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
  83. print(cmd)
  84. os.system(cmd)
  85. ##开始批量上传代码
  86. cmd = 'cd %s && git push -u origin android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
  87. print(cmd)
  88. os.system(cmd)
  89. else: #目录不存在不上传
  90. print(localpath)
  91. #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])
  92. #print(cmd)
  93. #os.system(cmd)

以上脚本中的关键代码:

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

在以上上传基础上修改如下:

  1. #!/usr/bin/python3
  2. #####running: getnames_and_init_push_master_proj.py default.xml
  3. import os
  4. import sys
  5. #remote = 'git@127.0.0.1:rk3229'
  6. #git@172.168.1.63/home/git/Project/8227L_project
  7. ##remote = 'git@172.168.1.63:atc/android/o'
  8. remote = 'git@172.168.1.63:/home/git'
  9. #remote = 'ssh://b_flyaudio001@release.autochips.com:29418'
  10. #remote = 'ssh://b_flyaudio001@release.autochips.com:29418'
  11. if len(sys.argv) == 1:
  12. print('错误!请传入 xml 文件')
  13. elif len(sys.argv) > 2:
  14. print('错误!传入参数太多')
  15. else:
  16. print('传入的文件是 %s' % sys.argv[1])
  17. with open(sys.argv[1], 'r') as fin:
  18. while True:
  19. linestr = fin.readline()
  20. if linestr == '': #表示文件结束
  21. break
  22. print(linestr)
  23. #下面开始对本行内容分析
  24. if (('name=' in linestr) or ('name =' in linestr)) and (('project' in linestr) or ('path' in linestr)): #本行内容含有name信息
  25. #print(linestr)
  26. #先无条件提取name路径
  27. charistr1 = 'name="'
  28. charistr2 = '"'
  29. namestr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  30. if 'path=' in linestr: #如果path存在则用path的路径作为本地路径
  31. charistr1 = 'path="'
  32. charistr2 = '"'
  33. pathstr = linestr[linestr.index(charistr1)+len(charistr1) : linestr.index(charistr1)+len(charistr1)+ linestr[linestr.index(charistr1)+len(charistr1):].index(charistr2)]
  34. else: #如果path不存在,则认为path路径(本地路径)就是name路径
  35. pathstr = namestr
  36. print('name="%s", path="%s"' % (namestr, pathstr))
  37. path_m = pathstr
  38. #if path_m == 'autochips': #路径等于origin,那么不创建
  39. if path_m == 'origin': #路径等于origin,那么不创建
  40. print(path_m)
  41. else:
  42. #下面开始初始化并提交git工程
  43. localpath = sys.path[0] + '/' + pathstr # git工程的本地绝对路径
  44. remotepath = remote + '/' + namestr # git工程远程相对路径
  45. print('localpath="%s"' %localpath)
  46. print('remotepath="%s"' %remotepath)
  47. #判断本地目录是否为空,为空的话则新建一个文件,空目录会导致git提交失败
  48. if os.path.exists(localpath): #目录存在上传文件
  49. print(localpath)
  50. if not os.listdir(localpath): # 本地目录为空
  51. cmd = 'touch %s/.gitignore' % (localpath)
  52. print(localpath)
  53. #print('localpath NULL="%s"' %localpath)
  54. #print('localpath NULL cmd="%s"' %cmd)
  55. print(cmd)
  56. os.system(cmd)
  57. #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])
  58. #cmd = 'cd %s && git remote set-url autochips %s &&git push -u autochips android-trunk-o1.ac8227L && cd %s' % (localpath, remotepath, sys.path[0])
  59. #print(remotepath)
  60. #cmd = 'cd %s && git remote set-url autochips %s && cd %s' % (localpath, remotepath, sys.path[0])
  61. #cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0])
  62. #cmd = 'cd %s && git remote remove origin && cd %s' % (localpath, sys.path[0]) ##如果代码库中有origin的远程指向将移除origin
  63. #print(cmd)
  64. #os.system(cmd)
  65. #代码下载之后没切换分支,先切换分支
  66. ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
  67. ##print(cmd)
  68. ##os.system(cmd)
  69. #添加remote为origin 指向我们的git 服务器地址
  70. ##cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
  71. ##print(cmd)
  72. ##os.system(cmd)
  73. ##开始批量上传代码
  74. cmd = 'cd %s && git push -u origin android-dev-p0.ac8257:masetr && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
  75. print(cmd)
  76. os.system(cmd)
  77. else: #目录不存在不上传
  78. print(localpath)
  79. #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])
  80. #print(cmd)
  81. #os.system(cmd)

关键脚本如下:

  1. ####3.2.3中在上传完成android-dev-p0.ac8257分支之后,再单独批量上传master分支,master分支和android-dev-p0.ac8257分支指向同一个节点:
  2. #代码下载之后没切换分支,先切换分支
  3. ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
  4. ##print(cmd)
  5. ##os.system(cmd)
  6. #添加remote为origin 指向我们的git 服务器地址
  7. ##cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
  8. ##print(cmd)
  9. ##os.system(cmd)
  10. ##开始批量上传代码并创建master分支
  11. cmd = 'cd %s && git push -u origin android-dev-p0.ac8257:master && cd %s' % (localpath, sys.path[0]) ###批量上传代码库
  12. print(cmd)
  13. os.system(cmd)
  14. 3.2.2中可以一次到位,如下脚本:
  15. ##cmd = 'cd %s && git checkout -b android-dev-p0.ac8257 autochips/android-dev-p0.ac8257 && cd %s' % (localpath, sys.path[0]) ##将所有子库分支切出来
  16. ##print(cmd)
  17. ##os.system(cmd)
  18. #添加remote为origin 指向我们的git 服务器地址
  19. cmd = 'cd %s && git remote add origin %s && cd %s' % (localpath, remotepath, sys.path[0]) ##添加origin的远程指向,指向我们的代码服务器
  20. print(cmd)
  21. os.system(cmd)
  22. ##开始批量上传代码并创建master分支
  23. 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]) ###批量上传代码库
  24. print(cmd)
  25. 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. 1、单独下载android-dev-p0.ac8257分支
  2. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ repo init -u git@172.168.1.63:atc/android/p/manifest -b android-dev-p0.ac8257
  3. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257r$ repo sync -c
  4. 2、所有分支全部下载,下载完成后自己切换分支,如下:
  5. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ repo init -u git@172.168.1.63:atc/android/p/manifest
  6. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ repo sync
  7. 我们使用第一种,因为方便同步ATC的代码,我们不使用3.2.3批量上传master分支的方法(这种方法在我们中间代码库(BSP厂家代码服务器拉的库,它同时指向BSP厂家服务器和我们自己的git服务器)),我们将在下载编译OK之后,使用拉我们服务器(git@172.168.1.63:atc/android/p/manifest)ropo代码库到本地,然后使用
  8. repo forall -c "git push origin android-dev-p0.ac8257:master"的方式创建master分支

在代码编译过程中提示以下信息:

  1. FAILED: out/target/product/k61v1_demo_64_bsp/obj/PACKAGING/systemimage_intermediates/system.img
  2. /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 ) )"
  3. crc and md5 generate start
  4. out/target/product/k61v1_demo_64_bsp/lk.bin
  5. out/target/product/k61v1_demo_64_bsp/recovery.img
  6. out/target/product/k61v1_demo_64_bsp/boot.img
  7. out/target/product/k61v1_demo_64_bsp/logo.bin
  8. out/target/product/k61v1_demo_64_bsp/system
  9. cal system file crc begin
  10. cal_system_file_crc in_dir:out/target/product/k61v1_demo_64_bsp/system
  11. Traceback (most recent call last):
  12. File "./build/tools/releasetools/rootcheck.py", line 321, in <module>
  13. main(sys.argv[1:])
  14. File "./build/tools/releasetools/rootcheck.py", line 295, in main
  15. cal_system_file_crc(file_count,in_dir)
  16. File "./build/tools/releasetools/rootcheck.py", line 215, in cal_system_file_crc
  17. frb.close()
  18. UnboundLocalError: local variable 'frb' referenced before assignment
  19. ninja: build stopped: subcommand failed.
  20. 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软连接动作

  1. 修改:build\make\core\Makefile
  2. # Create symlink /system/vendor to /vendor if necessary.
  3. ifdef BOARD_USES_VENDORIMAGE
  4. define create-system-vendor-symlink
  5. $(hide) if [ -d $(TARGET_OUT)/vendor ] && [ ! -h $(TARGET_OUT)/vendor ]; then \
  6. echo 'Non-symlink $(TARGET_OUT)/vendor detected!' 1>&2; \
  7. echo 'You cannot install files to $(TARGET_OUT)/vendor while building a separate vendor.img!' 1>&2; \
  8. exit 1; \
  9. fi
  10. ##$(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))
  11. endef
  12. else
  13. define create-system-vendor-symlink
  14. $(hide) ln -sf /vendor $(TARGET_OUT)/vendor //在这里添加这行,在有vendor.img时脚本根本跑不到这里
  15. endef
  16. endif
  17. # Create symlink /system/product to /product if necessary.
  18. ifdef BOARD_USES_PRODUCTIMAGE //这个是没有定义的,即可没有prodect.img编译,所以根本就跑不到以下代码
  19. define create-system-product-symlink
  20. $(hide) if [ -d $(TARGET_OUT)/product ] && [ ! -h $(TARGET_OUT)/product ]; then \
  21. echo 'Non-symlink $(TARGET_OUT)/product detected!' 1>&2; \
  22. echo 'You cannot install files to $(TARGET_OUT)/product while building a separate product.img!' 1>&2; \
  23. exit 1; \
  24. fi
  25. $(hide) ln -sf /product $(TARGET_OUT)/product
  26. endef
  27. else //没有product.img编译就直接退出,不做任何操作
  28. define create-system-product-symlink
  29. endef
  30. endif

以上方法编译之后,如果系统不能正常启动到主界面,请使用第二种方法.

方法二:修改build\make\tools\releasetools\rootcheck.py

  1. def cal_system_file_crc(file_count,in_dir):
  2. value=-1
  3. global ENCRYPT_KEY
  4. key=ENCRYPT_KEY
  5. number=0
  6. crc=0
  7. fo=open(file_count,"w")
  8. fo.write(str(value))
  9. fo.write("\t")
  10. fo.write("file_number_in_system_dayu")
  11. fo.write("\t")
  12. fo.write(str(fileCountIn(in_dir)))
  13. fo.write("\n")
  14. for root, dirs, files in os.walk(in_dir):
  15. for file in files:
  16. crc32=0
  17. #mymd5=hashlib.md5()
  18. if file=="file_count":
  19. continue
  20. if os.path.isfile(os.path.join(root,file)) and not os.path.islink(os.path.join(root,file)):
  21. #crc32 = binascii.crc32((os.path.join(root,file)))+crc32
  22. mymd5=hashlib.md5()
  23. frb=open(os.path.join(root,file),'rb')
  24. while True:
  25. tmp=frb.read(4*1024)
  26. if tmp=='':
  27. break
  28. crc32 += fileCRC32(os.path.join(root,file),crc32,tmp)
  29. mymd5.update(tmp)
  30. #print("%x" %(crc32&0xffffffff))
  31. #print ("%s:0x%x \n" %(os.path.join(root,file),crc32&0xffffffff))
  32. crc32=crc32&0xffffffff ###这行开始
  33. fo.write(str(number))
  34. fo.write("\t")
  35. filepath=encrypt(key,os.path.join(root,file))
  36. fo.write(filepath)
  37. fo.write("\t")
  38. filecrc=encrypt(key,crc32)
  39. fo.write(filecrc)
  40. fo.write("\t")
  41. if not os.path.islink(os.path.join(root,file)):
  42. filemd5=encrypt(key,mymd5.hexdigest())
  43. else:
  44. filemd5=encrypt(key,0)
  45. fo.write(filemd5)
  46. fo.write("\n")
  47. number+=1
  48. frb.close() ##这行结束的代码段tab缩进符必须跟frb=open(os.path.join(root,file),'rb')语句保持一致
  49. crc=crc+crc32 ##缩进一个tab键
  50. crc=crc&0xffffffff
  51. fo.close()

主要原因我有些环境python工具对python脚本语法检查很严格,tab键的缩进符不对导致局部变量在外层引用而导致错误。经过验证,方法二修改是OK的。

编译方式:

  1. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ source ./build/envsetup.sh
  2. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ lunch full_k61v1_demo_64_bsp-userdebug
  3. zhaojr@zhaojr-OptiPlex-7040:~/project/test_mt8257$ ./allmake.sh -p k61v1_demo_64_bsp

编译完成后使用flashtools下载编译后的代码,在BSP厂家开发板上验证是否OK,BSP厂家一般会给release_image,可以对比这个release_image进行 验证,也可以直接下载BSP包,编译后对比进行验证即可。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/636757
推荐阅读
相关标签
  

闽ICP备14008679号