之前前后端的多個(gè)項(xiàng)目代碼都放在一個(gè)倉庫姻政,版本管理起來比較混亂,于是現(xiàn)在決定將各個(gè)項(xiàng)目的代碼獨(dú)立出來做單獨(dú)的版本管理厉熟,下面介紹一下本次遷移所用的一些技術(shù)手段
遷出工具介紹
https://github.com/newren/git-filter-repo
安裝方式
我這里使用的方式是斟或,當(dāng)然你也可以使用其他的包管理器
brew install git-filter-repo
windows系統(tǒng)的可以下載對應(yīng)的python腳本,然后按照安裝文檔的說明進(jìn)行操作痊臭。(windows沒有預(yù)安裝python,先安裝python3版本)
使用git-filter的好處是會(huì)過濾掉不屬于該目錄的提交信息登夫,并且會(huì)自動(dòng)把remote上所有的分支checkout到本地广匙,方便后續(xù)處理。
操作步驟
這里自己操作的時(shí)候參考git文檔恼策,具體步驟已經(jīng)寫的很詳細(xì)了鸦致,我這里就不在贅述了。
由于這次操作了好幾個(gè)倉庫涣楷,每次都這樣來操作難免有些麻煩分唾,可以將上述操作的部分整合為一個(gè)shell腳本
rm -rf [dir] # dir是原倉庫克隆下來后生成的文件夾名
git clone [originUrl]
cd [dir]
git filter-repo --path $1 --force
# 如果全局username和email不一致,可以順便把這個(gè)處理一下
git config user.name "username"
git config user.email "useremail"
git remote add origin $2
git config pull.rebase false # merge 如果想用rebase的方式可以使用其他設(shè)定
git pull origin master --allow-unrelated-histories
我這里命名為command.sh,使用的時(shí)候新建一個(gè)文件夾狮斗,將這個(gè)sh文件放進(jìn)去绽乔,然后根據(jù)自身系統(tǒng)環(huán)境執(zhí)行
zsh command.sh [path] [remoteUrl]
上面的path輸入原先子文件夾的目錄名,remoteUrl則是子文件夾后面對應(yīng)的遠(yuǎn)程倉庫地址
如果有無法執(zhí)行的情況碳褒,加上--force一般就可以了折砸。
后續(xù)處理&可優(yōu)化項(xiàng)
接下來就是選取本地的分支上傳到遠(yuǎn)程,這里推薦使用source tree沙峻,可以很方便的上傳多個(gè)本地分支到遠(yuǎn)程睦授。
然后現(xiàn)在會(huì)有一個(gè)遺留問題,就是會(huì)多嵌套一層原目錄摔寨,其實(shí)也很好理解原因去枷,以前的.git文件在原根目錄下,與子目錄平級(jí)是复,所以我們要做的就是把嵌套的這層目錄去掉删顶,將里面的文件移到根目錄,這里手動(dòng)操作一下即可淑廊。(切換到每個(gè)分支都需要這樣操作一次)
對應(yīng)的shell命令
mv [dir]/* . && rm -r [dir]
至此逗余,都是一些常規(guī)的git操作,也就不再多提了蒋纬。
可優(yōu)化項(xiàng)的思考
對于這種多項(xiàng)目和倉庫方式猎荠,一開始前后端放在一起,是為了Jenkins等一些CI工具的方便處理蜀备,如果需要主倉庫來管理多項(xiàng)目的关摇,其實(shí)是可以采用submodule的方式的,既可以將項(xiàng)目做一定的隔離碾阁,主倉庫也能做到管理子模塊詳情可以參考 這里
monorepo的使用输虱,對于多項(xiàng)目要使用同一個(gè)配置項(xiàng)或者方法時(shí)尤其適用,之前開發(fā)的時(shí)候碰到過不同端本質(zhì)上同一份配置文件因?yàn)樽侄蚊Q不一樣導(dǎo)致更新后還要處理各種兼容性問題脂凶,對心智造成很大的負(fù)擔(dān)宪睹,前端可以使用pnpm配合上面說的git submodule一起使用,主倉庫提供公共組件模塊蚕钦,子模塊負(fù)責(zé)各自的業(yè)務(wù)邏輯處理亭病,合理且高效
工作中使用的一些操作,使用腳本可以提高效率嘶居,但是shell腳本本身的邏輯處理語法比較麻煩罪帖,可以使用node.js這種前端比較熟悉的方式來做一些邏輯判斷和預(yù)設(shè)置,有時(shí)間可以處理一下邮屁。