最近公司組織架構調整,整個組換到新部門,需要將原來組內的項目代碼,全部遷移到新的 group 中去(公司用的 gitlab 伺服器),要求保留所有的提交記錄、分支和標簽。我當然知道 Gitlab 本身是支持創建倉庫時通過鏈接導入的,但前提是管理員開啟相關功能。我們此處只講命令遷移方案。 ...
最近公司組織架構調整,整個組換到新部門,需要將原來組內的項目代碼,全部遷移到新的 group 中去(公司用的 gitlab 伺服器),要求保留所有的提交記錄、分支和標簽。
我當然知道 Gitlab 本身是支持創建倉庫時通過鏈接導入的,但前提是管理員開啟相關功能。我們此處只講命令遷移方案。
本文同步發佈於個人網站 https://ifuyao.com
一、遷移命令
命令遷移有三種方案。
1. 直接PUSH
- 保證本地倉庫最新
# 若本地沒有倉庫,則直接 clone 倉庫到本地
$ git clone git@host:group1/repo.git && cd repo
# 若本地已有倉庫,則拉取分支和標簽
$ git pull && git pull --tags
# 設置源
$ git remote set-url origin git@host:group2/repo.git
# 推送分支和標簽
$ git push && git push --tags
2. 鏡像
可以將源端倉庫,鏡像克隆到本地,再鏡像推送到目的端。
git clone --mirror git@host:group1/repo.git
git push --mirror git@host:group2/repo.git
3. 裸倉庫
可以將源端倉庫,克隆下來裸倉庫,再鏡像推送到目的端。
$ git clone --bare git@host:group1/repo.git
$ git push --mirror git@host:group2/repo.git
裸倉庫是 git 中的一個概念,只要在克隆時加一個 -–bare 選項即可。裸倉庫可以再次push到另一個源,所以可以完成我們倉庫遷移的任務。
需要註意,克隆下來的裸倉庫中只有 .git 內容,是沒有工作目錄的。這是不同於鏡像倉庫的地方。
二、批處理腳本
我們需要遷移的項目有幾十個,所以我這邊寫了個簡單的批處理腳本,在此也也分享給有需要的伙伴。
輸入文件 repos.txt
中按行寫入要遷移的倉庫名稱:
repo1
repo2
repo3
Linux/MacOS 遷移腳本 migrate.sh
#!/bin/bash
remote_old=git@host1:group1
remote_new=git@host2:group2
while read repo
do
echo $repo
git clone --bare "$remote_old/${repo}.git"
cd "${repo}.git"
git push --mirror "$remote_new/${repo}.git"
cd ..
rm -fr "${repo}.git"
done < repos.txt
Windows 遷移腳本 migrate.bat
@echo off
set remote_old=git@host1:group1
set remote_new=git@host2:group2
set input_file=repos.txt
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ %input_file%"`) do (
call :process %%a
)
goto :eof
:process
SETLOCAL EnableDelayedExpansion
set "repo=!%1!"
set "repo=!repo:*:=!"
echo !repo!
git clone --bare "%remote_old%/!repo!.git"
cd "!repo!.git"
git push --mirror "%remote_new%/!repo!.git"
cd ..
rmdir "!repo!.git"
ENDLOCAL
goto :eof
若對您有用,請一鍵三連(點贊、收藏、轉發),謝謝!
本文已獨家授權給公眾號 邏魔代碼 ,未經允許,禁止轉載!