關(guān)于子倉庫或者說是倉庫共用显晶,git官方推薦的工具是git subtree道伟。 我自己也用了一段時(shí)間的git subtree敲董,感覺比git submodule好用碳竟,但是也有一些缺點(diǎn)顽染,在可接受的范圍內(nèi)漾岳。
所以對(duì)于倉庫共用,在git subtree 與 git submodule之中選擇的話粉寞,我推薦git subtree尼荆。
git subtree是什么?為什么使用git subtree
git subtree 可以實(shí)現(xiàn)一個(gè)倉庫作為其他倉庫的子倉庫唧垦。
使用git subtree 有以下幾個(gè)原因:
- 舊版本的git也支持(最老版本可以到 v1.5.2).
- git subtree與git submodule不同捅儒,它不增加任何像
.gitmodule
這樣的新的元數(shù)據(jù)文件. - git subtree對(duì)于項(xiàng)目中的其他成員透明,意味著可以不知道git subtree的存在.
當(dāng)然,git subtree也有它的缺點(diǎn)巧还,但是這些缺點(diǎn)還在可以接受的范圍內(nèi):
- 必須學(xué)習(xí)新的指令(如:git subtree).
- 子倉庫的更新與推送指令相對(duì)復(fù)雜鞭莽。
git subtree 的使用
git subtree的主要命令有:
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>]
準(zhǔn)備
我們先準(zhǔn)備一個(gè)倉庫叫photoshop,一個(gè)倉庫叫l(wèi)ibpng麸祷,然后我們希望把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
以下操作均位于父倉庫的根目錄中喷面。
在父倉庫中新增子倉庫
我們執(zhí)行以下命令把libpng添加到photoshop中:
git subtree add --prefix=sub/libpng https://github.com/test/libpng.git master --squash
(--squash
參數(shù)表示不拉取歷史信息,而只生成一條commit信息走孽。)
執(zhí)行git status
可以看到提示新增兩條commit:
git log
查看詳細(xì)修改:
執(zhí)行git push
把修改推送到遠(yuǎn)端photoshop倉庫惧辈,現(xiàn)在本地倉庫與遠(yuǎn)端倉庫的目錄結(jié)構(gòu)為:
photoshop
|
|-- sub/
| |
| \--libpng/
| |
| |-- libpng.c
| |-- libpng.h
| \-- README.md
|
|-- photoshop.c
|-- photoshop.h
|-- main.c
\-- README.md
注意,現(xiàn)在的photoshop倉庫對(duì)于其他項(xiàng)目人員來說融求,可以不需要知道libpng是一個(gè)子倉庫咬像。什么意思呢?
當(dāng)你git clone
或者git pull
的時(shí)候生宛,你拉取到的是整個(gè)photoshop(包括libpng在內(nèi)县昂,libpng就相當(dāng)于photoshop里的一個(gè)普通目錄);當(dāng)你修改了libpng里的內(nèi)容后執(zhí)行git push
陷舅,你將會(huì)把修改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仰剿,然后想把這個(gè)修改推送到源libpng倉庫呢创淡?使用git subtree push
,例如:
git subtree push --prefix=sub/libpng https://github.com/test/libpng.git master
簡化git subtree命令
我們已經(jīng)知道了git subtree 的命令的基本用法南吮,但是上述幾個(gè)命令還是顯得有點(diǎn)復(fù)雜琳彩,特別是子倉庫的源倉庫地址,特別不方便記憶部凑。
這里我們把子倉庫的地址作為一個(gè)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