1. 程式人生 > >git拆分子目錄作為新倉庫並保留log記錄

git拆分子目錄作為新倉庫並保留log記錄

需求描述現有一個非常之龐大(大的過分)git倉庫,包含了N多個專案的原始碼,專案各個階段的文件,原型等。對於新使用者來說,clone一次需要很長時間(網速也是槽點)。因此決定將原倉庫拆分,將原始碼子目錄作為一個新的倉庫,並且需要保留和子目錄相關的log記錄。
一.前期準備所有的命令在Git-shell中進行1. 原倉庫在本地的目錄結構如下圖:

1524103977(1).png (10.27 KB, 下載次數: 0)

下載附件  儲存到相簿

1 小時前 上傳

2. 描述約定    為了更好的描述命令,先定義一下命令中佔位符的意義 原倉庫:<old-repo>新倉庫:<new-repo>想要分離出來的子資料夾名稱:
<name-of-folder>新的遠端地址:<new-git-url>注意:如果你在使用 Windows,且該資料夾深度 > 1,你必須使用斜槓  / 作為目錄分隔符而不是預設的反斜槓 \二.遷移(使用filter-branch命令由於我需要遷移的子目錄包含中文名,因此需要使用filter-branch命令來實現遷移,當然,如果不包含中文的目錄也可以使用git1.8版本以後的subtree來實現,該方法稍後說明。
1. 首先,clone 一份原倉庫並刪掉原來的 remote:(依次執行以下命令)1git clone <big-repo>  <new-repo>
2cd <new-repo>3git remote rm origin
2. 然後執行如下命令(這是重點):1git filter-branch --tag-name-filter cat --prune-empty --subdirectory-filter <name-of-folder> -- --all這條命令同樣會過濾所有歷史提交,只保留所有對指定子目錄有影響的提交,並將該子目錄設為該倉庫的根目錄。這裡說明各下個引數的作用:--tag-name-filter 該引數控制我們要如何處理舊的 tagcat 即表示原樣輸出;--prune-empty 刪除空的(對子目錄沒有影響的)提交;
--subdirectory-filter 指定子目錄路徑;-- --all 該引數必須跟在  -- 後面,表示對所有分支進行操作。如果你只想儲存當前分支,也可以不新增此引數。
3. 清理.gitobject當上述命令執行完畢後,就可以看到本地的新倉庫已經是原倉庫子目錄中的內容了,且保留了關於該子目錄所有的提交歷史。不過只是這樣的話新倉庫中的.git 目錄裡還是儲存有不少無用的 object,我們需要將其清除掉以減小新倉庫的體積(如果你用subtree 的方法的話是不需要執行這一步的)。依次執行以下命令:1git reset --hard2git for-each-ref --format="%(refname)" refs/original/ |xargs -n 1 git update-ref -d3git reflog expire --expire=now --all4git gc --aggressive --prune=now
4. 將新的本地倉庫推送到遠端cd<new-repo>(1)新增遠端地址:                git remote add origin <new-git-url>(2)推送到遠端:                git push -u origin master
特別注意:如果當前遠端庫是空的話,上述命令是好使的,由於我開始手賤,已經在新的git地址clone到本地,並且還新建了一個測試資料夾,因此導致新的git倉庫的master不再是最新的了。因此可以先提交到dev分支:git push origin master:dev5. 合併devmaster(可選)如果第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> 所在的目錄,建立一個<name-of-new-branch>的臨時分支,執行:git subtree split -P <name-of-folder> -b <name-of-new-branch>
2. 然後,我們建立一個新的 git 倉庫:1mkdir  <new-repo>2git init3. 接著把原倉庫中的臨時分支拉到新倉庫中:git pull </path/to/big-repo>  <name-of-new-branch>
好了,完成。現在看看你的新倉庫,是不是已經包含了原子資料夾中的所有檔案和你之前在原倉庫中的所有提交歷史呢?後續步驟就可參照第二章中的3,4,5步了。雖然網上一搜一大堆,還是希望能幫助有需要的同學,至少可以避免我踩過的坑了。

相關推薦

git拆分子目錄作為倉庫保留log記錄

需求描述:現有一個非常之龐大(大的過分)的git倉庫,包含了N多個專案的原始碼,專案各個階段的文件,原型等。對於新使用者來說,clone一次需要很長時間(網速也是槽點)。因此決定將原倉庫拆分,將原始碼子目錄作為一個新的倉庫,並且需要保留和子目錄相關的log記錄。一.前期準備所

git怎麽fork一個倉庫pull request

name 應該 會有 lob lap 再看 何事 identity pos 一、使用git push <-----------就是這個玩意 1、設置用戶信息 當安裝完 Git 應該做的第一件事就是設置你的用戶名稱與郵件地址。 這樣做很重要,因為每

在linux上安裝nexus作為私有倉庫實現上傳下載jar包

最近的專案用到了分散式架構,分散式的好處自然不用多說,但有一個問題就是如何處理公共類或者說工具類,比方說時間格式轉換、生成隨機數、生成訂單號這些開發人員都要用到的函式,不可能讓每個開發人員都維護一個這樣的工具類,因此,想到了利用打包成jar包並上傳到maven倉庫的方式,讓開發人員可以共享公有類

使用git遷移git專案保留提交記錄

場景 在平時開發中我們有自己的git倉庫,組內提交都是在這個庫。突然有一天,領導說要把這個庫整合到另一個更大的工程中(華為雲的看板),那裡面有前後端的程式碼;為了方便大家查詢,我們需要將各個組的程式碼遷移到同一個大工程下。 問題 提交要保留提交記錄 changelog要保留 組內成員要保留

Git倉庫遷移保留提交記錄

一、建立新倉庫1、從原地址克隆一份裸版本庫git clone --bare https://[email protected]/bitbucket/scm/sup/kos_datasync.g

匯入另一個 Git庫到現有的Git保留提交記錄

提取出的主要步驟如下: 1 切換到要合併到的倉庫 2 git remote add 倉庫名 被合併倉庫路徑 3 git fetch --all 4 git merge 倉庫名/被合併倉庫想合併的分支 問題描述: 我在本地有兩個Git庫專案(D1=PC專案  包含通用

Git、GitHub、GitLab】三 Git基本命令之建立倉庫倉庫中新增檔案

前兩篇文章已經學會了Git的基本命令與建立倉庫的命令,點選連結檢視上一篇文章:【Git、GitHub、GitLab】二 Git基本命令之建立Git倉庫,本篇文章就來建立一個有模有樣的倉庫。該倉庫中的程式碼是一個顯示靜態頁面的小工程程式碼。 文章目錄

將CVS遷移到Git保留歷史記錄和分支

二話不說,先看程式碼:cat run.sh #!/bin/sh #rsync -av [email protected]::/cvshome/module/ /data/cvs_migration/CVSRepo/module rm -rf /data/cv

git--tortoiseGit建立一個遠端倉庫提交

先將一些實際的應用,再來講講git的底層命令原理; 這回利用小烏龜視覺化工具,將本地一個專案管理起來,並且利用csdn的code中心,建立這個專案的遠端倉庫; 先在code.csdn.net建立一個遠端倉庫專案; 建立起一個空的遠端倉庫,用來作為本地專案的遠端倉庫; 公

合併兩個git倉庫保留每個倉庫的歷史

     問題:有兩個git倉庫 repository1和repository2,想把repository2合併到repository1,並在repository1中保留repository2的所有分支歷史    方案:  1.在repository1中新增遠端分支,,跟蹤

git】在git遠端倉庫中建立一個專案把原生代碼提交上去

一、確保你有管理員許可權。 如果你還不是管理員,請讓當前管理員編輯gitosis-admin專案下的gitosis.conf檔案,在[group gitosis-admin]下的members行裡新增你的名字。 二、把gitosis-admin專案clone下來 三、現

Git 本地新建,刪除分支推送到遠程倉庫

out java branch match upstream ast github上 onf fault 在本地新建一個分支: git branch newBranch 切換到你的新分支: git checkout newBranch 創建並切換到新分支: git che

idea為本地項目創建倉庫git到雲上

code allow baidu 關聯 nbsp people 分享圖片 tail itl 1、為本地項目創建一個本地倉庫: 2、在碼雲上創建一個倉庫,(初始化的時候先不要創建README.md文件) 3、本地倉庫關聯遠程倉庫:右鍵項目選址git>>repos

eclipse 整合maven、git。 eclipse 建立maven專案上傳到騰訊git(或阿里雲git、gitlab、github、公司內部git伺服器等git倉庫

我們先起git倉庫和專案起好名字 git倉庫名:TestGit 專案名:TestGit   1、下載安裝git: https://blog.csdn.net/xiaoshizi4/article/details/83478594 2、下載安裝maven:&nb

git怎麼fork一個倉庫pull request

    一、使用git push     <-----------就是這個玩意 1、設定使用者資訊 當安裝完 Git 應該做的第一件事就是設定你的使用者名稱稱與郵件地址。 這樣做很重要,因為每一個 Git 的提交都會使用

將原生代碼資料夾作為分支新增到遠端倉庫

將原生代碼資料夾作為新分支新增到遠端倉庫 在windows系統下使用Git,想要將原生代碼資料夾作為新分支新增到遠端倉庫,經過個人實踐,驗證以下操作有效: 1.      在程式碼資料夾右鍵GitBash Here 2. &nb

使用git初始化本地倉庫提交到遠端分支

1. 初始化本地倉庫 git init 2. 將本地內容新增至git索引中 git add . 3. 將索引新增至本地倉庫中 git commit -m "first commit" 4. 新增遠端倉庫路徑 git remote add origin http

git 本地建立專案上傳到github

之前一直是從github上面clone專案下來,這次搞懂了如何本地建立git專案並上傳,記錄下步驟: 1、在github網站上面建立遠端倉庫,url 2、本地目錄中初始化專案(視為本地git已經配置好了):git init 3、和遠端倉庫建立聯絡:git remote add ori

git實操筆錄一:刪除所有提交歷史記錄,成為一個倉庫

在使用git的過程中,大家有時會複製一個git倉庫專案作為模板進行新專案開發,這樣老專案提交的歷史記錄也同樣存在新專案中,我們該怎麼去掉這些歷史記錄呢?讓這個新專案成為一個乾淨的新的專案,可以看看我的操作: 1.建立新分支並且切換到新分支中: git checkout --o

Git學習第(二)篇:Git建立本地倉庫與GitHub遠端倉庫關聯

本文基於Windows系統進行相關的配置。 1、建立本地Git倉庫 上一篇文章Git學習第(一)篇:Git下載與安裝中已經介紹了Git下載和安裝的方法,並按照裡面的步驟完成了安裝,接下來需要建立本地倉庫 第一步,找到需要建立Git倉庫的專案資料夾,比如我的專案為html5,