第十六屆交大高階經理人培訓班第五課

光陰似箭, 很快一個月又過去了. 這次我們邀請到聯陽的董事長胡鈞陽學長來為我們演講.

學長的題目很有趣, 叫做 "併購的另一思". 這正好提醒了我還沒有把兩本併購的書看完, 還好胡學長的重點放在人性面的探討, 而不是評估公司的價值, 這樣就不會顯得我太不用功.

胡學長舉的例子很簡單, 假如有家 A 公司要併購上市的 B 公司, 或未上市的 C 公司. 那麼併購 B 公司的溢價大概會落在 20% 多, 雙方不容易有爭議. 但是後者只有淨值、股本、EPS 可以參考, 因此商譽不容易估計. 就算併購之後, 對 A 公司或者 C 公司都有些後遺症.

C 公司因為還未上市, 所以員工的薪水往往比 A 公司高. 如果被併購後薪水調降, 那麼 C 公司的員工不爽; 若是薪資比照過去, 那麼換 A 公司的員工不爽. 剛好有幾位學員都提到這個問題, 學長說到, 這種狀況只能慢慢拉近雙方的差異.

若 C 公司的業績本來也不差, 那麼 C 公司的員工大有可能透過股票初次上市而大賺一筆. 但公司被賣掉之後, 這個期待就破滅了. 因此 C 公司的體質愈好, 員工對於公司被賣掉就會愈感到不滿.

A 公司的員工也會有不滿意的地方, 因為公司要印股票換股票, 所以大家的股票價值都被稀釋了. 還好現在沒有員工股票分紅, 所以更加不滿的應該是不認同併購的大股東吧! 學長說到, 如果只是董事和董事長希望併購, 而高階經理人私下不認同, 那麼就很容易發生高階經理人疏於照顧新員工的狀況, 導致花大錢被併進來的 B 公司、C 公司的重要幹部出走.

對公司來說, 另外一個麻煩的是商譽問題. 商譽不但要逐年折舊, 並且可能瞬間歸零 – 如專利失效, 相關部門裁撤等等. 學長說到, 聯陽就是看到併購的效果已經消失, 所以打消掉當初 4 合一併購的 24.58 億的商譽, 導致當年度由贏轉虧.

聯陽 每股虧12.13 元

2011/12/30

聯陽29日公告,依財務會計準則第35號公報評估資產減損規定,認列高達24.58億元資產減損,每股虧損達12.13 元。聯陽強調,由於這是一次打掉原先合併聯盛、繪展與晶瀚時所給予較高評價的商譽無形資產評價,雖然會造成業外龐大損失,卻不會涉及現金流量及實際營運。此外,聯陽主力歐洲電視晶片市場受到歐債衝擊,出貨消退,加上主力重壓個人電腦產品,未搭上智慧型手機和平板電腦快速起飛的商機,導致前三季每股稅後純益僅0.73元。

課程的內容大概就是這樣了, 接下來一個半小時都是 Q&A. 大概學長人太好了, 所以提問也異常地踴躍.

Q1. 請學長自我介紹 (對耶!都沒講到) 

A1. 胡學長是控工系 69 級, 電子所 71 級畢業. 因為小兒痲痺免疫的關係, 直接先去教兩年書盡獎學金的義務. 雖然是專任的講師, 不過胡學長並不想以教書為業. 兩年一滿他就到園區找工作, 並且拿到聯電的蔡明介先生給的 offer.  但教書這兩年也大有收穫, 原本學長很內向, 和人講話只敢看旁邊. 當了兩年老師就沒有這個問題了.

學長最初在 PC 部門, 後來轉到 CPU 部門做台灣的第一顆 386 CPU. 學長說到可以一窺 CPU 的堂奧是他職場中最難得的經歷. 後來的故事當然如大家所知, 聯電就算出了 386, 但是無力往 387 或是 486 進軍, 最後 CPU 產品線收攤, 學長就回到 PC 部門.

聯電接著把所有 IC 設計部門全部 spin off, 回歸到純晶圓代工. 因此聯電的 PC 部門就變成專做電腦 IO 的聯陽. 胡學長說:聯陽知道只做 IO 不夠, 因此在 2002 年曾經做過 LCD 控制單晶片, 比聯詠更早投入這個市場. 

