2013年9月17日 星期二

一些 git / gerrit / ssh 設定

git / gerrit

alias

常用的指令例如 status 可以減化成短指令

~/.gitconfig

[alias]  
    ci = commit  
    st = status  
    co = checkout  
    l = log --stat=140,100  
    br = branch  
    p = cherry-pick  
    r = rebase  
    f = fetch  
    up = pull --rebase  

指令就變為

$ git st

自動產生 Change-Id

單獨 git clone 下來的 git repository 不會有 commit-msg hook
所以 push 到 gerrit 時,不會有 Change-Id
沒有 Change-Id 的話,重複 push 不會在同一個 patch 裡繼續疊加
所以 commit-msg hook 是必需要用的
(除非要手動從 gerrit 上 copy 下來...何苦呢...)

如果手邊有 BSP

    $ find . -name commit-msg \<BSP_ROOT>/.repo

把他 copy 到 .git/hooks/ 裡

gerrit server

    $ scp -p -P 29418 \<SERVER>:hooks/commit-msg .git/hooks/

template

每次 git repository commit 時,如果要填寫固定格式
可以先將文字檔存下來,就不會每次都要打一次

per repository

進 git repository 寫一個文字檔 .gittemplate

$ git config commit.template=.gittemplate

global

放在 ~/.gitconfig 裡指定

[commit]  
    template = ~/.gittemplate

手動 push 到指定的 branch

$ git push ssh://\<SERVER>:29418/\<PATH> HEAD:refs/for/\<BRANCH>

PATH 可以使用

$ git config -l | grep url remote.origin.url=ssh://\<SERVER>:29418/here/is/my/branch

在此可以知道路徑是 here/is/my/branch

BRANCH

$ git branch -a
...
remotes/origin/aosp/jb-release
...

在裡面找需要的 branch, 不需要包 remotes/origin
所以這邊需要 aosp/jb-release

$ git push ssh://mickey.acer.com.tw:29418/here/is/my/branch HEAD:refs/for/aosp/jb-release

ssh

設定 gerrit

為了不要每次下指令都指定 user name 也就是

$ repo init -u ssh://my.id@\<SERVER>...... 

~/.ssh/config

Host \<SERVER>
Port 29418
User XXXX.YYY

跟 Gerrit 裡 Settings -> Profile -> Username 一樣

2013年9月16日 星期一

BuildConfig in BSP

BuildConfig 在 Eclipse 裡會自動生成 不過如果這份 source code 同時要在 BSP 裡使用就會有問題 先找到一個很醜的解法
wrapper!
public class L {
    private static boolean BUILDCONFIG_DEBUG = false;
    static {
        try {
            Class<?> c = Class.forName("com.helloworld.BuildConfig");
            Field field = c.getField("DEBUG");
            BUILDCONFIG_DEBUG = field.getBoolean(null);
        } catch (NoSuchFieldException e) {
        } catch (ClassNotFoundException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
    }
}