關於子倉庫或者說是倉庫共用,git官方推薦的工具是git subtree。 我本身也用了一段時間的git subtree,感受比git submodule好用,可是也有一些缺點,在可接受的範圍內。
因此對於倉庫共用,在git subtree 與 git submodule之中選擇的話,我推薦git subtree。html
git subtree 能夠實現一個倉庫做爲其餘倉庫的子倉庫。
git
使用git subtree 有如下幾個緣由:github
舊版本的git也支持(最老版本能夠到 v1.5.2).工具
git subtree與git submodule不一樣,它不增長任何像.gitmodule
這樣的新的元數據文件.post
git subtree對於項目中的其餘成員透明,意味着能夠不知道git subtree的存在.學習
固然,git subtree也有它的缺點,可是這些缺點還在能夠接受的範圍內:spa
必須學習新的指令(如:git subtree).code
子倉庫的更新與推送指令相對複雜。htm
git subtree的主要命令有:blog
git subtree add --prefix=<prefix> <commit> git subtree add --prefix=<prefix> <repository> <ref> git subtree pull --prefix=<prefix> <repository> <ref> git subtree push --prefix=<prefix> <repository> <ref> git subtree merge --prefix=<prefix> <commit> git subtree split --prefix=<prefix> [OPTIONS] [<commit>]
咱們先準備一個倉庫叫photoshop,一個倉庫叫libpng,而後咱們但願把libpng做爲photoshop的子倉庫。
photoshop的路徑爲https://github.com/test/photoshop.git
,倉庫裏的文件有:
photoshop | |-- photoshop.c |-- photoshop.h |-- main.c \-- README.md
libPNG的路徑爲https://github.com/test/libpng.git
,倉庫裏的文件有:
libpng | |-- libpng.c |-- libpng.h \-- README.md
如下操做均位於父倉庫的根目錄中。
咱們執行如下命令把libpng添加到photoshop中:
git subtree add --prefix=sub/libpng https://github.com/test/libpng.git master --squash
(--squash
參數表示不拉取歷史信息,而只生成一條commit信息。)
執行git status
能夠看到提示新增兩條commit:
git log
查看詳細修改:
執行git push
把修改推送到遠端photoshop倉庫,如今本地倉庫與遠端倉庫的目錄結構爲:
photoshop | |-- sub/ | | | \--libpng/ | | | |-- libpng.c | |-- libpng.h | \-- README.md | |-- photoshop.c |-- photoshop.h |-- main.c \-- README.md
注意,如今的photoshop倉庫對於其餘項目人員來講,能夠不須要知道libpng是一個子倉庫。什麼意思呢?
當你git clone
或者git pull
的時候,你拉取到的是整個photoshop(包括libpng在內,libpng就至關於photoshop裏的一個普通目錄);當你修改了libpng裏的內容後執行git push
,你將會把修改push到photoshop上。
也就是說photoshop倉庫下的libpng與其餘文件無異。
若是源libpng倉庫更新了,photoshop裏的libpng如何拉取更新?使用git subtree pull
,例如:
git subtree pull --prefix=sub/libpng https://github.com/test/libpng.git master --squash
若是在photoshop倉庫裏修改了libpng,而後想把這個修改推送到源libpng倉庫呢?使用git subtree push
,例如:
git subtree push --prefix=sub/libpng https://github.com/test/libpng.git master
咱們已經知道了git subtree 的命令的基本用法,可是上述幾個命令仍是顯得有點複雜,特別是子倉庫的源倉庫地址,特別不方便記憶。
這裏咱們把子倉庫的地址做爲一個remote,方便記憶:
git remote add -f libpng https://github.com/test/libpng.git
而後能夠這樣來使用git subtree命令:
git subtree add --prefix=sub/libpng libpng master --squash git subtree pull --prefix=sub/libpng libpng master --squash git subtree push --prefix=sub/libpng libpng master