如何正确的repo sync?

我們知道 repo 是 Google 為 Android source tree 的管理而寫的一個 script,以方便處理 Android 源碼包含的上百個 git repositories。要取得 upstream 最新的 code,只要下 repo sync 就行。它相當於對每個 project 做 git pull 的動作。不過如果你曾對 source tree 做一些修改,repo sync 可能遇到不同的問題。以下說明可能發生的情況,以及解決辦法。

首先視你是否 commit 過你的修改而定。如果你只是單純的修改檔案,而沒有做 git commit 的動作,那麼 repo sync 會嘗試將 upstream 和你的修改做合併(merge)。如果有衝突(conflict),repo sync 就會失敗而停止。你的修改依然存在,不會被蓋掉。這種情況下,最好的辦法是先用 git stash 保存你的修改,再 repo sync。例如,假設你修改的是 frameworks/base:

$ cd frameworks/base
$ git stash
$ cd ../..
$ repo sync frameworks/base
$ cd frameworks/base
$ git stash pop
最後的 git stash pop 會將你的修改再 apply 到 repo sync 後的結果上。這時再手動修正衝突的部分就好。

如果你已將修改 commit 進去,那麼 repo sync 的處理方式,會依你的 branch 是否為 remote-tracking branch 而有所不同。若不是 remote-tracking branch,那麼 repo sync 的結果相當於 git checkout 至 upstream 相對應 branch 的 tip (即最新的 commit)。你可能會看到這樣的訊息:

$ repo sync frameworks/base

frameworks/base/: discarding 3 commits
不要驚慌,它其實只代表你的 HEAD 已被切換到 upstream。你原來的 commit 並沒有真的被丟掉,你仍然可以切換回來:

$ cd frameworks/base
$ git checkout ORIG_HEAD
ORIG_HEAD 就是指 repo sync 切換前的 HEAD。再來用 git rebase,把你的修改 apply 到 upstream tip 上:

$ git rebase m/gingerbread-x86
(如果你在弄的是 froyo-x86、… 就把 gingerbread-x86 換成 froyo-x86、…)

每次都這樣做是不是有點麻煩? 能不能自動完成? 當然可以,這就是 remote-tracking branch 的用處。如果你的 commit 是在一個 remote-tracking branch 上,那麼 repo sync 就會自動將你的 commit apply 到 upstream tip 上,例如:

$ repo sync frameworks/base

project frameworks/base/
First, rewinding head to replay your work on top of it...
Applying: fix wifi issues
git branch -v 時顯示 (no branch)

$ git checkout -b mybranch m/gingerbread-x86
Branch mybranch set up to track remote branch gingerbread-x86 from x86.

Switched to a new branch ‘mybranch’


原文: https://plus.google.com/109385920971545792822/posts/iZE6JYBzFpA
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值