【转载】Git多项目管理

略删改。

对于处理子项目,即Git仓库包含Git仓库的情况:Git一开始引入了submodule功能,后面Git在1.8.0版本引入了git subtree这个命令,它使用Git的subtree merge策略来得到类似git submodule的结果。但本质上,它是将子项目的代码全部merge进父项目。使用git subtree,你不仅可以将其他项目合并为父项目的一个子目录,而且可以从父项目提取某个子目录的全部历史作为一个单独的项目

我看到还有不少人在使用submodule,不过操作这玩意有点复杂,既然有了高级的,就学习和使用高级点的。

添加子项目

将一个已存在的Git仓库以Subtree方式添加为子项目可以使用git subtree add --prefix=<prefix> <repository> <ref>命令,其中--prefix选项指定了子项目对应的子目录,--squash选项用以压缩Subtree的提交为一个,这样父项目的历史记录里就不会出现子项目完整的历史记录。我们还是以Hexo博客添加Hacker主题为例:

$ git clone /private/tmp/remote/feilongwang.org.git
Cloning into 'feilongwang.org'...
done.
$ cd feilongwang.org/
$ git subtree add --prefix=themes/Hacker /private/tmp/remote/Hacker.git master --squash 
git fetch /private/tmp/remote/Hacker.git master
warning: no common commits
remote: Counting objects: 216, done.
remote: Compressing objects: 100% (143/143), done.
remote: Total 216 (delta 70), reused 216 (delta 70)
Receiving objects: 100% (216/216), 56.22 KiB | 0 bytes/s, done.
Resolving deltas: 100% (70/70), done.
From /private/tmp/remote/Hacker
 * branch            master     -> FETCH_HEAD
Added dir 'themes/Hacker'

更新子项目

一段时间之后,子项目可能有大量新的代码,父项目也想使用这些代码。此时父项目的维护者只需执行:

$ git subtree pull --prefix=themes/Hacker /private/tmp/remote/Hacker.git master --squash 
remote: Counting objects: 8, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 8 (delta 6), reused 0 (delta 0)
Unpacking objects: 100% (8/8), done.
From /private/tmp/remote/Hacker
 * branch            master     -> FETCH_HEAD
Merge made by the 'recursive' strategy.
 themes/Hacker/README.md                    | 2 +-
 themes/Hacker/layout/components/footer.ejs | 3 ++-
 2 files changed, 3 insertions(+), 2 deletions(-)

就可以将父项目中子项目对应目录里的内容更新为子项目最新的代码了。

如果你觉得每次都输入子项目完整的仓库url太麻烦,你也可以将子项目添加为追踪的仓库

$ git remote add hacker /private/tmp/remote/Hacker.git
$ git subtree add --prefix=themes/Hacker hacker master --squash
git fetch hacker master
From /private/tmp/remote/Hacker
 * branch            master     -> FETCH_HEAD
 * [new branch]      master     -> hacker/master
Added dir 'themes/Hacker'

提交子项目

如果我们在使用子项目的过程中,对子项目做了一些改动,同时我们又希望子项目的其他使用者也能共享这些改动,此时可以将我们的改动提交到子项目的远程仓库中。

$ git subtree push --prefix=themes/Hacker /private/tmp/remote/Hacker.git master
git push using:  /private/tmp/remote/Hacker.git master
Counting objects: 301, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (211/211), done.
Writing objects: 100% (301/301), 579.91 KiB | 0 bytes/s, done.
Total 301 (delta 67), reused 292 (delta 64)
remote: Resolving deltas: 100% (67/67), completed with 2 local objects.
To /private/tmp/remote/Hacker.git
   96ca04b..5565513  556551375034489fc8710070a29a2f22240a39b3 -> master

提取子项目

当我们开发一个项目若干时间后,希望将某个目录单独出一个项目来开发,同时又保留这部分代码历史提交记录,使用git subtree split可以很轻松的完成这个操作。以Hexo博客分离Hacker主题为例:

$ git subtree split --prefix=themes/Hacker --branch hacker
Created branch 'hacker'
843147f3181399b06528251451bc498e01425f34
$ git branch -a
  hacker
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git checkout hacker 
Switched to branch 'hacker'
$ git log
commit 843147f3181399b06528251451bc498e01425f34
Author: Feilong Wang <i@feilongwang.org>
Date:   Mon Sep 19 01:16:02 2016 +0800

    Change theme to Hacker

其中--branch指定将生成的历史提交记录保存到一个新的分支。


作者:feil0n9wan9
链接:https://www.jianshu.com/p/284ded3d191b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容