Git 中一个类似 Composer 的工具(二) – Subtree

之前有说过另外一个 Git Submodule,两个的作用基本类似

不过 Git Submodule 这是 Git 官方以前的推荐方案。从 Git 1.5.2 开始,Git 新增并推荐使用 Git Subtree 这个功能来管理子项目

Git Submodule 和 Git Subtree 都是官方支持的功能,不具有依赖管理的功能,但能满足我们的要求。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>]

--prefix之后的=等号也可以用空格

在父仓库中新增子仓库

例:执行以下命令将git-submodule添加到git-subtree

语法:git subtree add --prefix <子目录名> <子仓库名> <分支>

$ git subtree add --prefix git-submodule git@github.com:sy-records/git-submodule.git master --squash

--squash参数表示不拉取历史信息,而只生成一条 commit 信息

执行git status以后可以看到提示新增两条 commit :

$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

nothing to commit, working tree clean

git log查看详细修改:

$ git log
commit 8a53327502bb3c9dc3493cbca5e218b512954d36 (HEAD -> master)
Merge: 962fe07 a0d88ed
Author: sy-records <52o@qq52o.cn>
Date:   Sun Jan 6 19:09:39 2019 +0800

    Merge commit 'a0d88ed7453c453b498e078cdab303c52952ea84' as 'git-submodule'

commit a0d88ed7453c453b498e078cdab303c52952ea84
Author: sy-records <52o@qq52o.cn>
Date:   Sun Jan 6 19:09:38 2019 +0800

    Squashed 'git-submodule/' content from commit 709687c

    git-subtree-dir: git-submodule
    git-subtree-split: 709687c94ed74ae3ddff0daffdd9a9adb29e3eb0

执行git push即可

从源仓库拉取更新

如果git-submodule源仓库更新了,git-subtree怎么拉取更新呢?

语法:git subtree pull --prefix <子目录名> <子仓库名> <分支>

$ git subtree pull --prefix git-submodule git@github.com:sy-records/git-submodule.git master --squash

推送修改到源仓库

如果本地修改了git-submodule库,怎么推送上去呢?

语法:git subtree push --prefix <子目录名> <子仓库名> <分支>

# 执行正常 git add 以及 git commit

# 推送到 git-submodule 仓库 确认你有写权限
$ git subtree push --prefix git-submodule git@github.com:sy-records/git-submodule.git master

# 推送到 git-subtree 仓库
$ git push

简化 git subtree 命令

我们已经知道了git subtree的命令的基本用法,但是上述几个命令还是显得有点复杂,特别是子仓库的源仓库地址

这里我们把子仓库的地址作为一个 remote,方便操作:

语法:git remote add -f <子仓库名> <子仓库地址>

-f意思是在添加远程仓库之后,立即执行 fetch

$ git remote add -f git-submodule git@github.com:sy-records/git-submodule.git

然后可以这样来使用git subtree命令:

git subtree add --prefix git-submodule git-submodule master --squash
git subtree pull --prefix git-submodule git-submodule master --squash
git subtree push --prefix git-submodule git-submodule master

2 条评论

发表评论

*