git subtree教程

關於子倉庫或者說是倉庫共用,git官方推薦的工具是git subtree。 我本身也用了一段時間的git subtree,感受比git submodule好用,可是也有一些缺點,在可接受的範圍內。
因此對於倉庫共用,在git subtree 與 git submodule之中選擇的話,我推薦git subtree。html

git subtree是什麼?爲何使用git subtree

git subtree 能夠實現一個倉庫做爲其餘倉庫的子倉庫。
imagegit

使用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 的使用

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:
image

git log查看詳細修改:
image

執行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命令

咱們已經知道了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

更多

相關文章
相關標籤/搜索