1. 程式人生 > >如何使用repo管理本地倉庫

如何使用repo管理本地倉庫

目錄

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 pub key拷貝到了該git賬戶下. 我們後續的所有實驗, 都是針對本地的git倉庫實施的. 實際搭建倉庫的時候需要根據遠端伺服器的具體地址進行修改, 這裡不再贅述.

使用repo需要事先建立兩個倉庫, 一個用來管理repo程式碼本身, 另一個管理manifests檔案.

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 [email protected]:/home/git/repo-test/git-repo.git

接下來需要編寫manifest檔案, repo要根據這個檔案的資訊來管理所有git倉庫. 首先需要將前面建好的manifests倉庫clone下來, 並在裡面建立default.xml檔案.

git clone [email protected]:/home/git/repo-test/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"後的路徑, name指的是倉庫的原始名.

另外, remote項指的是manifests倉庫的地址. name指代遠端倉庫名, fetch指的是url. 這裡fetch可以寫絕對路徑, 也可以寫相對路徑. 如果你在伺服器上的程式碼倉庫, manifests倉庫與repo倉庫都在同一級目錄下(這也是常見做法), 那麼fetch地址可以寫".". 代表在manifests倉庫所在的當前目錄下尋找其他project倉庫. repo會自己拼湊出正確的project倉庫路徑.

到目前為止, 我們自己搭建的repo倉庫就已經可以使用了, 嘗試sync一下,

repo init -u [email protected]:/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簽名過期, 然後無法繼續了. 原因是作者魔改後增加了一個新的tag, 並打上了自己的gpg簽名. 然後這個簽名使用的令牌是有期限的, 不幸的是到目前為止, 這個簽名已經expired了. 因此在git clone時會verify tag signature failed, 導致clone失敗.

解決的辦法很簡單, 就是重新制作一個簽名, 用新簽名打一個全新的tag上去.

1. 首先要安裝gpg, 這個就不贅述了.

2. 然後生成新的gpg key

[[email protected] ~]$ 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) <[email protected]>"

真實姓名:vector03
電子郵件地址:[email protected]
註釋:
您選定了這個使用者標識:
    “vector03 <[email protected]>”

更改姓名(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 <[email protected]>
sub   2048R/549EE107 2018-10-16

 這裡生成了新的gpg金鑰, 金鑰id為924C9914.

3. 將gpg金鑰環匯出, 將下面的程式碼貼上到repo引導檔案裡, 原作者的令牌環下面即可.

[[email protected] ~/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

這樣就大功告成了.