github 提交第三方模塊流程
一、模塊的創建及更新





















git submodule使用以及注意事項
一、背景
在平時的軟件開發過程中常常會有這樣的場景,自己負責的某個模塊會依賴其他模塊或者第三方的library。這時你自己的模塊是一個獨立的代碼倉庫,你想要實現這樣一種功能,當你從你的模塊的代碼倉庫里把代碼拉到本地來的時候,能自動的將你依賴的模塊或第三方庫都拉到指定的目錄當中去。
當然要實現這個功能的方法有很多,比如使用repo之類的工具,又比如如果你使用的是svn作為版本管理工具,那么你可以使用svn的external機制來引用第三方的project。
這里要說的是使用git作為版本管理工具的情況。
二、git submodule
其它的細枝末節就不再贅述了,咱直奔主題。
先來看具體用例:
目前有一個模塊A,其代碼倉庫的地址為:projectA.git, 它需要引用另一個模塊B, 其代碼倉庫的地址為:projectB.git。
假設模塊A的本地目錄為:projectA
希望引用模塊B為模塊A的子模塊,其在模塊A目錄下的路徑為: projectA/projectB
這里我們通過git 的submodule機制來實現。
比如在命令行里可以直接使用如下命令:
cd projectA
git submodule add projectB.git projectB
- 1
- 2
- 3
注: 這個submodule的 子目錄指定時不能以 “/”結尾, 比如上面的命令,就不能寫成 projectB/ 這個樣子。
就這么簡單的一句git命令就可以搞定了,當然這還沒完,運行完這個命令之后,在projectA目錄執行git status命令,可以看到如下的結果:

這時需要使用git commit命令和git push命令,將添加模塊B為模塊A的子模塊的結果push到模塊A的代碼倉庫里面去。
三、git clone包含子模塊的代碼倉庫
此時,就可以使用git clone命令來抓取模塊A的代碼倉庫,但要同時抓取到子模塊的倉庫的話,還需要一些方法:
- 正常的使用git clone命令,然后再使用 git submodule init 和git submodule update來獲取子模塊
git clone projectA.git
cd projectA git submodule init git submodule update
- 1
- 2
- 3
- 4
其運行結果如下:

- 在使用git clone命令時,加上–recurse-submodules或–recursive 這樣的遞歸參數
git clone --recursive projectA.git
- 1
其運行結果如下:

四、tortoisegit操作submodule
如果是使用tortoisegit的話,也可以使用圖形化界面進行submodule的相關操作,如添加submodule就選擇如下圖所示的菜單:

添加子模塊的界面大概就是下面這個樣子:

這里和上面一樣“path”一欄不能以”/”結尾。 填寫之后,點擊OK,就會在主模塊的目錄下添加對應的子模塊。
在clone時也是一樣的,它既可以只是clone,然后用上面菜單中,Submodule Update 選項來抓取子模塊的內容,也可以在clone時選擇遞歸參數,如下所示:

五、忽略submodule中的修改或新增文件
我們引用第三方的project,大多數情況都是想以“只讀”的方式引用,不關心第三方project抓取下來之后是不是被修改,或者是在其目錄中添加了untracked的file, 因為我們只是拉取第三方的project,而不會(往往時不能或不允許)對第三方project進行提交。
以上面的模塊A和模塊B的例子來說,如果模塊A和模塊B中都有進行修改,其結果可能就是如下這個樣子:

這並不是我們想要的結果。一開始的時候我的想法是使用 .gitignore 來忽略submodule的修改,但是無法做到,后來經過一番搜索,終於找到了解決良葯。在添加了submodule之后,project的目錄下回生成一個.gitmodules文件,這個文件記錄了子模塊的路徑和倉庫地址等信息,如下圖所示:

