git仓库迁移

背景

在github或者gitlab中,如果想从A仓库项目复制一份到B仓库,又要在B仓库中保留A项目的commit的log等记录时,直接拷贝文件的方式不能满足需求,这就需要用到git的一些命令处理(从用户userA的仓库复制一份到用户userB也是如此)。

流程

  1. 在userB下新建一个空的仓库B,新建时不要带任何文件,包括readme等。
  2. 在A仓库项目下,查看在A仓库的远程仓库地址
➜  git remote -v          
origin  git@git.xxx.com:userA/a-repository.git (fetch)
origin  git@git.xxx.com:userA/a-repository.git (push)          
  1. 在A仓库项目下,使用git remote set-url重置仓库A为B的远程仓库地址(关键步骤
➜  git remote set-url origin git@git.xxx.com:userB/b-repository.git 

查看A仓库是否重置为B的远程地址:

➜  git remote -v
origin  git@git.xxx.com:userB/b-repository.git  (fetch)
origin  git@git.xxx.com:userB/b-repository.git  (push)
  1. 上面步骤可以看到A仓库的remote url已经变成B的,也就是说,现在在A仓库项目下执行git push等命令,实际上是push到B仓库。-f强制更新,--all会push所有分支及commit的信息,如果不加--all的话,只会push当前分支及commit信息。
    在A仓库项目下执行:
➜  git push --all -f

如果在push的时候报错:

[remote rejected] master -> master (pre-receive hook declined)

这是因为B仓库默认的master分支是受保护的,需要取消保护之后才能push:
Setting->Repository->Protected Branches,把master分支unprotect即可。

  1. 去B仓库就可以看到分支信息和commit信息了。此时,在A仓库项目下恢复A仓库的远程仓库地址(莫忘)
➜  git remote set-url origin git@git.xxx.com:userA/a-repository.git     
➜  git remote -v          
origin  git@git.xxx.com:userA/a-repository.git (fetch)
origin  git@git.xxx.com:userA/a-repository.git (push)          

后续

  • 删除旧仓库多余的gitlab-ci配置和多余分支
  • 新仓库配置gitlab-ci
  • 新仓库gitlab平台设置关键分支为protected状态

总结

可以看到上面步骤的命令的全程操作都是在A项目下进行的,所以别执行错仓库了,了解完原理再去执行会更加清晰整个流程。另外从不同用户下迁移项目用fork的方式也是可以的,同一个用户下迁移项目推荐上述方式。

相关文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容