簡體   English   中英

"設置 git 拉取和推送所有分支"

[英]Set up git to pull and push all branches

我想默認推拉所有分支,包括新創建的分支。

我可以為它定義一個設置嗎?

否則,當我在本地添加一個新分支並且我想從服務器中提取它時,最簡單的方法是什么?

我創建了一個同名的新分支並嘗試拉,但它不起作用。 詢問我分支的所有遠程配置。 我該如何設置。

最簡單的方法是:

git push --all origin

這將推送標簽和分支。

使用現代 git,您總是獲取所有分支(作為遠程跟蹤分支進入refs/remotes/origin/*命名空間,通過git branch -rgit 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

這個單行命令基於本頁其他答案中的版本,但可以說更好,因為:

  1. 它正確設置了分支跟蹤,這與此頁面上此命令的一些舊變體不同,后者僅向 --track 提供一個參數,因此每個分支最終都會跟蹤 master - 不好
  2. 命名本地分支時不帶前綴“origin/”,這是我個人不想要的 - 並且與您正常結帳分支時發生的情況一致。
  3. 跳過跟蹤大師,因為這已經發生了
  4. 實際上不結帳任何東西因此很快
  5. 避免在 git branch -r 的輸出中絆倒 ->

接下來,如果您要切換原點,請替換舊原點的鏈接並指向新的遙控器。 確保首先使用 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

如果你硬編碼:

  1. 您最終將在所有存儲庫中將origin作為遠程。 因此您將無法添加原點,但您需要使用set-url
  2. 如果工具使用不同的名稱創建遙控器,則推送所有配置將不適用。 然后你必須重命名遙控器,但重命名不起作用,因為origin已經存在(從第 1 點開始)記住:)

獲取已經由現代 git 處理了

根據 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.

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