如何创建新Git仓库替代旧仓库、保留提交历史且可同步旧仓库更新
Git非复刻单向同步操作方案
最优初始操作步骤
避免直接污染原有旧仓库的配置,推荐用独立的中转裸仓库完成同步,全程不会在两个远程仓库之间产生平台层面的复刻关联:
- 首先在新的Git托管端创建空的
new_repo,获取新远程地址new_remote(如ssh://my_host/new_repo) - 本地创建同步中转裸仓库:
# 克隆旧仓库完整内容到本地裸仓库 git clone --bare <old_remote地址/old_repo.git> sync_workdir cd sync_workdir # 添加新仓库为推送目标远程 git remote add new <new_remote地址/new_repo.git> # 首次全量推送所有分支、标签、提交历史到新仓库 git push --mirror new
后续旧仓库更新同步方法
每次需要把旧仓库的更新同步到新仓库时,仅需要在中转目录执行两行命令即可:
# 拉取旧仓库的所有最新更新 git fetch origin # 将更新全量推送到新仓库,单向同步不会反向修改旧仓库 git push --mirror new
针对你当前已有操作的适配方案
如果你已经按自己写的步骤完成了初始推送,可直接在本地的new_repo克隆目录配置同步规则:
- 进入本地
new_repo目录,添加旧仓库为只读上游:
cd /path/to/new_repo # 添加旧仓库远程,命名为old_upstream git remote add old_upstream <old_remote地址/old_repo.git> # 配置该远程禁止推送,避免误操作修改旧仓库 git remote set-url --push old_upstream no_push
- 每次需要同步更新时执行以下命令:
# 拉取旧仓库最新更新 git fetch old_upstream # 切换到对应分支(以master为例) git checkout master # 合并旧仓库的对应分支更新,单向同步默认是快进合并无冲突 git merge old_upstream/master --ff-only # 推送到新仓库远程 git push origin master
核心说明
该方案下新旧两个远程仓库不存在任何平台层面的复刻关联,仅通过本地中转完成单向同步,完全满足你不想要复刻、仅允许旧仓库更新同步到新仓库的要求。
内容的提问来源于stack exchange,提问作者Aerodynamika
相关产品推荐
相关产品推荐

