先把大牛的文章连接丢过来
http://nicekwell.net/blog/20171112/ba-yi-you-de-repogong-cheng-ti-jiao-dao-fu-wu-qi.html。
我遇到的情况跟大牛遇到的不大一样,
对方给我们源码的时候把.repo文件夹给删除了,代码里面留了茫茫然多的.git和.gitignore。
结合大牛的教程,开始我自己的定制之旅。
服务器端创建manifest.git工程
每个repo工程都会有一个 manifest.git 工程,此工程内容就是 manifest.xml 文件,manifest.xml文件记录了各个git子工程的信息。
我们在服务器创建一个 manifest.git 工程就是用于存放我们自己的 repo 工程的manifest.xml文件。
一般放在大工程目录下。
git init --bare /home/git/[工程目录]/manifest.git
客户端修改并上传manifest.xml文件
1、把刚刚创建的manifest.git工程拖下来
git clone git@[ip]:[proj]/manifest.git
2、客户提供的代码基于android-7.1.2_r36,所以先到谷歌AOSP上找对应的branch。
On branch default
Your branch is up-to-date with 'origin/android-7.1.2_r36'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: default.xml
no changes added to commit (use "git add" and/or "git commit -a")
lei@lei-pc:~/code/google/android-7.1.2_r36/.repo/manifests$ git diff
diff --git a/default.xml b/default.xml
index 5fc6b95..2932e4c 100644
--- a/default.xml
+++ b/default.xml
@@ -4,8 +4,9 @@
<remote name="aosp"
fetch=".."
review="https://android-review.googlesource.com/" />
- <default revision="refs/tags/android-7.1.2_r36"
- remote="aosp"
+ <remote fetch="." name="origin"/>
+ <default revision="master"
+ remote="origin"
sync-j="4" />
<project path="build" name="platform/build" groups="pdk" >
3、提交default.xml文件。
服务端分析manifest.xml文件,批量创建工程
获取到manifest.xml文件的所有name信息(代表所有git子工程),然后用脚本批量创建git工程。
1、把上面的default.xml文件用scp上传到服务端,放到工程目录下。
2、进入大工程目录,用 getnames_and_create_project.py 脚本分析 default.xml文件,并创建工程:
用这个脚本:getnames_and_create_project.py
./getnames_and_create_project.py default.xml
脚本执行完成后会新建很多目录出来:
客户端分析manifest.xml文件,批量上传到服务器
刚刚在服务器上已经创建好了各个git子工程,这里把它们上传。
分析manifest.xml文件,获取到所有name信息(代表所有git子工程),然后用脚本批量上传git子工程。
1、进入上面创建好的干净的工程目录,把上面建立好的default.xml文件复制到这里。
2、把客户端的id_rsa.pub加入到服务端的 authorized_keys里。
3、进入大工程目录,客制化以下脚本:getnames_and_init_push_git_proj.py
该脚本我在原作者的基础上有修改,增加的如下代码:
if not os.path.exists(localpath)
cmd = 'mkdir -p %s' % (localpath)
print(cmd)
os.system(cmd)
大概原因是default.xml中有一些并没有默认启用,比如下面这些:
<project path="tools/idea" name="platform/tools/idea" groups="notdefault,tools" />
<project path="tools/loganalysis" name="platform/tools/loganalysis" groups="notdefault,tradefed" />
<project path="tools/motodev" name="platform/tools/motodev" groups="notdefault,motodev" />
<project path="tools/studio/cloud" name="platform/tools/studio/cloud" groups="notdefault,tools" />
修改这里的远程地址,后面会把工程提交到这里。
这里的地址应当和上面服务器端建立工程的地址相同。
4、运行脚本
./getnames_and_init_push_git_proj.py default.xml
此脚本会解析default.xml里的name和path,
会先分析本地path是否为空目录,如果是空目录的话则会创建一个“.gitignore”文件,防止空目录提交失。
然后初始化本地path路径的代码,作为git工程提交到服务器端的name指定路径下。
测试
找一个干净的地方,用 repo init -u [服务端manifest.git地址],
然后 repo sync,此时应该可以同步所有git子工程。