簡體   English   中英

將本地 Git 回購推送到新的遠程,包括所有分支和標簽

[英]Push local Git repo to new remote including all branches and tags

我有一個本地 Git 回購,我想將其推送到一個新的遠程回購(如果重要的話,在 Beanstalk 上設置全新的回購)。
我的本地存儲庫有幾個分支和標簽,我想保留我所有的歷史記錄。

看起來我基本上只需要執行git push ,但這只會上傳master分支。

如何推送所有內容以便在遠程獲得本地存儲庫的完整副本?

要推送所有分支,請使用任一方法(將 REMOTE 替換為遠程名稱,例如“origin”):

git push REMOTE '*:*'
git push REMOTE --all

推送所有標簽

git push REMOTE --tags

最后,我認為您可以在一個命令中完成所有這些操作:

git push REMOTE --mirror

但是,此外--mirror還會推送您的遙控器,因此這可能不是您想要的。

在像我這樣的情況下,您獲得了一個倉庫,現在正在將遠程源切換到另一個倉庫,一個新的空倉庫......

所以你有你的倉庫和里面的所有分支,但你仍然需要為git push --all命令簽出這些分支來實際推送它們。

您應該在推送之前執行此操作:

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

其次是

git push --all

這是對同一件事的另一種看法,它在我所處的情況下效果更好。它解決了您有多個遙控器的問題,想將遠程source所有分支克隆到遠程destination但無需全部檢查預先。

(我在 Daniel 的解決方案中遇到的問題是,如果我之前已經檢查過它,它將拒絕從source遠程檢查跟蹤分支,即它不會在推送之前更新我的本地分支)