聯陽LCD控制IC整合單晶片年底前問世,搶攻全球前三大供應商

2002/10/11

聯陽喊出明年LCD控制晶片全球前三大的目標,顯示公司切入時間雖不是最早,但志氣卻不輸人,除了目前全球佔有率仍超過60%的舊霸主GENESIS之外,國內目前出貨量最大的是晶磊,全球市佔率約在5%左右,今年以來多家廠商進入市場後均有類似聯陽的壯志,包括鈺創、偉詮電及瑞昱等均曾喊出明年 LCD 控制 IC 台灣第一的營運目標。

不但如此, 聯陽也是第一個做 ipod like 產品, 以及和 Microsoft 合作 WInCE 中文版的公司. 可惜, 這些新產品全部都失敗了. 所以至今的主力產品還是電腦的 IO…

學長說, 我們也不是努力, 可是始終沒有突破, 可能就是命吧!我們只能做到心存正念, 盡力就好, 至少回家可以睡得著.

學長又說, 這 27 年職涯的心得就是要努力變成 "賢拜", 這裡指得不是馬齒徒長, 也不是數十年如一日, 而是要認真工作, 培養出手感. 這樣工作會變輕鬆、能夠教導別人、並且不容易被騙. 學長現在是董事長兼部門經理與 CAD 主管, 我還漏掉一項職稱沒記錄到, 總之是校長兼撞鐘~~~   

在變成賢拜的過程中, 難免會遇到挫折. 但是只要堅持下去, 就會挺過撞牆期. 學長小時候, 他的阿嬤認為既然學長的腳不方便, 將來只能修理皮鞋或是鐘錶. 讀新竹中學的時候, 新生訓練就要佇著拐杖跑五天流動教室, 跑到全身無力. 上交大的第一天在餐廳打餐盤就滑倒. 進聯電時不懂 IC 設計得重頭學起, 摸了半年還沒上手. 雖然看起來一路相當順遂, 求學沒問題, 上班也只待過一家公司, 但中間其實有很多辛苦的地方.

現在有些年輕人熬不住辛苦, 工作遇到瓶頸就跑到澳洲遊學 – 其實是去殺豬, 但是殺豬公並不能解決問題. IC 設計業是知識密集的行業, 不能隨便中斷. 反而像開車一樣, 上手之後就可以一手開車又分心聽音樂聊天什麼的 – 其實也有人邊開邊吃便當啦!

Q2: 如果併購後會影響員工士氣, 應該如何補救, 以避免同仁離職.

A2: 學長說, 公司會賞罰公平. 但是薪資不能公開, 所以同仁無法瞭解公司的苦心, 這點比較遺憾. 另外一方面, 學長認為既然已經提到了離職, 表示員工在公司外面已經有管道. 只要這個管道還在, 同仁始終都會去做比較, 因此不喜歡留人. 

學長說聯陽的員工有時候也會抱怨薪資不如大小 M, 但是至少學長不鼓勵加班, 員工六點鐘就可以回家享受溫暖, 不用看到早上的星星. 學長笑稱聯陽工時媲美縣政府, 所以抱怨的同仁也未必會選擇離職. 一般的離職率都不會超過 15%, 大約是 10% 出頭.

Q3: 對 IC 設計業的展望?

A3: 最近華為的人和學長聊到聯陽, 對方說很羨慕聯陽這樣的公司, 因為 IC 設計業已經很少用 110 nm 還可以活下去的產品了, 而聯陽的電腦 IO 就是這樣的產品. 並不是這裡面有特別難的技術, 只是經濟規模已經形成, 後面的人不容易進來. 學長說, IC 設計也走 M 型化, 像是 MTK 已經做到 .28 nm, 要這樣花大錢的公司, 未來一定剩不了幾家.

由於人才少, 新產品少, 產品線重複, 未來的 IC 設計公司也只會愈來愈少. 發生 IC 設計公司倒閉風潮是不至於, 但是併購會變多. 正常來說, 產品的售價每季都要降價 3%; 若是突然冒出一個對手, 還需要大幅降價因應. 聯陽雖然每年本業都賺錢, 但是也要很努力地經營才能繳出及格的成績單 (70 分). 因此, 若是有體質良好的大公司來併聯陽, 只要溢價夠高 (> 30%), 對股東有交待, 員工也可以找到更好的歸宿.

