如何使用repo管理本地私有仓库

目录

1. 引导脚本

2. 搭建仓库

3. repo without gerrit


1. 引导脚本

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/

2. 搭建仓库

有了引导脚本, 就可以搭建仓库了. 这里假设我们在本地已经有了一个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

 写入相应的内容, 并提交到远程,



  

  

  
  

 这里假设我们事先有了两个名为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

3. repo without gerrit

通常情况下, 这个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 天后过期
      w = 密钥在 n 周后过期
      m = 密钥在 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) "

真实姓名:vector03
电子邮件地址:[email protected]
注释:
您选定了这个用户标识:
    “vector03 ”

更改姓名(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 
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

这样就大功告成了.

 

 

你可能感兴趣的:(repo,git,代码仓库,代码管理)