git push destination +refs/remotes/source/*:refs/heads/*

注意:如果您不使用直接 CLI,則必須避開星號:

git push destination +refs/remotes/source/\\*:refs/heads/\\*

這會將遠程source中的所有分支推送到destination的頭分支,可能會進行非快進推送。 您仍然需要單獨推送標簽。

就我而言,有效的是。

git push origin --all

這是我找到的最簡潔的方法,前提是目的地是空的。 切換到一個空文件夾,然后:

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git

根據需要將https://...替換為file:///your/repo等。

git-push的聯機幫助頁值得一讀。 結合這個網站,我在我的.git/config寫了以下內容:

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*

push = :表示“推送任何‘匹配’分支(即已經存在於遠程存儲庫中並具有本地副本的分支)”,而push = refs/tags/*表示“推送所有標簽”。

所以現在我只需要運行git push來推送所有匹配的分支和所有標簽。

是的,這不是 OP 想要的(所有要推送的分支必須已經存在於遠程端),但可能對那些在谷歌搜索“我如何同時推送分支和標簽”時發現這個問題的人有所幫助時間”。

鏡像倉庫

創建存儲庫的裸克隆。

git clone --bare https://github.com/exampleuser/old-repository.git

鏡像推送到新的存儲庫。

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

刪除您在步驟 1 中創建的臨時本地存儲庫。

cd ..
rm -rf old-repository.git

鏡像包含 Git 大文件存儲對象的存儲庫

創建存儲庫的裸克隆。 將示例用戶名替換為擁有存儲庫的個人或組織的名稱,並將示例存儲庫名稱替換為您要復制的存儲庫的名稱。

git clone --bare https://github.com/exampleuser/old-repository.git

導航到您剛剛克隆的存儲庫。

cd old-repository.git

拉入存儲庫的 Git 大文件存儲對象。

git lfs fetch --all

鏡像推送到新的存儲庫。

git push --mirror https://github.com/exampleuser/new-repository.git

將存儲庫的 Git 大文件存儲對象推送到您的鏡像。

git lfs push --all https://github.com/exampleuser/new-repository.git

刪除您在步驟 1 中創建的臨時本地存儲庫。

cd ..
rm -rf old-repository.git

以上說明來自 Github 幫助: https : //help.github.com/articles/duplicating-a-repository/

我發現上面的回答還有一些不清楚的地方,會誤導用戶。 首先,確定git push new_origin --allgit push new_origin --mirror不能復制所有的原始分支,它只是將您本地現有的分支復制到您的 new_origin。

以下是我測試過的兩種有用的方法:

1,通過克隆裸回購復制。 git clone --bare origin_url ,然后進入文件夾,然后git push new_origin_url --mirror 。 這樣,你也可以使用git clone --mirror origin_url--bare--mirror都會下載一個bare repo,而不是包括工作區。 請參考這個

2,如果你有一個使用git clone的 git repo,這意味着你有裸 repo 和 git 工作區,你可以使用git remote add new_origin new_origin_url ,然后git push new_origin +refs/remotes/origin/\\*:refs/heads/\\* ,然后git push new_origin --tags

通過這種方式,您將獲得一個額外的頭部分支,這是沒有意義的。

我正在從一個版本控制服務切換到另一個版本控制服務,需要克隆所有存儲庫,包括所有分支、標簽和歷史記錄。

為了實現上述目標,我接下來做了:

  • 手動將所有分支簽出到本地存儲庫(簽出所有分支的腳本如下所示),
  • git push origin '*:*'

用於將所有分支檢出到本地存儲庫的 .sh 腳本:

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

推送分支和標簽(但不是遙控器):

git push origin 'refs/tags/*' 'refs/heads/*'

這相當於將git push--tags--all選項組合在一起,這似乎是 git 不允許的。

我最喜歡(也是最簡單)的方式

git clone --mirror  OLD_GIT_URL
cd  NEW_CREATED_FOLDER
git remote add NEW-REMOTE NEW_GIT_URL
git push  NEW-REMOTE --mirror 

基於@Daniel 的回答,我做了:

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done

運行以下命令將現有存儲庫移動到具有所有分支和標簽的新遠程:

cd existing_repo
git remote rename origin old-origin
git remote add origin git@<repo-url.git>
for remote in `git branch -r `; do git checkout --track remotes/$remote ; done
git push -u origin --all
git push -u origin --tags

下面的命令將推送所有分支(包括那些你從未簽出但出現在你的 git repo 中的git branch -a ,你可以通過git branch -a看到它們

git push origin '*:*'

注意:當您遷移版本控制服務(即從Gitlab遷移到GitHub )時,此命令會派上用場

我發現這些似乎都不適合我。 隨意將其燒死,但由於某種原因無法使其他選項正常工作。

預期結果是一個 repo “克隆”到另一個遠程(即從 Github 到另一個提供者):

  • 所有分支都在新的遠程創建
  • 所有分支歷史記錄都在新的遠程創建
    • (我嘗試過的每個解決方案都錯過了這一點)
  • 所有標簽都在新遙控器上創建
  • 源移動(給定)
  • 非破壞性(暫停 --mirror 選項)

我看到的主要問題是所有遠程分支都沒有在新遠程中重新創建。 如果有命令,則新的遠程沒有分支歷史記錄(即執行git checkout branch; git log不會顯示預期的分支提交)。

我注意到git checkout -b branchnamegit checkout branchname (后者是我需要的)。 我注意到git checkout --track branchname似乎沒有提取分支歷史記錄。

我的解決方案(基於powershell):

Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]

Foreach ($entry in (git branch -r)) {

If ($entry -like "*->*") {
  $branch = $entry.split("->")[2].split("/")[1]
}
  else {$branch = $entry.split("/")[1]}

Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow

git checkout $branch

Remove-Variable branch -Force

""}

#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}

git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure

每次我谷歌如何做到這一點時,我最終都會閱讀同一個線程,但它並沒有讓我到達我需要去的地方,所以希望這對我未來的自己和其他人也有幫助。

我開始了一個新的本地項目,我想將其推送到我的存儲庫 (BitBucket)。 這是我所做的:

  1. 導航到我的本地項目根目錄
  2. 啟動: git init
  3. 添加所有文件: git add .
  4. 提交: git commit -m "Initial commit"
  5. 轉到我的倉庫(BitBucket)
  6. 創建新存儲庫: new_project
  7. 回到我的本地項目
  8. 添加遙控器: git remote add origin git@bitbucket.org:AndrewFox/new_project.git
  9. 使用以下命令推送提交: git push origin master -f

-f標志是強制推送,否則會識別出兩個 repo 不同而失敗。

我找到了最好和最簡單的方法https://www.metaltoad.com/blog/git-push-all-branches-new-remote ,對我來說就像一個魅力,它會將所有標簽和分支從原點推送到新遙控器:

git remote add newremote new-remote-url

git push newremote --tags refs/remotes/origin/*:refs/heads/*

我使用了 'git push --all -u newremote',但它只將簽出的分支推送到 newremote。

Git:將所有分支推送到新的遠程

作者:軟件架構師 Keith Dechant

下面是你們中的一些人在使用 Git 存儲庫時可能遇到的場景。 你有一個 Git 存儲庫的工作副本,比如來自舊服務器。 但是您只有工作副本,並且無法訪問源。 所以你不能只是分叉它。 但是您想將整個 repo 和所有分支歷史推送到您的新遙控器。

如果您的工作副本包含來自舊遠程(origin/branch1、origin/branch1 等)的跟蹤分支,則這是可能的。 如果你這樣做了,你就有了整個回購和歷史。

然而,就我而言,有數十家分店,其中一些或全部我從未在本地簽過賬。 將他們全部推開似乎是一件沉重的事情。 那么,如何進行呢?

我確定了兩個選項:

選項 1:檢查每個分支並推送我可以做到這一點,我什至可以編寫一個 Bash 腳本來提供幫助。 但是,這樣做會在每次結帳時更改我的工作文件,並且會為每個遠程跟蹤分支創建一個本地分支。 對於大型回購,這會很慢。

選項 2:推送而不更改您的工作副本 還有第二種選擇,它不需要檢查每個分支,不會在工作副本中創建無關的分支,甚至不修改工作副本中的文件。

如果舊的不再活動的遙控器稱為“oldremote”,而新的遙控器稱為“newremote”,則可以使用以下命令僅推送遠程跟蹤分支:

git push newremote refs/remotes/oldremote/*:refs/heads/*

在某些情況下,也可以只推送分支的一個子集。 如果分支名稱以斜線命名(例如,oldremote/features/branch3、oldremote/features/branch4 等),則只能推送名稱以“oldremote/features”開頭的遠程跟蹤分支:

git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*

無論您推送所有分支還是僅推送其中的一部分,Git 都將執行整個操作,而無需創建任何新的本地分支,也無需更改您的工作文件。 與您的模式匹配的每個跟蹤分支都將被推送到新的遠程。

有關該主題的更多信息,請查看 Stack Overflow 上的此線程。

發布日期:2017 年 10 月 9 日

這是我在將本地 Git 回購推送到包括所有分支和標簽的新遠程時解決的問題[遠程拒絕]

  • git 克隆 --mirror old-repo

  • cd <name-repo.git>

  • git 遠程添加的 new-repo

  • git推--鏡像

做你想做的主要方法是使用--all--tags標志。 離開任何一個都不會推動你想要的部分。 不幸的是,它們不能一起使用(不明白為什么)所以它們必須一個接一個地運行。

git push --all
git push --tags

另一個相關的選項是--prune選項,它刪除本地不存在的遠程分支/標簽。

或者,考慮--mirror選項,因為它基本上等同於--all --tags --prune

git push --mirror

暫無
暫無

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

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