需求描述
:現有乙個非常之龐大(大的過分)
的git
倉庫,包含了
n多個專案的原始碼,專案各個階段的文件,原型等。對於新使用者來說,
clone
一次需要很長時間(網速也是槽點)。因此決定將原倉庫拆分,將原始碼子目錄作為乙個新的倉庫,並且需要保留和子目錄相關的
log 記錄。
一.前期準備
所有的命令在git-shell中進行
1. 原倉庫在本地的目錄結構如下圖:
1524103977(1).png
1 小時前 上傳
2. 描述約定
為了更好的描述命令,先定義一下命令中佔位符的意義
原倉庫:
新倉庫:
想要分離出來的子資料夾名稱:
注意:如果你在使用 windows
,且該資料夾深度
> 1
,你必須使用斜槓 /
作為目錄分隔符而不是預設的反斜槓 \
二.遷移(使用
filter-branch
命令)
由於我需要遷移的子目錄包含中文名,因此需要使用filter-branch
命令來實現遷移,當然,如果不包含中文的目錄也可以使用git1.8
版本以後的
subtree
來實現,該方法稍後說明。
1. 首先,clone
乙份原倉庫並刪掉原來的
remote
:(依次執行以下命令)
(1 )git clone
(2 )cd
(3 )git remote rm origin
2. 然後執行如下命令(
這是重點):
(1 )
git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter -- --all
這條命令同樣會過濾所有歷史提交,只保留所有對指定子目錄有影響的提交,並將該子目錄設為該倉庫的根目錄。這裡說明各下個引數的作用:
--tag-name-filter
該引數控制我們要如何處理舊的
tag,
cat
即表示原樣輸出;
--prune-empty
刪除空的(對子目錄沒有影響的)提交;
--subdirectory-filter
指定子目錄路徑;
-- --all
該引數必須跟在
-- 後面,表示對所有分支進行操作。如果你只想儲存當前分支,也可以不新增此引數。
3. 清理.git
的object
當上述命令執行完畢後,就可以看到本地的新倉庫已經是原倉庫子目錄中的內容了,且保留了關於該子目錄所有的提交歷史。不過只是這樣的話新倉庫中的
.git 目錄裡還是儲存有不少無用的
object
,我們需要將其清除掉以減小新倉庫的體積(如果你用
subtree
的方法的話是不需要執行這一步的)。
依次執行以下命令:
(1 )git reset --hard
(2 )git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d
(3 )git reflog expire --expire=now --all
(4 )git gc --aggressive --prune=now
4. 將新的本地倉庫推送到遠端
cd 到
(1) 新增遠端位址:
git remote add origin
(2)推送到遠端:
git push -u origin master
特別注意:
如果當前遠端庫是空的話,上述命令是好使的,由於我開始手賤,已經在新的git位址clone到本地,並且還新建了乙個測試資料夾,因此導致新的git倉庫的master不再是最新的了。因此可以先提交到dev分支:git push origin master:dev
5. 合併dev
到master
(可選)
如果第4
步已經直接推動到
master
了。第5
步可忽略。
(1) 首先將本地dev
合併到本地
master
① 切換到master
分支②git merge origan/dev
--allow-unrelated-histories
由於是第一次合併,因此需要加上
--allow-unrelated-histories
,允許兩個沒有關聯的歷史合併在一起。後續的合併就不需要了。
(2) 將本地master push
到遠端(3)至此,使用
filter-branch
方式拆分git庫已經完成。有木有心動,去試試吧。
三.補充subtree方式遷移
要求拆分的目錄沒有中文名
1. 首先,進入<
big-repo>
所在的目錄,建立乙個
的臨時分支,執行:
git subtree split -p -b
2. 然後,我們建立乙個新的 git
倉庫:(1 )
mkdir
(2 )
git init
3. 接著把原倉庫中的臨時分支拉到新倉庫中:
git pull
好了,完成。現在看看你的新倉庫,是不是已經包含了原子資料夾中的所有檔案和你之前在原倉庫中的所有提交歷史呢?後續步驟就可參照第二章中的3,4,5步了。
雖然網上一搜一大堆,還是希望能幫助有需要的同學,至少可以避免我踩過的坑了。
參考:
git拆分子目錄作為新倉庫並保留log記錄和分支
1.將所有遠端分支拉取到本地 git branch r grep v while read remote dogit branch track remote done git fetch all git pull allclone 乙份原倉庫並刪掉原來的 remote 依次執行以下命令 1 git ...
python建立子目錄並在子目錄下建立檔案
import os 首先判斷當前工作目錄下是否存在目錄machine learning ifnot os.path.isdir machine learning 不存在的話就建立子目錄machine learning 因為父目錄存在,所有這裡用mkdir也可以 os.makedirs machine...
iview admin nginx 部署子目錄
1 修改專案下的 vue.config.js 部署環境改為子目錄的名稱 2 nginx配置 這裡使用alias 不能用root server 3 alias和root的區別 實際util.js 檔案是在dist js 目錄下,這樣會訪問不到資源 4 前後端分離,正式環境nginx配置 設定正式環境下...