關於嘗試新產品, 學長也有一個心得. 那就是感覺產品不對勁的時候, 無稐給多大的耐心去包容, 做不起來就是做不起來. 同仁對自己總是比較有信心, 有時誇口說只要降價或怎樣怎樣就一定賣得出去云云, 最後總是賣不掉! 咳咳, 心有戚戚焉.

Q4: 關於聯陽減資的想法?

A4: 聯陽的股本只有 20.6 億, 市值 53.4 億. 帳上的限金卻有 26 億. 若是有禿鷹進入董事會, 說不定這 26 億就被搬走了. 為了避免懷璧之罪, 乾脆把它發給股東. 學長說本來他想減更多, 但董事協調的結果只減了 25%. 

公司口袋有錢雖然是好事, 不過既然流動比不是問題, 轉型也沒有成功, 看來不需要留那麼多錢. 學長說到, 過去開新產品的經驗都是失敗的, 在舊產品上做改進效果卻不錯. 所以還是會以本業為主, 不會學人家做 SOC (system on chip), 也不會學人家去 license ARM, 用晶心 (Andestech) 比較便宜.

Q5: 學長未來的目標?

A5: 以前號稱賺到 5,000 萬就要退休, 結果學長前陣子碰到老蔡 (MTK 蔡總, 也就是老長官) , 對方虧學長怎麼還沒退休? 學長說, 也許他這任董事長做完就退休了, 也或許在場的學弟妹都退休了, 他都還沒退, 當得比乾隆還久. 

學長話鋒一轉, 說到大部份的 IC 設計公司沒有培養好接班人. 因為這一波大家上來接公司的時候都還很年輕, 做著做著也沒有覺得自己很老, 幾十年過去, 真的要退還不容易找到人接.   

學長謙稱他這 27 年的職涯沒有什麼太特別的地方, 今年忽然被選為傑出校友, 感覺到自己似乎沒那麼傑出. 但是他問心無愧, 沒有做什麼睡不著覺的事. 公司雖然沒有特別賺錢, 但是聯陽這 17 年都是賺錢的, 只是賺多賺少而已 (除了打消商譽時讓帳面有虧損). 

Q6~Qn: 大致上比較重要的問題和答案都整合到前面五問當中了. 整體來說, 學長非常平易近人. 包括演講半小時, 中場換名片時間半小時, Q&A 一個半小時, 會後聯誼時間…學長都撐著拐杖站著, 還怕擋到角落學員的視線而 "走位" 到更角落開講. 我想, 傑出校友當然不是浪得虛名的啦!

酒窩品酒記

這天交大高階經理人培訓班的組長美貞為大家辦了一個品酒的聚會, 地點就在交大校友周先廉先生在竹北所開 “酒窩". 

雖然說我對紅酒沒什麼概念, 不過至少我可以分辨得出來老闆是真的流血大放送, 所以也就來湊熱鬧了. 這天介紹的是 CP 值較高的智利酒, 有五款來自伊拉蘇 (Viña Errazuriz) 酒廠的紅白酒要介紹給我們.

第一款是 Sauvignon Blanc Max Reserva 的白酒. 它的最佳成績是 2008 年被 Robert Parker 評了 90 分. 這位羅伯帕克何許人也? 他據說是世界上最有影響力的紅酒酒評, 美國總統柯林頓選酒要找他, 法國總統席哈克選酒也要找他. 因此他能給到 90 分, 這款酒肯定是厲害了. 基本上, 它的香氣還不錯, 真的能聞到點水果味. Sauvignon 是指葡萄的品種, blanc 大概就是指白葡萄了. 

sauvignon blanc max reserva

第二款是口味比較淡的 Carmenere Single Vineyard. Camenere 也是葡萄的品種, single vineyard 是指單一葡萄園. 表示酒廠的主人對這塊葡萄園有一定的信心, 所以才拿它單獨處理. 否則的話, 葡萄通常都是採收完後就混在一起處理. 個人覺得這一款是比較好喝的, 它的售價大約是 1,300 NTD, 但交大校友可以買到破盤價. 據說周老闆自己也是喝這一款. 它的最佳成績是 Robert Parker 給 2010 年份 90 分.

