Gerrit 帳號小註解

有些人應該也遇到過這個問題: 編 Android 的主機與 Gerrit 主機的帳號不一樣, 導致認證失敗. 前年我在 Gerrit 叫做 cashc, 但是我在編 code 的 Linux server 有時叫 cash, 有時叫 cashchou, 於是上述的冏事就發生了. 當時查了一些資料才搞定, 但這個痛過一年後就忘了, 連要用哪幾招都變生疏了. 最近公司也有人遇到, 我想我還是詳細地記錄下來比較好, 如此才能舉一反三 – 別人問一步, 我可以直接回答三步.

第一步就是在編 code 的 server 製作符合 Gerrit server 的 RSA 公鑰. 因為 gerrit 通常都是公司架設的, 就算是自己部門架設的, 也會引用公司 domain 的帳號密碼. 因此我們的 RSA key 要設成公司 email address. 假設您在公司的帳號是 username@companyname.com, Gerrit server 是 gerrit.companyname.com, port 是 29418.

ssh-keygen -C"username@companyname.com" -t rsa

此時把 ~/ssh/id_rsa.pub 貼到 Gerrit 接收的 key 的公鑰的欄位, Gerrit 就可以接受這把 key 的私鑰. 若設定都沒有錯誤, ~/ssh/id_rsa.pub 的最後一行就是 username@companyname.com.

第二步是對 Gerrit server 做 repo init. 舉例來說:

export MANIFEST_REPO=ssh://username@gerrir.companyname.com:29418/github/manifests

export MANIFEST_BRANCH=jb-dev

export MANIFEST_FILENAME=jb-20130405.xml

repo init -u ${MANIFEST_REPO} -b ${MANIFEST_BRANCH} -m ${MANIFEST_FILENAME}

第三步是 repo sync. 第一次做 repo sync 相當於 git clone. 由於 sync 的時候是用 .repo/manifest.xml. 所以要去手動修改這個檔案的內容, 把所有

<remote fetch="ssh://gerrit.companyname.com:29418" …

都改成  

<remote fetch="ssh://username@gerrit.companyname.com:29418" …

改完這三步就可以正確做完 repo sync.

不過, 故事還沒完. 因為您已經改過 manifest.xml 了, 下次再 repo sync, 系統就會提醒您有一個修改沒有 check in. 比較笨的方法就是每次都把原始的 manifest.xml 存起來 (rename 即可), 等到手動改的 manifest.xnl 做完 repo sync, 再回存舊版. 

一般來說, 如果 sync repo 失敗, 可以到有衝突的目錄做 git stash 保存現場. 等 repo sync 通過之後, 再 git stash pop 把自己的版本叫出來, 以便手動 merge code.

比較先進的 hack 方法是忽略掉我們對 manifest.xml 這個檔案的修改. 把永遠忽略的檔案加入 .gitignore, 以後 commit 就不會包含這個檔案, 但這不是這個狀況下所需要的. 我們現在只求忽略當前本地的 repository 就好, 因此可以把這個檔案加入 .get/info/exclude. 如此一來, 就不會失手把只適用自己的 manifest.xml 上傳到 git sever.

像我本身只編 code 來測試, 不改 code, 甚至可以忽略掉全部在本地端的修改. 此時可以用 git reset –hard HEAD 恢復到前一版.

[ref]

1. Repo 和 git 版本管理常用命令

2. 如何正确的repo sync?