簡體   English   中英

git 將所有分支從一個遠程推送到另一個遠程

[英]git push all branches from one remote to another remote

我有兩個遠程:上游和原點。 上游是我無法推動的。 origin 是我自己的倉庫。 如何從上游獲取所有分支,然后將它們推送到原點? 我試過:

git fetch upstream
git push --all origin

但它不起作用。

您可能想嘗試使用--mirror選項克隆上游存儲庫,然后也使用--mirror選項推送到新的遠程--mirror

您將擁有以下流程:

git clone <upstream-repo-url/repo.git> --mirror
cd <repo>
git remote add <your-remote-name> <your-remote-url/repo.git>
git push <your-remote-name> --mirror

⚠ 使用push --mirror --mirror 時要非常小心,因為它會刪除您的<your-remote-name>上的分支

我只需要將一個存儲庫從 Bitbucket 復制到 GitHub,這些步驟假設您的遠程名為 origin,所有分支和標簽都將被復制:

git remote add neworigin url-to-new-remote
git push neworigin --tags refs/remotes/origin/*:refs/heads/*

這樣做的好處是您的工作副本中的文件不會被修改。

從一個(裸)存儲庫克隆到另一個(裸)存儲庫並采用所有分支(而不僅僅是檢出的分支)的一個完整答案是克隆本地裸存儲庫作為中介。 然后將所有分支作為克隆的一部分拉出,並且 git push --all 將全部推送它們。 在 Windows 上從 github 到 gitlab 執行的示例:

  1. git clone --bare git@github.com:robe070/cookbooks.git
  2. cd 食譜.git
  3. git 遠程添加 gitlab git@gitlab.com:robe071/cookbookstest2.git
  4. git push --force --all gitlab
  5. git push --force --tags gitlab

結果:25 個分支推送到 gitlab

請注意,所有分支都不需要 git checkout 並且對裸倉庫毫無意義。

當您git push <REMOTE> --allgit push <REMOTE> --tags所有分支和標簽都將從您的本地歷史記錄推送到 REMOTE。 這樣,如果您想push所有分支和標簽從遠程(即origin )(不僅是您的本地歷史記錄) push送到另一個遠程(即upstream ),請執行以下過程:

  1. 從源接收所有分支和標簽,並使用源遠程刪除本地歷史記錄中不匹配的分支:
    •  git fetch --prune
    •  git branch -r | grep -v '\\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
    •  git fetch --all
  2. 添加新的遠程網址:
    •  git remote add upstream <the-url-path-of-a-remote.git>
  3. 現在,您的本地已同步。 接下來,您可以push所有分支和標簽push送到新的遠程:
    •  git push --all upstream git push --tags upstream

TL; 博士

git fetch --prune
git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git remote add upstream <the-url-path-of-a-remote.git>
git push --all upstream
git push --tags upstream

界面方法:
你也可以通過 Github.com 的 UI - Private & Public Repos 來做到這一點。

  1. 在 github.com 上的組織中創建一個新的存儲庫 - 單擊綠色的“創建存儲庫”按鈕創建新的回購屏幕

  2. 在下一個屏幕上,列出的最后一個選項允許您將舊存儲庫克隆到 Github。 (見藍色突出顯示) 選擇存儲庫源

  3. 接下來輸入您的舊 bitbucket repo url,如下所示。
    (是的,私人回購很好 - 繼續閱讀 - 下一步是 auth :p) bitbucket 中的舊 repo url

  4. 最后,它會詢問您的登錄憑據,輸入它們並去煮些咖啡。 老實說不會花很長時間。 先生,你可能是誰?

BAM - 你就完成了。 就我個人而言,我只是使用 CLI + Mirror 諷刺的是,這是這里接受的答案,但前幾天我的團隊中的一位開發人員向我詢問了這個問題,並認為有替代方案會有所幫助。

您可以將以下命令作為 bash 腳本運行,其中第一個輸入是您現有的源代碼庫,第二個輸入是您的目標代碼庫。

mkdir migrate
git clone $1 migrate
cd migrate
git fetch origin
git remote add new-origin $2
git push -u new-origin --all
git push new-origin --tags
git remote set-head origin -d
git push new-origin refs/remotes/origin/*:refs/heads/*

這假設您已經創建了目標存儲庫。

希望這有幫助:

git remote add your-new-origin url-to-repo/repo.git
git push --all your-new-origin //pushes all branches
git push --tags your-new-origin //pushes all tags

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM