[英]Set up git to pull and push all branches
我想默認推拉所有分支,包括新創建的分支。
我可以為它定義一個設置嗎?
否則,當我在本地添加一個新分支並且我想從服務器中提取它時,最簡單的方法是什么?
我創建了一個同名的新分支並嘗試拉,但它不起作用。 詢問我分支的所有遠程配置。 我該如何設置。
最簡單的方法是:
git push --all origin
這將推送標簽和分支。
使用現代 git,您總是獲取所有分支(作為遠程跟蹤分支進入refs/remotes/origin/*
命名空間,通過git branch -r
或git remote show origin
可見)。
默認情況下(請參閱push.default
配置變量的文檔)您推送匹配的分支,這意味着首先您必須執行git push origin branch
以便 git 始終在git push
上推送它。
如果你想總是推送所有分支,你可以設置推送 refspec。 假設遠程名為origin
你可以使用git config :
$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'
或直接編輯.git/config
文件以具有如下內容:
[remote "origin"] url = user@example.com:/srv/git/repo.git fetch = +refs/heads/*:refs/remotes/origin/* fetch = +refs/tags/*:refs/tags/* push = +refs/heads/*:refs/heads/* push = +refs/tags/*:refs/tags/*
在推送規范中包含 + 可能是一個壞主意,因為這意味着即使沒有 -f git 也會很樂意進行非快進推送,如果遠程服務器設置為接受這些,您可能會丟失歷史記錄。
試試這個:
$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'
我使用以下命令將所有分支遷移到新存儲庫。
~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror
注意:在將存儲庫從 Atlassian Stash克隆到 AWS CodeCommit (空白存儲庫)時,我必須使用倒數第二(即先推主控)命令。 我不確定原因,但在推送( git push new-origin --mirror
)之后,默認分支指的是除master
之外的其他分支。
如果您要將分支從舊倉庫移動到新倉庫,並且沒有本地所有舊倉庫分支,則需要先跟蹤它們。
for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done
然后添加你的新遠程倉庫:
git remote add bb <path-to-new-repo>
然后您可以使用此命令推送所有內容:
git push -u bb --all
或者,如果您一次不這樣做或只想移動本地分支,則可以使用此處其他響應中提到的 git config 命令配置存儲庫。
重要的一點是,其他響應只會推送所有 LOCAL 分支。 如果分支僅存在於備用 REMOTE 存儲庫中,則在不首先跟蹤它們的情況下它們不會移動。 此處介紹的 for 循環將對此有所幫助。
要使用git branch -a
查看所有分支,您應該執行:
for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all
現在你可以看到所有的分支:
git branch
要推送所有分支,請嘗試:
git push --all
如果您要將所有分支從舊倉庫移動到新倉庫,那么在本地倉庫中,您需要在推送到新倉庫之前設置每個分支到現有原始分支的跟蹤,否則所有原始分支都不會出現在新的起源。 通過跟蹤或檢查每個分支手動執行此操作,或使用一個班輪:
for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done
這個單行命令基於本頁其他答案中的版本,但可以說更好,因為:
接下來,如果您要切換原點,請替換舊原點的鏈接並指向新的遙控器。 確保首先使用 bitbucket/github GUI 創建新的遠程,但不要向其中添加任何文件,否則會出現合並問題。 例如
git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git
現在推。 請注意,還需要第二個命令來推送標簽:
git push -u --all origin
git push --tags origin
origin
解決方案在您的全局gitconfig 中使用以下內容
[remote]
push = +refs/heads/*
push = +refs/tags/*
這會推送所有分支和所有標簽
origin
?如果你硬編碼:
origin
作為遠程。 因此您將無法添加原點,但您需要使用set-url
。origin
已經存在(從第 1 點開始)記住:)根據 Jakub Narębski 的回答:
使用現代 git,您總是獲取所有分支(作為遠程跟蹤分支到 refs/remotes/origin/* 命名空間
如果你從一個遠程源推送到另一個,你可以使用這個:
git push newremote refs/remotes/oldremote/*:refs/heads/*
這對我有用。 請參考:https ://www.metaltoad.com/blog/git-push-all-branches-new-remote
對我來說轉移所有分支和標簽的完整程序是結合@vikas027 和@kumarahul 的答案:
~$ git clone <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin --mirror
~$ git push new-origin refs/remotes/origin/*:refs/heads/*
~$ git push new-origin --delete HEAD
最后一步是因為通配符導致在新的遠程中出現了一個名為HEAD
的分支
for b in $(git branch -a | grep -v master | \
sed -e "s|remotes\/origin\/\(.*\)|\1|g"); do git checkout $b && \
git push origin $b; done
我在這里找到了最好和最簡單的方法,就像@kumarahul 發布的那樣,對我來說就像一個魅力,它會將所有標簽和分支從原點推送到新的遠程:
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 添加到您的 loacl
git remote add remote_name remote_address
在您只需要使用以下命令完成之后
git push --all remote_name
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.