使用repo sync的 -d 選項在不丟棄本地修改的狀況下同步代碼

使用 repo sync 命令來同步遠端服務器的 Android 代碼,若是本地修改了代碼但尚未 commit,會提示沒法 sync:android

error: android/frameworks/base/: contains uncommitted changes

此時,能夠使用 git reset 命令丟棄本地修改,而後再執行 repo sync 來同步代碼。git

若是想要不丟失本地修改,強制同步遠端服務器代碼,能夠加上 -d 選項,repo sync -d 命令會將 HEAD 強制指向 repo manifest 版本,而忽略本地的改動。bash

查看 repo help sync 的幫助信息,對 -d 選項的說明以下:服務器

-d, --detach
detach projects back to manifest revision

注意:加上 -d 選項只表示忽略本地改動,能夠強制同步遠端服務器的代碼,可是本地修改的文件仍是保持改動不變,不會強制覆蓋掉本地修改。並且同步以後,本地的分支指向會發生變化,再也不指向原來的分支。具體舉例以下。ide

1.下面是執行 repo sync -d 以前的分支信息:測試

$ git branch
* curent_branch_xxx

2.下面是執行 repo sync -d 以後的分支信息:this

$ git branch
* (detached from 715faf5)
  curent_branch_xxx

即,從遠端服務器同步的代碼,是同步到跟蹤遠端服務器的分支,尚未從 git 倉庫把代碼 checkout 到本地,而當前本地修改的代碼處在未命名分支下,是不一樣的分支,互不干擾,才能在不丟棄本地修改的狀況下,強制同步遠端服務器代碼。code

3.執行 git status 命令,能夠看到本地仍是有修改過且尚未 commit 的文件,同步遠端服務器代碼後,並不會強制覆蓋本地文件的修改:xml

$ git status
HEAD detached at 715faf5
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)
        modified:   vendor/chioverride/default/g_pipelines.h
        modified:   vendor/topology/g_usecase.xml

即,若是想要丟棄本地修改、讓本地代碼跟同步後的 git 倉庫代碼一致,repo sync -d 命令達不到這個效果。ip

另外,repo sync 有一個 --force-sync 選項,具體說明以下:

--force-sync
overwrite an existing git directory if it needs to point to a different object directory. WARNING: this may cause loss of data

從說明來看,像是能夠強制同步,且可能丟失本地改動。可是實際測試發現,這個選項並不能強制覆蓋本地的改動。若是本地文件發生改動,加上這個選項也是會 sync 報錯:

$ repo sync --force-sync .
Fetching project tools/
error: tools/: contains uncommitted changes

同時提供 -d--force-sync 兩個選項,仍是不能強制覆蓋本地修改。

目前沒有找到 repo sync 命令能夠強制覆蓋本地修改的選項。

相關文章
相關標籤/搜索