本篇文章已授權微信公眾號 dasu_Android(大蘇)獨家發布
這篇來講講如何在 Android Studio 上同時用 SVN 和 Git 來管理項目。我知道,你肯定會說我吃飽了撐着,沒事找事做,為啥要同時用 SVN 和 Git 來管理項目。問題是,我也不想啊,我也很無奈啊(:(哭喪臉)。
為啥要同時用 SVN 和 Git 管理項目
這小題目也可以叫做使用場景
是這樣的,我之所以要同時用兩個工具來管理項目,是因為,項目原先是用 SVN 管理的,SVN 雖然使用簡單,但分支功能遠沒有 Git 那么好用,如果一開始項目就是用 Git 來管理,我就不會去瞎折騰了,但公司項目都是通過 SVN 來管理,所以,我絕對不是因為喜歡瞎折騰才來搞這個的(嚴肅臉$_$)。
來說說我的遇到的問題
有個項目由於種種原因,需要嘗試替換圖片框架,而這個項目前期開發時並沒有考慮到這點,所以,emmm,你知道的,需要改動到的地方太多了。產品想要的是穩定性,所以對於換框架的事也不急,我也就抽空做做。
然后,這時候還是得並行處理一些 Bug。
再然后,沒多久,新的迭代又開始了,所以我這邊是需要並行處理幾個工作的,這幾個工作肯定是需要單獨分開的,都需要開個分支來做,以免影響主分支的代碼。
而 SVN 開分支,我只知道這相當於對主分支的代碼 Copy 了幾份過去,所以說,如果我要換分支開發,等於說我要用 Android Studio 打開多個項目,就像這樣:
每次換分支,都要重新打開一個項目,要是分支多了,電腦上就得對應多個文件夾,時間一長不就亂套了,而且你們知道,我們最多就是在項目外再建一個文件夾通過命名來區分不同的分支,但是 AS 的 open recent 里是不會顯示外面那層文件夾的,結果就是一個列表下來都是同名的項目,我都不知道哪個是哪個,頭疼之下,我突然很想念 Git 的分支功能,所以就瞎搞了半天來看看怎么用 Git 配合 SVN 管理項目。
操作
我的使用方式是:
- SVN:同步遠程倉庫代碼和提交操作
- Git:本地管理項目,方便開分支
第1步
首先,項目已經通過 SVN 在管理了,所以我們只要去根目錄下執行下 git init
將項目也添加進 Git 管理。
這時候,根目錄下是有 .svn 和 .git 的隱藏文件的。
第2步(重要)
新建或找到 .gitignore 文件,將 .svn 添加進 Git 的忽略名單里。
SVN 通過 .svn 來管理項目, Git 通過 .git 來管理。如果沒有將 .svn 添加進 .gitignore 中的話,那 svn 就會受到 git 回退,切分支等等操作的影響了,我們應該讓這兩個工具都獨立工作,不要影響彼此。所以,你還可以去 svn 的配置里也把 .git 添加進忽略里,但這點不是必要的,如果 SVN 只用於同步和提交操作的話,再說,也很少對通過 SVN 對整個項目進行回退等操作,所以 SVN 對 .git 文件夾的影響不大。
第3步(重要)
對 Git 進行如下的配置:
git config --global core.autocrlf false
git config --global core.safecrlf false
如果你是用 Window 開發的話,這個配置一定要在 git init
后,首次執行 git add
前配置好,否則你會掉入一個大坑里的,我在這個坑了爬了好久。
原因是這樣的,Window 下換行符是 CRLF,但是 Git bash 是基於 Linux 的,所以它的換行符是 LF,默認情況下,當你執行 git add
, git commit
, 的時候,會自動將代碼里的 CRLF 替換成 LF 的,所以會出現這樣一種情況:
Local Changes 里是沒有任何文件改動記錄的,也就是說 SVN 和 Git 當前的工作區間沒有改動什么文件,然后你通過 Git 切換到分支上去,開發完后再切回主分支時,按理說,現在的 Local Changes 里應該是要沒有任何東西的,但是你會發現,就有一些文件被改動的記錄,然后你 show diff 查看這些改動的文件,你會發現兩邊代碼一模一樣,沒有任何一處是有改動到的,唯一不同的就是 CRLF 和 LF,就想這樣:
經常使用 AS 的 show diff 應該對這個很熟悉,兩邊明明沒有任何代碼上的改動對比,就是因為 CRLF 和 LF 的問題,導致這個文件出現在了 Local Changes 里。
而我們在寫完代碼提交到遠程倉庫時,經常都是通過這個 Local Changes 面板來選擇一些文件進行提交,很少會對整個文件夾提交,因為可能開發過程中改動到其他地方,所以提交前我都習慣先來這邊過一遍。
但因為這個 CRLF 和 LF 的問題,會導致這邊 Local Changes 亂套的。而上面那兩句 git 命令就是設置默認文件原本的換行符格式,不對其發起警告也不對其自動替換。
第4步
經過上面幾步操作后,接下去你就可以執行
git add
git commit
git checkout -b XXXbranch
git checkout master
等等的 git 分支相關的操作了。
AS 上同時使用 SVN 和 Git
以上可以說只是完成首次使用的配置而已,接下去才是我們想要的。 AS 提供的 Version Control 圖形操作界面非常方便和好用,我就是因為喜歡 AS 這點,才想用 Git 來管理項目。如果對 AS 上 Git 的使用不熟悉的話,可以去看看我之前寫的一篇簡單介紹的博客。AS 上 SVN 的操作跟 Git 基本一致。
那么,到底可不可以在 AS 上既用 SVN 又用 Git 呢?可以是可以,但會有點小問題。
首次打開先去 Settings->Version Control 里配置一下,然后你就會在底部欄發現 AS 提供的各個版本操作工具了。
以上幾個 AS 的面板都非常好用,既可以查看歷史提交的代碼信息,本地的修改信息,還可以比對各個提交的不同等等。
但 AS 如果同時使用 SVN 和 Git 的話,Local Changes 這邊就只會顯示 Git 的本地修改了。也就是說,如果 SVN 記錄的本地修改和 Git 不同的話,這里只會顯示 Git 記錄的信息。而且,如果是只使用 SVN 的情況下,我們可以在這里直接通過右鍵來提交我們選中的修改到 SVN 上。但如果 SVN 和 Git 同時使用,SVN 的 commit 功能就失效了,就只有 Git 的 commit 和 push 可以用,但我們又不需要 Git 的 push,它只作為本地管理使用而已,所以小問題就是在這里了。
至於解決方法,也很簡單,但稍微有些麻煩。也就是你每次要用 SVN 提交代碼的時候,再去 Settings->Version Control 里將 Git 管理的目錄暫時移除掉,只保留 SVN 的。
emmm,這樣操作還是有點麻煩,每次提交都要去移除。但相對於再打開一個項目來開發分支的操作算是好了一點了。
還有一種方法,也是我目前在使用的方法:
AS 只添加 SVN,這樣 SVN 的功能就能正常使用了。然后 Git 的建分支,切分支等等操作都通過 git bash 命令行方式來執行,搞定。
這下,再也不用擔心 SVN 建分支要重新打開項目了,好棒。
最近剛開通了公眾號,想激勵自己堅持寫作下去,初期主要分享原創的Android或Android-Tv方面的小知識,感興趣的可以點一波關注,謝謝支持~~