背景
在github或者gitlab中,如果想从A仓库项目复制一份到B仓库,又要在B仓库中保留A项目的commit的log等记录时,直接拷贝文件的方式不能满足需求,这就需要用到git的一些命令处理(从用户userA的仓库复制一份到用户userB也是如此)。
流程
- 在userB下新建一个空的仓库B,新建时不要带任何文件,包括readme等。
-
在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)
-
在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)
- 上面步骤可以看到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即可。
- 去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的方式也是可以的,同一个用户下迁移项目推荐上述方式。