一個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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 開發中我們經常會遇到這樣的情況:項目越來越大,一些通用的模塊我們希望將他抽離出來作為單獨的項目,以便其他項目也可以...
    feil0n9wan9閱讀 20,123評論 0 24
  • git branch 查看本地所有分支 git status 查看當前狀態 git commit 提交 git b...
    猿萬閱讀 5,099評論 1 45
  • 1,查看所有遠程分支:%git branch -r 2, 拉取遠程分支并創建本地分支git checkout -...
    will666閱讀 2,091評論 0 18
  • Git 基礎 基本原理 客戶端并不是只提取最新版本的文件快照,而是把代碼倉庫完整的鏡像下來。這樣一來,任何一處協同...
    __silhouette閱讀 15,942評論 5 147
  • 新入手的win10系統,前幾天就裝好了Eclipse Nero 3用于C++代碼的開發和調試,只是一直沒有時間使用...
    VinceZeng閱讀 681評論 0 0