随着git项目越来越多,每次环境部署的时候,不可能一个一个去clone仓库,这样太费事了。为了偷懒,我借鉴了android的repo机制,这样可以自行对自己的git仓库搭建一个简单的repo,之后使用这个repo就能方便的管理多个git仓库了。
git clone https://gerrit.googlesource.com/git-repo
由于repo会把repo url默认到
这里需要本地git地址。也可修改成gitlab地址。如下
REPO_URL = 'http://ip/git-repo.git'
git init --bare manifests.git git clone /root/work2/git/manifests.git vim manifests.git <?xml version="1.0" encoding="UTF-8"?> <manifest> <remote fetch="ssh://root@172.25.130.31/root/work2/git" name="origin"/> <default remote="origin" revision="master" sync-j="4"/> <project name="test1" path="test1"/> <project name="test2" path="test2"/> <project name="test3" path="test3"/> </manifest> git add . && git commit -m "first commit" && git push
这里通过编写xml,设置远端的git仓库为root@172.25.130.31/root/work2/git, 远端的分支名字为origin,默认的remote为origin,版本分支为master,一共三个工程,分别为test1 test2 test3,并在本地创建同样的目录名字。
这样即可编写一个最简单的manifests.xml。后续可以使用这个xml来管理整个git仓库
repo init -u root@172.25.130.31:/root/work2/git/manifests.git repo sync
此时可以看到三个仓库被正常的拉取
[root@localhost 3]# ls test1 test2 test3
在repo不断更新的过程中,可以生成快照,实际上就是生成一个xml文件,它保持了当时的repo状态,可供其他人使用。
这个类似于git tag。当需要整体出一个版本的时候,可以直接生成快照。
repo manifest -r -o tag_v1.0.xml <?xml version="1.0" encoding="UTF-8"?> <manifest> <remote fetch="ssh://root@172.25.130.31/root/work2/git" name="origin"/> <default remote="origin" revision="master" sync-j="4"/> <project dest-branch="master" name="test1" revision="831a146ccf46fe060c74f15354e9d68c3e0afbcb" upstream="master"/> <project dest-branch="master" name="test2" revision="829b53cce4538d5ae5919bc42bea7254bc1dcd9b" upstream="master"/> <project dest-branch="master" name="test3" revision="750f8d272da0b85a7bb7c42427fe9f0c72d416be" upstream="master"/> </manifest>
这里就比较显而易见了,快照保持了每个分支的分支信息,commit信息和上游信息
查看分支状态
repo status
为某个分支创建新的branch
repo start bug_1.2 test1
上面这个命令等同于
git checkout -b bug_1.4
查看分支信息
repo branch
查看所有分支的diff
repo diff
默认的xml头
<?xml version="1.0" encoding="UTF-8"?>
顶层manifest元素
<manifest> </manifest>
<remote /> name 这里的name是git remote的那个远程名字,默认是origin。如果是git的remote是其他的,这里填写对应即可 fetch 这里是git的地址,如果是ssh可以是:ssh://root@172.25.130.31/root/work2/git 如果是http或者git,就是github/gitlab上的地址 pushurl 这里是push的地址,当指定该属性的时候,这个值会和<project>标签中的name属性拼成完整的push url路径,这样当我们使用git push命令的时候,就会使用该url。如果不指定该属性,则pushurl和fetch一样。 revision 这里是默认的git branch名字。可以是master或者其他
<default /> remote 这里是remote设置的名字,代表repo拉的分支默认使用哪个remote上的 revision 当一个<project>不指定revision的时候使用该值 dest-branch 默认创建的本地分支,如果不指定,就是revision默认创建的分支 sync-j repo sync的并行数目 sync-c 如果设置为true,则只同步指定的分支(revision 属性指定),而不是所有的ref内容 sync-s 如果设置为true,则会同步git的子项目 sync-tags
<project /> name: 这里是工程名也就是哪个仓库 ${remote_fetch}/${project_name}.git path: 显式声明的存放文件路径 remote: 这里指定的远程分支名字 revision: 这里指定需要获取的git提交点,可以是master, refs/heads/master, tag或者SHA-1值。如果不设置的话,默认下载当前project,当前分支上的最新代码。 upstream: 在哪个git分支可以找到一个SHA1。用于同步revision锁定的manifest(-c 模式
xml可以直接include子xml。通过如下方式 <manifest> <include name="default.xml" /> </manifest>
<project name="test1" path="test1"> <linkfile dest="Readme" src="Readme"/> <copyfile dest="Readme.md1" src="Readme.md"/> </project>
在project下面设置可以设置软连接和拷贝。实际上等效于如下
ln -s test1/Readme Readme cp test1/Readme.md Readme.md1 ``` ## 参考链接 ``` https://gerrit-googlesource.proxy.ustclug.org/git-repo https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md ```