赞
踩
目录
repo安装前需要首先下载引导脚本,
- mkdir ~/bin
- PATH=~/bin:$PATH
- curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
- chmod a+x ~/bin/repo
国内用户被GFW屏蔽的话, 可以使用清华大学tuna提供的git-repo镜像替代,
- curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o repo
- chmod +x repo
打开下载的引导脚本, 在开始可以找到如下信息,
- REPO_URL='https://code.google.com/p/git-repo/'
- REPO_REV='stable'
这个url是repo本身仓库的地址, 在后续执行"repo init" 的时候会先clone这个仓库. 我们这里可以先将它clone下来, 以便后续将这个仓库推送到自己本地建立的repo仓库里(如果前面下载的是tuna的repo镜像, 这里的url就不是google的地址).
git clone --bare https://code.google.com/p/git-repo/
有了引导脚本, 就可以搭建仓库了. 这里假设我们在本地已经有了一个git账户, 而且已经将当前账户的ssh public key拷贝到了该git账户下. 我们后续的所有实验, 都是针对本地的git仓库实施的. 实际搭建仓库的时候需要根据远程服务器的具体地址进行修改, 这里不再赘述.
使用repo需要事先建立两个仓库, 一个用来管理repo代码本身, 另一个管理manifest文件.
- mkdir git-repo.git
- cd git-repo.git
- git init --bare
-
- mkdir manifests.git
- cd manifests.git
- git init --bare
现在我们可以将之前clone好的repo代码仓库, 迁移到我们自己建立的git-repo仓库里.
- cd git-repo.git
- git push --mirror git@localhost:/home/git/repo-test/git-repo.git
接下来需要编写manifest文件, repo要根据这个文件的信息来管理所有git仓库. 首先需要将前面建好的manifest仓库clone下来, 并在里面建立default.xml文件.
- git clone git@localhost:/home/git/repo-test/manifests.git
- cd manifests.git
- touch default.xml
写入相应的内容, 并提交到远程,
- <?xml version="1.0" encoding="UTF-8"?>
- <manifest>
- <remote name="origin"
- fetch="." />
-
- <default remote="origin"
- revision="master" />
-
- <project path="repo-demo/foo" name="foo" />
- <project path="repo-demo/bar" name="bar" />
- </manifest>
这里假设我们事先有了两个名为foo.git和bar.git的仓库. project项指的就是我们的仓库, path指的是执行"repo sync"后远程仓库被clone下来后的本地路径, name指的是仓库的原始名.
另外, remote项指的是manifests仓库的地址. name指代远程仓库名, fetch指的是url. 这里fetch可以写绝对路径, 也可以写相对路径. 如果你在服务器上的代码仓库, manifests仓库与repo仓库都在同一级目录下(这也是常见做法), 那么fetch地址可以写".", 表示在manifests仓库所在的目录下寻找其他project仓库. repo会自己拼凑出正确的project仓库url.
到目前为止, 我们自己搭建的repo仓库就已经可以使用了, 尝试sync一下,
- repo init -u git@localhost:/home/git/repo-test/manifests.git
- repo sync
- repo start master --all
通常情况下, 这个repo仓库已经可以正常工作了, 但是对于某些人来说还是存在一个小瑕疵. 因为repo是google用来对AOSP项目进行管理的, 代码提交需要用到gerrit进行审核. 如果你不使用repo的提交功能, 即"repo upload"倒也无所谓. 但是如果使用的话, repo会将代码先提至gerrit. 然而某些情况下, 我们的私有项目不见得使用gerrit审核提交, 或者干脆不使用任何审核工具, 这样repo的批量提交功能就没法用了.
解决的方法是使用某些改造过的repo版本, 例如提供额外的"repo push"功能, 可以替代"repo upload"直接上传代码. 在github上就有类似的项目, https://github.com/ossxp-com/repo/
我们可以下载这个修改过的引导脚本, 并clone该repo仓库,
curl https://raw.githubusercontent.com/ossxp-com/repo/master/repo > ~/bin/repo
但是, 这个项目也有点小问题, 就是当你执行"repo init"的时候, 会提示你gpg签名过期, 然后无法继续了. 原因是作者在修改后增加了一个新的git tag, 并打上了自己的gpg签名, 然后这个签名使用的密钥是有期限的. 不幸的是到目前为止, 该签名已经expired了. 因此在git clone时会因为verify tag signature failed, 导致clone失败.
解决的办法很简单, 就是重新制作一个签名, 用新签名打一个全新的tag上去.
1. 首先要安装gpg, 这个就不赘述了.
2. 然后生成新的gpg key, 记住密钥最好选择永不过期.
- [devilmaycry@localhost ~]$ gpg --gen-key
- gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
- This is free software: you are free to change and redistribute it.
- There is NO WARRANTY, to the extent permitted by law.
-
- 请选择您要使用的密钥种类:
- (1) RSA and RSA (default)
- (2) DSA and Elgamal
- (3) DSA (仅用于签名)
- (4) RSA (仅用于签名)
- 您的选择?
- RSA 密钥长度应在 1024 位与 4096 位之间。
- 您想要用多大的密钥尺寸?(2048)
- 您所要求的密钥尺寸是 2048 位
- 请设定这把密钥的有效期限。
- 0 = 密钥永不过期
- <n> = 密钥在 n 天后过期
- <n>w = 密钥在 n 周后过期
- <n>m = 密钥在 n 月后过期
- <n>y = 密钥在 n 年后过期
- 密钥的有效期限是?(0)
- 密钥永远不会过期
- 以上正确吗?(y/n)y
-
- You need a user ID to identify your key; the software constructs the user ID
- from the Real Name, Comment and Email Address in this form:
- "Heinrich Heine (Der Dichter) <heinrichh@duesseldorf.de>"
-
- 真实姓名:vector03
- 电子邮件地址:mmzsmm@163.com
- 注释:
- 您选定了这个用户标识:
- “vector03 <mmzsmm@163.com>”
-
- 更改姓名(N)、注释(C)、电子邮件地址(E)或确定(O)/退出(Q)?o
- 您需要一个密码来保护您的私钥。
-
- 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
- 鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
- 我们需要生成大量的随机字节。这个时候您可以多做些琐事(像是敲打键盘、移动
- 鼠标、读写硬盘之类的),这会让随机数字发生器有更好的机会获得足够的熵数。
- gpg: 密钥 924C9914 被标记为绝对信任
- 公钥和私钥已经生成并经签名。
-
- gpg: 正在检查信任度数据库
- gpg: 需要 3 份勉强信任和 1 份完全信任,PGP 信任模型
- gpg: 深度:0 有效性: 2 已签名: 0 信任度:0-,0q,0n,0m,0f,2u
- pub 2048R/924C9914 2018-10-16
- 密钥指纹 = B491 7B9A D9BF CF18 32F3 308D 95DA F103 924C 9914
- uid vector03 <mmzsmm@163.com>
- sub 2048R/549EE107 2018-10-16
这里生成了新的gpg密钥, 密钥id为924C9914.
3. 将gpg密钥环导出, 将导出的代码粘贴到repo引导文件里, 位置在原作者的令牌环下面即可.
- [devilmaycry@localhost ~/repo-demo]$ gpg --armor --export 924C9914
- -----BEGIN PGP PUBLIC KEY BLOCK-----
- Version: GnuPG v2.0.22 (GNU/Linux)
-
- mQENBFvF1WkBCADhSfJ8gXO4utbYpLgn2AgF77XzMLWOupF97HkeSPN1qUBgaFxP
- zw/nnBU+g/vp0EPb3o3ZtSfjVVjYzP4DQwH2DU4ItrRcHXAPbQFvP/q3GwpAoAhV
- wfI6ppWTSXi3eCJ5faujqmpAz3KYRD/0lZ3hKiEzOQfbRG2EOZEHwXqcW9tx3E2b
- DYo0GWaIGj9GDGKPJjWzAJl3llevv3G8nl4oOZTrEjeELvU7OF0oeryzmiAcs4Qj
- CyHsEHhx2LKuTGvboHBYoouPL9Y0vebPaOkeZUhqHPv9mMX3ANyK1tIYHXHqASuL
- 6gEZrvWdq6zDvo1RRC52dbelQ8napUobVmq3ABEBAAG0GXZlY3RvcjAzIDxtbXpz
- bW1AMTYzLmNvbT6JATkEEwECACMFAlvF1WkCGwMHCwkIBwMCAQYVCAIJCgsEFgID
- AQIeAQIXgAAKCRCV2vEDkkyZFI+HB/9X2xJcuI1Z08uKuEQFKxp05kAbjHiTAUNK
- NN6xYZp4jOtnOfNEuWLDv0gn9QCZqofA6ztXjaWN9y83KyBsRLuVBJ5Ch3pguJsh
- /2IMSckb4ZIUY4R8EyXow5epx/gmZ6wZ5AfirSrboGSTJUjxOB6DrJ//wy+x25M5
- Rnv8qTbWSYSkoldlLWLtP2KjetgGMc3562D5fE6o4XV5OoTKKmUTrDMhgGl52Xdp
- QdTmgqI2l41FF9rVRFuEGblQRsuH4wPPR+Q3lBww4VjHEAzqEbYenOH6Wnj701OS
- B7rUJznpt41kgb4+T8ltLyIuZ7vVvgogeXjvQ+JK/iGGDMgjjEb8uQENBFvF1WkB
- CACkQcuO7cA9XDjAMDHFo8ikbq+3RMRrrCDVTB2ssfhoMGZb2HDFx692zBb5YRsB
- 4ZHhIRRsMyo2kyma7icLoMzgAvJkRqMuFpLogjRFZetPBRDHc6WWo5UWtym85+XS
- M/tbrrxv+OBA/Hi0I+xBLSzcdIr396swLQHrHEwVcp0r9Gu1vTwMNBKo9/+XbqUT
- LYIC6r+Xu29MeOTC6WnqM2aeKpu5H3z/+b7elZ3H+SJG1UajMGo+P7LEhQ+hjeXo
- Sv0BsTAP1ZGglzsxgntC+OQhD+RpcvFkrUV7cXWrQtKBmpffucpm0yGaVA+KL4JV
- PwJzWn6QggNy///ZryDH+UAtABEBAAGJAR8EGAECAAkFAlvF1WkCGwwACgkQldrx
- A5JMmRTC+QgArCCh7Mr0evLc91cFcqk5ZJaUR2eLuwymM9SaPUD+lIKW4FJb8Aoi
- wowCWB2RU8ZSmTAzKyvMSrzqejkM8bNOH0JnrvSYAbiEoTFCdsINpRZAwmmjOhi/
- xXtcPOiPliRswIj/9te8sOvs1rqgWwTLCNzIA9HxFAxP4qCN543xdzx+RwSJt4JI
- goULnrkJYNEjXc8z78ljDI3XLSz4NC2dpNaBOygR6KKl5w/kiGTqk8YKLYceeqgB
- 88dyZVTWI2Ear0TV06/tXcGZDU2hYDtt14HHlkjskipNF1pIf1gQJ6MPtc/abJ/V
- MBNq5NM2w2HJaSPdA05BRAClIhTA33gHaA==
- =DHIH
- -----END PGP PUBLIC KEY BLOCK-----
4. 最后用该密钥签名一个新的tag, 这里我们增加了一个名为v1.7.7.6-vector03的tag. 然后push修改后的repo仓库.
git tag -u 924C9914 -s v1.7.7.6-vector03 b5d66ba
这样就大功告成了.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。