背景
在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的方式也是可以的,同一個用戶下遷移項目推薦上述方式。