[英]Push local Git repo to new remote including all branches and tags
我有一個本地 Git 回購,我想將其推送到一個新的遠程回購(如果重要的話,在 Beanstalk 上設置全新的回購)。
我的本地存儲庫有幾個分支和標簽,我想保留我所有的歷史記錄。
看起來我基本上只需要執行git push
,但這只會上傳master
分支。
如何推送所有內容以便在遠程獲得本地存儲庫的完整副本?
在像我這樣的情況下,您獲得了一個倉庫,現在正在將遠程源切換到另一個倉庫,一個新的空倉庫......
所以你有你的倉庫和里面的所有分支,但你仍然需要為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 --all
和git 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 到另一個提供者):
我看到的主要問題是所有遠程分支都沒有在新遠程中重新創建。 如果有命令,則新的遠程沒有分支歷史記錄(即執行git checkout branch; git log
不會顯示預期的分支提交)。
我注意到git checkout -b branchname
與git 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)。 這是我所做的:
git init
git add .
git commit -m "Initial commit"
new_project
git remote add origin git@bitbucket.org:AndrewFox/new_project.git
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推新--鏡像
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.