第三款精選卡本內蘇維儂紅酒口味比較濃郁, 所以排在後面. 它以 Cabernet Sauvignon 為主,混合 6% 的 Cabernet Franc, 和 6% 的 Petit Verdot. 雖然老師 (算是酒廠業代吧!) 說紅酒就是要有酸味, 否則只有甜味就跟果汁沒兩樣. 不過個人覺得它真的比較酸. 所以比較不合我的意. 這款酒也很有趣, Robert Parker 給 2003 年份的 93 分, 而 2010 年份的就只有 88 分.

第四款是今天的重頭戲, 那就是 Robert Parker 給到 93, 94+ 分的麥西米亞諾創辦人典藏珍釀 Don Maximiano Founder’s Reserva. 這款同樣是 Cabernet Sauvignon 為主的調和酒, 外加 8% 的 Carmenere, 5% 的 Syrah, 和 3% 的 Petit Verdot. 成分看起來和前一款相當接近, 不過它把創辦人的名字 Don Maximiano 都掛上去了, 可見這是 Errazuriz 的招牌酒. 據說 Errazuriz 在智利家大業大, 紅酒的營業額只佔家族企業的 1%, 但他們卻把 99% 的精力都放在紅酒上. 那…它喝起來怎麼樣呢?

Don Maximiano Founders Reserva

嗯, 個人覺得和第二款酒比起來更加順口, 但是特色好像不太明顯. 老闆說他已經醒酒五個小時了, 但還沒有醒夠. 所謂的醒酒, 我以前都不明白. 今天聽到老師是這麼說的: 紅酒的好壞在於能否帶有特殊的香氣, 而不是只有甜味. 因此好的葡萄酒都產在中緯度地區的貧瘠土壤上, 如果年雨量只有 600~700 公釐, 那麼葡萄藤的根就會長得很深 – 比方說兩三層樓, 並且吸收到土壤裡的特殊成分, 而這個成分就決定了比較細微的香氣. 當然, 主要的香氣是和葡萄的品種有關.

這些特殊香氣若是沒有充分散發到空氣中, 我們就聞不到. 有時候得等個八小時才能醒酒完成 – 例如老闆剛剛標到的神之雫第十一使徒. 所以我們只能用力搖晃酒杯手動醒酒了. 附帶一提, 右手要逆時針方向搖酒杯比較穩當 – 也就是較不易潑灑出來. 因為這支酒一杯抵兩三杯的價錢, 所以就算來不及醒酒完, 我還是本著豬八戒吃人蔘果的精神把它喝光了.

最後收尾的是甜白酒 – 晚收成蘇維儂甜白酒. 據說這是女孩子愛喝的, 最適合代替甜點作為宴會最後的收場. 個人覺得它超甜! 由於是晚收成的關係, 所以葡萄本身已經 “過甜"了, 做出來的酒甜度可比感冒糖漿~~~ 這杯我比較喝不習慣, 但果真也有幾個人續杯到第四杯. 為了澄清這是個人喜好問題, 我要附上 Robert Parker 給過 2008 年份 90 分的評價做為公斷.

Sauvignon Blanc Late Harvest

其實, 這次真得很開心可以和別組的校友交流, 又喝到 4 支 90 分以上的年份的葡萄酒. 本來我完全一無所知, 現在卻稍稍長了點知識, 又認識了幾位 pro 級的校友. 對了! 甚至有聽到這次超低價品酒會, 特別攀親帶故跑來參加的 “隔壁學校" – 清大的校友. 我記得上次去 Napa 和紐西蘭的酒莊時, 雖然他們也會幫我們做介紹, 但是行銷的氣味太濃, 分享的氣氛太少. 整體的感覺遠不如老闆也是校友那麼親切. 說來說去還是要謝謝美貞和周老闆啦!

我們喝的空酒瓶

inwinet2

一樓酒櫃

InWinet

最後幫我們校友打打廣告:

Winet

酒 窩 WiNest Corp.

TEL:886-3-668-2202

FAX:886-3-668-2201

ADD:新竹縣竹北市文興路二段66號(極光琉璃)

RFC1738,1808,3986 小整理

