git仓库的迁移通常采用以下办法:
git clone --bare https://github.com/exampleuser/old-repository.git
cd old-repository
git push --mirror https://github.com/exampleuser/new-repository.git
来进行还原
如果遇到只有本地clone的仓库,线上仓库已经无法访问
执行以下命令:
git push -mirror
则会遇到 deny updating a hidden ref 这样的报错
类似:
! [remote rejected] refs/pull/1/head -> refs/pull/1/head (deny updating a hidden ref)
! [remote rejected] refs/pull/1/merge -> refs/pull/1/merge (deny updating a hidden ref)
这个时候不要慌,采用以下办法也可以还原线上仓库
第一步:在线上创建一个空的仓库。
第二步:使用脚本
cd repository
# 检查仓库是否存在(如果不存在)
if [ ! -d ".git" ]; then
echo "error: no git file !"
exit 1
fi
git push --set-upstream origin --all # 先把本地checkout的分支push上去
repos=$(git remote show origin) # 获取本地仓库所有分支列表
echo "$repos" | while
read line; # 读取每一行的分支
do
if [[ "$line" == *"(use 'git remote prune' to remove)" ]]; then # 如果这一行的分支提示在线上仓库没有
IFS=' ' read -ra ADDR <<< "$line" #对这一行的提示做空格分割
result=${ADDR[0]#refs/remotes/origin/} #去除这一行提示的前面内容refs/remotes/origin/
git push -f origin refs/remotes/origin/${result}:refs/heads/${result} #推送到线上仓库的origin下,具体的根据自己仓库路径来
fi
done
这一段可以写一个shell脚本,传入多个仓库路径,对多个仓库进行还原