git subtree
git subtree 的用法
假如有一个iOS的项目,我用到了很多外部的库,如AFNetworking
,我怎么把它集成进来呢?
通过submodule的方法
把这个项目追加到自己是项目中:
git submodule add git@github.com:AFNetworking/AFNetworking.git Vendor/AFNetworking
然后看看因此而出现的问题:
好吧,如果当你发现一个AFNetworking的bug呢.而且你有办法能够fix它,通过submodule, 怎么办?
通常都是这样的:
- 先fork这个项目
- 修改之前添加的那个submodule,改成对应你自己fork的那一个,
- 修改你的那个fork
- 来一个pull request 给AFNetworking.
- 等待那个PR是否能够通过, 且同时保持你的fork能够最新,
- 如果接受了,那就再把你的submodule给切到官方的repo上,
- 继续
好吧,我感觉到什么的路子很屎.如果你没有真正体验过你是感觉不到到底有多屎的.
如果subtree的方式
首先还是添加那个工程到你的
git subtree add –prefix=Vendor/AFNetworking –squash git@github.com:AFNetworking/AFNetworking.git master
看上去很相似目前为止除了你的伙伴不知道怎么git submodule update
,因为subtrees确实是把source保存在你的项目中的.
现在,我们再看看上面出现的场景,有了bug怎么办,处理上有什么不同的呢?
我做了修改,然后提交到了我的repo中,技术上来说,我现在可以停下来,因为修复bug的代码就在我的repo里,但是,我是一个好的开源市民啊,我要怎么办呢?
做一个好的开源市民
- 我要fork AFNetworking 这个repo到我的项目中
- 回到的本地的repo
git subtree split –prefix=Vendor/AFNetworking/ –branch AFNetworking
通过这个命令配置,可以让我推这个修改到我的分支上,而不是等待做一个PR,然后等待merge,帅不?
git push git@github.com:kvnsmth/AFNetworking.git AFNetworking:critical-bug-fix
- 我会建立一个PR希望能够被merge, 这个方式有很大的不同就是合并我的PR与否都不会影响我轻松得和官方的AFNetworking同步.
我还可以这样做:
git subtree pull –prefix=Vendor/AFNetworking –squash git@github.com:AFNetworking/AFNetworking.git master
这样我可以保持和官方最新的代码同步.
现在,我想这样的方式大大的好于使用submodule
的方式