最近在看直播的問題, 必須看一些 RFC 的文件. 在此把相關的部分都整理出來.

最基礎的一本是 RFC 1738 Uniform Resource Locators (URL), 一個 URL 可以分成兩個部分:

        <scheme>:<scheme-specific-part>

Scheme 可以翻譯成 "系統" 或 "範型", 它包括以下幾種內容, 相當於是大分類. http 或是 ftp 都是常用的 scheme.

scheme 說明
ftp File Transfer protocol
http Hypertext Transfer Protocol
gopher The Gopher protocol
mailto Electronic mail address
news USENET news
nntp USENET news using NNTP access
telnet Reference to interactive sessions
wais Wide Area Information Servers
file Host-specific file names
prospero Prospero Directory Service

至於 scheme-specific-part 的部份, 會依據不同的 scheme 而有不同的格式變化.下面就進入 RFC1808 Relative Uniform Resource Locators 的 URL 格式, 和前面 RFC1738 最大的差異在於:Relative – "相對性".

它基本的長相是這樣. 

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>

scheme ":"   ::= scheme name.

"//" net_loc ::= network location and login information.

"/" path     ::= URL path.

";" params   ::= object parameters.

"?" query    ::= query information.

"#" fragment ::= fragment identifier.

為了簡化描述, 我們直接看簡化版的例子, scheme, net_loc, params, query (component), fragment 改用 http://, a, p, q, f 代替. Path 的部份因為要多給幾層才能看出端倪, 所以給三個符號 b, c, d. d 可以視為檔名. 此後 URL 變成 <URL:http://a/b/c/d;p?q#f&gt;

於是我們有下列的表達方式:

      g:h        = <URL:g:h>
      g          = <URL:http://a/b/c/g>
      ./g        = <URL:http://a/b/c/g>
      g/         = <URL:http://a/b/c/g/>
      /g         = <URL:http://a/g>
      //g        = <URL:http://g>
      ?y         = <URL:http://a/b/c/d;p?y>
      g?y        = <URL:http://a/b/c/g?y>
      g?y/./x    = <URL:http://a/b/c/g?y/./x>
      #s         = <URL:http://a/b/c/d;p?q#s>
      g#s        = <URL:http://a/b/c/g#s>
      g#s/./x    = <URL:http://a/b/c/g#s/./x>
      g?y#s      = <URL:http://a/b/c/g?y#s>
      ;x         = <URL:http://a/b/c/d;x>
      g;x        = <URL:http://a/b/c/g;x>
      g;x?y#s    = <URL:http://a/b/c/g;x?y#s>
      .          = <URL:http://a/b/c/>
      ./         = <URL:http://a/b/c/>
      ..         = <URL:http://a/b/>
      ../        = <URL:http://a/b/>
      ../g       = <URL:http://a/b/g>
      ../..      = <URL:http://a/>
      ../../     = <URL:http://a/>
      ../../g    = <URL:http://a/g>

由於 a 是 network location, 無論往上幾層, 都不能高過於 http://a/, 其他的都可以直觀地了解. 大致瞭解了比較常聽見的 URL, 接著看看比較陌生的 RFC3896 Uniform Resource Identifier (URI): Generic Syntax.

其實 RFC3896 的內容和 RFC1808 有些重複, 原因是 URI 包含了 URL 和 URN (Uniform Resource Name), 所以 RFC1808 只是 RFC3896 的一部份. 一個 URI 可能是一個 locator (URL), 一個 name (URN), 或是 locator + name. 舉例子來說, 它們會像這樣:

         foo://example.com:8042/over/there?name=ferret#nose
         _/   ______________/_________/ _________/ __/
          |           |            |            |        |
       scheme     authority       path        query   fragment
          |   _____________________|__
         /  /                        
         urn:example:animal:ferret:nose

大家應該很容易就發現, URI 的說明, 簡直就和 URL 一樣嘛! 只不過 URL 用 network location 代替了 URI 的 authority, URL 有 parameters, 而 URI 把它併入了 path. 基本上, URI 著重在 "標識" – identifier, URL 著重在位置 – location, 即使兩者的長相完全一樣.