我們要做的就是在[submodule “projectB”]中添加一個ignore子項,這個ignore子項可以有上個可選的值,untracked, dirty和all, 它們的意思分別是:
- untracked :忽略 在子模塊B(也就是projectB目錄)新添加的,未受版本控制內容
- dirty : 忽略對projectB目錄下受版本控制的內容進行了修改
- all : 同時忽略untracked和dirty
這里我們先選擇dirty(至少先保證不提交對子模塊B的任何修改),其他的可以根據具體需求來進行選擇。
添加ignore子項之后的.gitmodules文件的內容如下所示:

然后我們再使用git status查看,可以得到圖下結果:

可以看出,之前 “modified: projectB(modified content)” 已經不見了, 此時對修改后的.gitmodules文件進行commit和push, 之后在查看status或做commit時就可以忽略掉對子模塊B修改的部分了。
如何將Android studio中的項目導入到第三方的git托管庫中
准備工具
新建項目
假設此時你已經下載並安裝好了git,也在coding上注冊了賬號。
那我們點擊coding上的創建項目
輸入好項目名稱,然后添加項目描述,在選擇私有項目和公開項目的時候注意下,如果不是銀牌會員以上,在coding上只能創建5個私有項目,當然,你也可以不花錢,升級成銀牌會員,然后就可以有10個私有倉庫了。不過公開項目倒是可以無限創建。
所有都輸入完畢后,我們點擊新建項目,之后會來到以下界面
初始化本地倉庫
現在我們電腦上已經有一個Android studio項目了,我們要怎樣將電腦本地的項目上傳到已經准備好到代碼托管庫中呢
首先我們通過cmd中的cd命令進入到我們的項目中,使用如下命令將我們本地的項目變成有git倉庫的項目
git init
- 1
使用完該命令后,本地項目會多出一些文件
其實使用了git init命令后,本地已經是一個git倉庫的狀態了,已經可以正常使用git了,所以我們使用以下命令,將當前所有的代碼都添加到本地倉庫中
git add *
- 1
然后做一次提交操作,將代碼都提交到倉庫中
git commit -m "首次提交"
- 1
現在,我們將本地倉庫和coding上到倉庫做一個綁定處理
其實怎么綁定,在coding上創建項目的時候,coding都告訴我們了
我們只需要順序使用這兩行命令就搞定了
git remote add origin https://git.coding.net/用戶名/項目名.git git push -u origin master
- 1
- 2
這樣,我們本地已經存在的Android項目就已經和coding上我們創建的項目倉庫綁定了。
我們去檢查一下coding上有沒有我們的代碼
看來已經綁定成功了!
使用
讓我們來使用一下,首先我們使用Android studio打開我們的項目,然后我們會發現工具欄上會多出這些圖標,我用的Android studio3.1.2,不同的版本可能圖標形狀會不一樣,這個形狀是我最近升級后的新圖標。不過位置都在這里。
打開Android studio后,可能會提醒出現一個提醒框,大概意思是,是否新增的文件都自動add,這里推薦自動add。
原來的工具欄
現在的工具欄
-
新建文件
在studio上新建一個文件,如果在最開始都提示框選擇的是默認添加,那么新建的這個文件就會是綠色,否則就是紅色。
如果是紅色怎么辦呢,那么我們就要自己手動添加一下,方法如下:
-
提交文件
有了Android studio的協助,提交文件變得十分簡單
方式1:
方式2:
然后(剛剛提交A的時候忘保存截圖了,所有新建了個B文件)
這樣文件就保存了 -
上傳文件
其實到這里,本地的倉庫就OK了,那么我們現在需要將本地倉庫提交到遠程的coding上的倉庫中,如果覺得下圖找起來太麻煩,studio有提供快捷鍵,還是很方便的。
然后來到這里
點擊push,就可以將代碼上傳到遠程倉庫中啦!
現在我們去遠程倉庫中去看看是否上傳成功
看來已經完美上傳成功!
小提示
Android studio中的文件有4種顏色,分別是白、紅、綠、藍