参考自:搭建repo服务器管理多个git工程
repo系列讲解 —— Android系统源码(AOSP)下载
Android使用git作为代码管理工具,开发了gerrit进行代码审核,以便更好的对代码进行集中式管理。还开发了repo命令行工具,对git部分命令进行封装,将百多个git库有效的组织。
鉴于repo能够管理多个git库,针对一个项目需要多个git库分开管理,使用repo就非常方便。如嵌入式项目一般由uboot、kernel、文件系统rootfs、用户程序等组成。这里就以这样的项目组织来搭建repo服务器。
├── kernel
│ └── linux-3.5.y
├── rootfs
│ └── rootfs
├── uboot
│ └── uboot-2018.11
└── userdata
└── UartTest
服务器:https://git.haier.net
账户:ihaier工号和门户密码
git-repo下载可在服务器端通过以下任一方式下载。
git clone https://gerrit.googlesource.com/git-repo (谷歌官方源)
git clone https://mirrors.tuna.tsinghua.edu.cn/git/git-repo (国内清华源)
git clone https://gerrit-googlesource.lug.ustc.edu.cn/git-repo (国内中科大源)
将下载的git-repo切换到master分支,然后进行下面的修改。
此处修改的目的:在客户端上通过repo拉取服务器端代码时,避免 repo 从git-repo源码中拷贝过来,而是让其从我们的服务器上拷贝过来,这样既省时又稳定。
注意:也可在客户端下载repo,进行相应修改后上传服务器端。
将下载的 repo安装到您linux账号的环境变量的路径下,推荐安装到/usr/bin/目录,由于写入/usr/bin/目录需要管理员权限,这需要您的linux账号拥有管理员权限。
sudo cp git-repo-haier/repo /usr/bin/repo #此处需确保repo有执行权限
<manifest>
<remote name="origin"
fetch="../../.."
review="https://git.haier.net:18022/zhjdn_ai/aiot_terminal" />
<default revision="master"
remote="origin"
sync-j="4" />
<project path="Haier-x30-tina/tina3.5/build" name="os/tina3.5/build" groups="tina3.5" >
<copyfile src="top_main.mk" dest="Haier-x30-tina/tina3.5/Makefile" />
<copyfile src="rules.mk" dest="Haier-x30-tina/tina3.5/rules.mk" />
project>
<project path="Haier-x30-tina/tina3.5/config" name="os/tina3.5/config" groups="tina3.5" >
<copyfile src="top_config.in" dest="Haier-x30-tina/tina3.5/Config.in" />
project>
<project path="Haier-x30-tina/tina3.5/dl" name="os/tina3.5/dl" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/docs" name="os/tina3.5/docs" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/lichee/brandy-2.0/tools" name="os/tina3.5/lichee/brandy-2.0/tools" groups="tina3.5" >
<copyfile src="build.sh" dest="Haier-x30-tina/tina3.5/lichee/brandy-2.0/build.sh" />
project>
<project path="Haier-x30-tina/tina3.5/lichee/brandy-2.0/u-boot-2018" name="os/tina3.5/lichee/brandy-2.0/u-boot-2018" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/lichee/linux-4.9" name="os/tina3.5/lichee/linux-4.9" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/package" name="os/tina3.5/package" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/prebuilt" name="os/tina3.5/prebuilt" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/scripts" name="os/tina3.5/scripts" groups="tina3.5" >
<copyfile src="clean_kernel.sh" dest="Haier-x30-tina/tina3.5/clean_kernel.sh" />
<copyfile src="rebuild.sh" dest="Haier-x30-tina/tina3.5/rebuild.sh" />
project>
<project path="Haier-x30-tina/tina3.5/target" name="os/tina3.5/target" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/toolchain" name="os/tina3.5/toolchain" groups="tina3.5" />
<project path="Haier-x30-tina/tina3.5/tools" name="os/tina3.5/tools" groups="tina3.5" />
<project path="x30_uaibot_app/aibot-x30" name="app/x30/aibot-x30" groups="x30" />
<project path="ota_pack_tool" name="tools/ota_pack_tool" groups="tools" />
manifest>
● remote标签: 包含一些远程仓库的一些信息
(1) name:远程仓库在本地的别名,可以理解为讲解git仓库时提到的origin
(2) fetch:项目名称的前缘,在构造项目仓库远程地址时使用到
(3) review:code review的服务器地址
● default标签: 默认标签,下面的
(1) revision:repo init -b的时候指定的分支或tag,默认是master分支。当然如果直接在manifests里切换分支并git pull,这里也会相应改变。
(2) remote:对应上面的
(3) sync-j:指定同步工作的并行数量,个人理解最大数不宜超过cpu的线程数
(4) sync-c:【sync-c=“true”】代表repo sync的时候只同步revision指定的分支或tag
● project标签: 每个
(1) path:源码库下载后存放的本地路径
(2) name:远程仓库的名称
以3.1图中tina3.5目录下build仓库为例,其他仓库同理。
cd tina3.5/build
git init
git add . -A
git commit -s -m "add initial code"
git remote add origin https://git.haier.net/zhjdn_ai/aiot_terminal/os/tina3.5/build.git
git branch -M master #此步可有可无,作用是将当前分支重命名为master
git push -uf origin master
在客户端上repo拉取服务器端代码
mkdir Haier-X30-Project
cd Haier-X30-Project
repo init -u ssh://[email protected]:18022/zhjdn_ai/aiot_terminal/tools/git_repo/r328_tina/manifest.git -b master -m x30-default.xml
repo sync
repo start master --all # 全部下载完成之后,创建分支
repo init 参数
-u
: 指定项目清单库的url地址
-m
: 指定使用哪个项目清单文件
-b
: 指定具体的分支,默认情况下指定master分支
--repo-url
: 指定repo库的url地址
--config-name
: 指定访问服务器的用户名和邮箱。这个选项后面不接内容,运行的时候会提示你输入用户名和邮箱
.
repo init主要有两部分工作:下载两个git管理的仓库(repo库和manifest库)。
repo库: 主要存放一些python脚本,配合之前说的repo脚本来共同管理众多源码仓库;
manifest库: 项目清单库,用来管理各个版本的清单文件。
用法:
repo forall -c "命令" #不限于repo或者git的命令,其他shell命令也可以,例如ls,pwd等。
举例: 恢复用repo管理的系统源码
repo forall -c "git clean -df" && repo forall -c "git checkout ."
git打tag命令:
git tag -a TAG_NAME -m "add tag TAG_NAME"
我们在此版本上打上标签为TINY4412_V1.0.0,命令如下
repo sync
repo forall -pv -c "git tag -a TINY4412_V1.0.0 -m "add tag TINY4412_V1.0.0""
repo forall -pv -c "git push origin TINY4412_V1.0.0"
用法:
repo help 命令选项
举例: 查看repo forall的使用帮助
repo help forall
Options:
-h, --help show this help message and exit
-r, --regex Execute the command only on projects matching regex or
wildcard expression
-i, --inverse-regex Execute the command only on projects not matching
regex or wildcard expression
-g GROUPS, --groups=GROUPS
Execute the command only on projects matching the
specified groups
-c, --command Command (and arguments) to execute
-e, --abort-on-errors
Abort if a command exits unsuccessfully
--ignore-missing Silently skip & do not exit non-zero due missing
checkouts
Output:
-p Show project headers before output
-v, --verbose Show command error messages
-j JOBS, --jobs=JOBS
number of commands to execute simultaneously