參考 [ref 4] 的說法, 若是 PPS 把一部 "大話西遊 – 月光寶盒" 的電影, 同時放在伺服器 1, 2, … 和伺服器 100, 以便給不同地區的使用者觀看.  這些片子可以理解為同一個 URI, 但它們的 URL 各自不同. 另外一部同時放在伺服器 1 的電影: "大話西遊 – 仙履奇緣", 就要理解為另外一個 URI 了.

[ref]

1. http://www.ietf.org/rfc/rfc1738.txt

2. http://www.ietf.org/rfc/rfc1808.txt

3. http://www.ietf.org/rfc/rfc3986.txt

4. URI, URL, 和 URN 的區別

USB 充電小註解

目前 USB 的充電規範以 USB應用者論壇(USB-IF) 所制定 BC (Battery Charge Spec.) 1.2 為主, 它定義了每個類型充電器的可用電流上限, 以及充電器的類型.

原先大家的認知, 都是 USB 要支援 500mA 的電流. 但是實際上, 這種電流可能連外接硬碟都推不動. 於是大家可能都 "偷偷" 可以供到 1A. 從 BC 1.1 開始, 規範中就直接讓 USB 可以輸出 1.5 A 了.

在充電類型方面, 一共有三種定義:標準下行埠(Standard Downstream Port, SDP)、充電下行埠(Charging Downstream Port, CDP)及專用充電埠(Dedicated Charging Port, DCP). 

所謂的 SDP 就是標準的 USB HUB 輸出, 像是電腦或是螢幕基座上的 USB 輸出大抵都支援 SDP. 它的充電電流是 500 mA, 所以不致於充得太快! 甚至在被充電裝置完全沒電時, 可以先用 100m A 的小電流輸出, 等到充至 0.5~0.7 V 時才改回 500 mA.

這有什麼好處呢?如果沒有人在管電流限額, 而沒電的手機電壓已經趨近於 0 了, 當輸入阻抗很小, 那麼電流將會很大, 使得溫度過高, 說不定會燒壞什麼電路. 阻抗給很大, 那麼電流就會太小, 導致充得很慢. 因此, 聰明的控制電流是有必要的.

至於 CDP 可以提供 500mA 和 1.5A 兩種電流, 算是有 "兩下子" 的 USB 接口. 一般會先用 500mA, 若是符合 1.5A 的快充, 就會切換過去 [3, 4].

最後的 DCP 只能充電, 不能傳 data.

上面提到的都是 USB 2.0, 而一般 USB 3.0 都是用 USB 2.0 的規範充電.

USB 可持裝置 (portable device, 簡稱 PD) 要怎麼知道連上的是哪一種 USB Port, 並從而決定要抽多少電呢?判斷方式可以參考 ref  3 或 4. 簡單地說:

PD 先把 D+ 設為 0.6V:

1. D- 還在低電位, 表示 USB HOST 沒反應, 那麼這 HOST 是 SDP.

2. 若 D- 變成 0.6V, HOST 可能是 DCP 或 CDP.

PD 再把 D+ 或 D- (只有慢速設備會拉 D-) 拉高到高電位, 然後去看另外一根 D- 或 D+:

1. D- (D+) 還在低電位, 表示這是 CDP.

2. D-  (D+) 也變成高電位, 表示 D+ 和 D- 短路, 一定是 DCP.

因此 PD 有辦法知道它所連接的 port 是哪一種, 再進一步決定抽 0.5A 還是 1.5A.

最後, 一個裝置可能有時支援 CDP, DCP, 或 SDP , 這叫做 multi-role port. 若是不只是能支援充電, 還可以當 OTG 用, 這個叫做 ACA (Accessary Charge Adapter).

PD 只要有一個 micro-ACA, 它的 3 個 port 就同時扮演 device 當別人的 USB Storage (OTG Port), 當 host 外接鍵盤滑鼠 (Accessary Port) , 又被充電 (Charger Port). 一孔多用是未來的趨勢, 因此 ACA 早在 BC 1.1 的時候就被列入規範了.

[REF]

1. USB 快速充電知多少?使用跳線達成 AC 模式充電.

2. 滿足可攜式裝置電源需求 USB電池充電規範角色關鍵

3. USB Battery Charge Spec. 1.2

4.  解读USB-IF电池充电规范

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?