背景
在github或者gitlab中硫嘶,如果想從A倉(cāng)庫(kù)項(xiàng)目復(fù)制一份到B倉(cāng)庫(kù),又要在B倉(cāng)庫(kù)中保留A項(xiàng)目的commit的log等記錄時(shí)考榨,直接拷貝文件的方式不能滿足需求双霍,這就需要用到git的一些命令處理(從用戶userA的倉(cāng)庫(kù)復(fù)制一份到用戶userB也是如此)。
流程
- 在userB下新建一個(gè)空的倉(cāng)庫(kù)B挪钓,新建時(shí)不要帶任何文件是越,包括readme等。
-
在A倉(cāng)庫(kù)項(xiàng)目下
碌上,查看在A倉(cāng)庫(kù)的遠(yuǎn)程倉(cāng)庫(kù)地址
? git remote -v
origin git@git.xxx.com:userA/a-repository.git (fetch)
origin git@git.xxx.com:userA/a-repository.git (push)
-
在A倉(cāng)庫(kù)項(xiàng)目下
倚评,使用git remote set-url
重置倉(cāng)庫(kù)A為B的遠(yuǎn)程倉(cāng)庫(kù)地址(關(guān)鍵步驟
)
? git remote set-url origin git@git.xxx.com:userB/b-repository.git
查看A倉(cāng)庫(kù)是否重置為B的遠(yuǎn)程地址:
? git remote -v
origin git@git.xxx.com:userB/b-repository.git (fetch)
origin git@git.xxx.com:userB/b-repository.git (push)
- 上面步驟可以看到A倉(cāng)庫(kù)的remote url已經(jīng)變成B的,也就是說(shuō)馏予,現(xiàn)在在A倉(cāng)庫(kù)項(xiàng)目下執(zhí)行g(shù)it push等命令天梧,實(shí)際上是push到B倉(cāng)庫(kù)。
-f
強(qiáng)制更新霞丧,--all
會(huì)push所有
分支及commit的信息呢岗,如果不加--all
的話,只會(huì)push當(dāng)前分支及commit信息蛹尝。
在A倉(cāng)庫(kù)項(xiàng)目下
執(zhí)行:
? git push --all -f
如果在push的時(shí)候報(bào)錯(cuò):
[remote rejected] master -> master (pre-receive hook declined)
這是因?yàn)锽倉(cāng)庫(kù)默認(rèn)的master分支是受保護(hù)的后豫,需要取消保護(hù)之后才能push:
Setting->Repository->Protected Branches,把master分支unprotect即可突那。
- 去B倉(cāng)庫(kù)就可以看到分支信息和commit信息了挫酿。此時(shí),
在A倉(cāng)庫(kù)項(xiàng)目下
恢復(fù)A倉(cāng)庫(kù)的遠(yuǎn)程倉(cāng)庫(kù)地址(莫忘)
? 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)
后續(xù)
- 刪除舊倉(cāng)庫(kù)多余的gitlab-ci配置和多余分支
- 新倉(cāng)庫(kù)配置gitlab-ci
- 新倉(cāng)庫(kù)gitlab平臺(tái)設(shè)置關(guān)鍵分支為protected狀態(tài)
總結(jié)
可以看到上面步驟的命令的全程操作都是在A項(xiàng)目下進(jìn)行的愕难,所以別執(zhí)行錯(cuò)倉(cāng)庫(kù)了早龟,了解完原理再去執(zhí)行會(huì)更加清晰整個(gè)流程惫霸。另外從不同用戶下遷移項(xiàng)目用fork的方式也是可以的,同一個(gè)用戶下遷移項(xiàng)目推薦上述方式拄衰。