一个Git仓库管理多个Git项目

副标题: 使用Git配合Dropbox管理资料

目的

平时我会把所有需要储存的资料都用git进行管理.

我需要使用一个命令, 把工作中所有git仓库都提交到自己的阿里云或Dropbox上, 在不同的地方使用它.

使用git配合Dropbox的另外一个好处是, 由于 .gitignore 忽略了许多公共资源, Dropbox只需要储存很少的内容:

如图, 我的所有项目文件有8.75GB, 但是Dropbox上只保存着430MB的仓库, 并且还拥有Git的版本管理功能.

如果你有和我一样的需求, 这篇文章会帮到你.

需要解决问题

  1. 每个Git仓库保留自己原有的Git功能, 并且不能有丝毫改动, 毕竟它们还需要保持平日的工作
  2. Git Submodule 和 SubTree 对原有仓库有改动, 并且不能很好的实现以上需求
  3. 有一个统一的仓库管理这些所有仓库

使用 merge-sub-gits 解决以上问题

安装

首先得确保当前有Nodejs环境, 安装 merge-sub-gits

npm install -g merge-sub-gits

原理及命令

思路很简单:

  • 当git提交或拉取之前,把子git项目的.git文件夹重命名为.__originGit__文件夹,
  • 当提交或拉取之后, 把.__originGit__文件夹重命名回.git

shell 命令

# 遍历当前目录子文件,把所有 .git 重命名为 .__originGit__
merge-sub-gits origin -l 

# 遍历当前目录子文件,把所有 .__originGit__ 重命名回 .git
merge-sub-gits local

# 打印重命名日志
merge-sub-gits xxx -l 

提交项目

merge-sub-gits origin -l #遍历当前目录子文件,把所有 .git 重命名为 .__originGit__
git add .
git commit -m 'xxx'
git push
merge-sub-gits local #遍历当前目录子文件,把所有 .__originGit__ 重命名回 .git

其中添加 -l 参数会打印重命名日志

拉取项目

merge-sub-gits 'origin' -l
git pull
merge-sub-gits 'local'

为以上操作设定shell快捷函数

每次都需要使用 merge-sub-gits 命令包括 git 提交操作很是繁琐, 我们可以在~/.bash_profile文件中添加以下内容:

# 递归修改子git项目, 从根git项目统一提交
function merge-sub-push(){
  merge-sub-gits 'origin' -l
  git add .
  if [ "$1" == "" ];then
    git commit -m "no commit message"
  else 
    git commit -m "$1 $2 $3 $4 $5 $6 $7 $8 $9"
  fi
  git push
  merge-sub-gits 'local'
}

# 拉取所有项目
function merge-sub-pull(){
  merge-sub-gits 'origin'
  git pull
  merge-sub-gits 'local' -l
}

然后平时直接使用以下命令提交:

# 提交
merge-sub-push 修复了以下bug 1.xxx 2.xxx

# 拉取
merge-sub-pull

配合Dropbox或各类网盘使用

如果上文你已经看懂了, 并且有一些基本的Git使用经验, 下文就不需要继续阅读了, 相信你自己就可以使用 merge-sub-gits 完成目的.

我们平时会有需要把工作文件放入各类网盘中, 方便在公司和家里进行同步, 但是Dropbox\iCloud等网盘都没有给予文件夹忽略和更细腻的Git的文件历史.

例如一个React前端项目大概有几百MB, 如果忽略node_modules文件夹就只剩下十几MB.

我们可以把所有工作和电脑环境相关的资料都放入一个work文件, 使用merge-sub-gits把改文件夹的内容同步到网盘中:

首先在Dropbox中创建一个 backup-all.git 仓库

# 使用iCloud就把仓库创建在: ~/Library/Mobile Documents/com~apple~CloudDocs/
# 使用Dropbox就把仓库创建在: ~/Dropbox

cd ~/Dropbox
git init --bare backup-all.git

# 在~目录克隆本地git
cd ~
git clone ~/Dropbox/backup-all.git

我们已经在Dropbox中创建了一个仓库, 并且clone到了本地, 接下来我们拷贝所有需要备份的文件都放入 ~/backup-all 文件夹中, 然后继续下面的操作:

使用 merge-sub-gits 进行备份

cd ~/backup-all

# 备份
# 记得提前创建.gitignore文件, 并且编写好需要忽略的内容
merge-sub-push

# 读取
merge-sub-pull

如前文所述, 通过.gitignore文件和git的压缩, 把8.75GB的内容, 变为430MB进行网盘管理, 并且还有Git的版本管理功能.

清理Dropbox

由于Git仓库中保存了许多历史信息, 随着长时间的使用, Git 仓库会缓慢的逐步增大, 由于我们所有子项目都保留着自己的Git历史, 所以如果有一天根Git仓库太冗余了, 我们只需要删除Dropbox的Git,重新提交即可.

修复已屏蔽的子git项目

如果曾经在根git项目中使用过git commit, 会把子git项目标记为忽略提交
这种情况需要清空git记录:

# 从当前分支替换并清空master分支
git checkout --orphan latest_master
merge-sub-gits 'origin' -l
git add .
git commit -m "clear master"
git branch -D master
git branch -m master
git push -f origin master
merge-sub-gits 'local'

使用到的库

欢迎 Star: github.com/ymzuiku/merge-sub-gits

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

推荐阅读更多精彩内容

  • 开发中我们经常会遇到这样的情况:项目越来越大,一些通用的模块我们希望将他抽离出来作为单独的项目,以便其他项目也可以...
    feil0n9wan9阅读 19,872评论 0 24
  • git branch 查看本地所有分支 git status 查看当前状态 git commit 提交 git b...
    猿万阅读 5,025评论 1 45
  • 1,查看所有远程分支:%git branch -r 2, 拉取远程分支并创建本地分支git checkout -...
    will666阅读 2,051评论 0 18
  • Git 基础 基本原理 客户端并不是只提取最新版本的文件快照,而是把代码仓库完整的镜像下来。这样一来,任何一处协同...
    __silhouette阅读 15,853评论 5 147
  • 新入手的win10系统,前几天就装好了Eclipse Nero 3用于C++代码的开发和调试,只是一直没有时间使用...
    VinceZeng阅读 655评论 0 0