git - track - pull remote branch to new local branch




如何在Git中克隆所有遠程分支? (20)

使用您能記住的命令

我正在使用Bitbucket,一個Atlassian的存儲庫託管服務。所以我試著關注他們的文檔。這對我來說非常有效。使用以下簡單和簡短命令,您可以檢出遠程分支。

首先克隆您的存儲庫,然後切換到目標文件夾。最後但並非最不重要的是獲取和結帳:

git clone <repo> <destination_folder>
cd <destination_folder>
git fetch && git checkout <branch>

而已。 這裡有一個更真實的例子:

git clone https://[email protected]/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

您將在文檔中找到有關命令的詳細信息:Clone CommandFetch CommandCheckout Command

我有一個master和一個development分支,都推到了GitHub 。 我已經clone d, pull ed和fetch ed,但是我仍然無法獲得除master分支之外的任何東西。

我確定我錯過了一些明顯的東西,但是我已經閱讀了手冊,而且我一點也不開心。


為什麼你只看到“主人”

git clone下載所有遠程遠程分支但仍然認為它們是“遠程”,即使這些文件位於新的存儲庫中。 這有一個例外,即克隆過程從名為“master”的遠程分支創建一個名為“master”的本地分支。 默認情況下, git branch僅顯示本地分支,這就是您只看到“master”的原因。

git branch -a顯示所有分支, 包括遠程分支

如何獲得當地分支機構

如果你真的想在一個分支上工作,你可能想要它的“本地”版本。 要簡單地從遠程分支創建本地分支(不檢查它們,從而更改工作目錄的內容) ,您可以這樣做:

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

在此示例中, branchone是您基於origin/branchone創建的本地分支的名稱; 如果您想要創建具有不同名稱的本地分支,則可以執行以下操作:

git branch localbranchname origin/branchone

一旦你創建了一個本地分支,你就可以通過git branch看到它(記住,你不需要-a來查看本地分支)。


好的,當你克隆你的倉庫時,那裡有你所有的分支......

如果你只是做git branch ,它們有點隱藏......

因此,如果您想查看所有分支名稱,只需添加--all標誌,如下所示:

git branch --allgit branch -a

如果您只是結帳到分行,您將獲得所需的一切。

但是如果你克隆後由其他人創建分支怎麼樣?

在這種情況下,只需:

git fetch

並再次檢查所有分支......

如果您想同時獲取和結帳,您可以:

git fetch && git checkout your_branch_name

還創建了下面的圖像,以簡化我所說的內容:


使用--mirror選項似乎可以正確複製remote跟踪分支。 但是,它將存儲庫設置為裸存儲庫,因此您必須在之後將其重新轉換為普通存儲庫。

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

參考: Git FAQ:如何使用所有遠程跟踪的分支克隆存儲庫?


使用我的工具git_remote_branch (你需要在你的機器上安裝Ruby)。 它專門用於使遠程分支操作變得容易。

每次代表您執行操作時,它都會在控制台上以紅色打印。 隨著時間的推移,他們終於堅持到你的大腦:-)

如果您不希望grb代表您運行命令,只需使用'explain'功能即可。 這些命令將打印到您的控制台而不是為您執行。

最後,所有命令都有別名,以便更容易記憶。

請注意,這是git_remote_branch ;-)

這是運行grb幫助時的幫助:

git_remote_branch version 0.2.6

  Usage:

  grb create branch_name [origin_server] 

  grb publish branch_name [origin_server] 

  grb rename branch_name [origin_server] 

  grb delete branch_name [origin_server] 

  grb track branch_name [origin_server] 



  Notes:
  - If origin_server is not specified, the name 'origin' is assumed 
    (git's default)
  - The rename functionality renames the current branch

  The explain meta-command: you can also prepend any command with the 
keyword 'explain'. Instead of executing the command, git_remote_branch 
will simply output the list of commands you need to run to accomplish 
that goal.

  Example: 
    grb explain create
    grb explain create my_branch github

  All commands also have aliases:
  create: create, new
  delete: delete, destroy, kill, remove, rm
  publish: publish, remotize
  rename: rename, rn, mv, move
  track: track, follow, grab, fetch

如果您想要一次獲取許多遠程分支,請執行以下操作:

$ git pull --all

現在,您可以根據需要簽出任何分支,而無需訪問遠程存儲庫。


從本地倉庫克隆將無法使用git clone和git fetch:許多分支/標籤將保持不受約束。

獲取包含所有分支和標記的克隆。

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

要獲得包含所有分支和標記的克隆,還要使用工作副本:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

您只需要使用“git clone”來獲取所有分支。

git clone <your_http_url>

即使您只看到master分支,也可以使用“git branch -a”查看所有分支。

git branch -a

你可以切換到你已經擁有的任何分支。

git checkout <your_branch_name>

不要擔心,在你“git clone”之後,你不需要連接遠程倉庫,當你關閉wifi時,“git branch -a”和“git checkout”可以成功運行。 所以事實證明,當你執行“git clone”時,它已經從遠程倉庫複製了所有分支。 之後,您不需要遠程倉庫,您的本地已經擁有所有分支機構的代碼。


您正在執行的獲取應該獲取所有遠程分支,但它不會為它們創建本地分支。 如果您使用gitk,您應該看到描述為“remotes / origin / dev”的遠程分支或類似的東西。

要基於遠程分支創建本地分支,請執行以下操作:

git checkout -b dev refs/remotes/origin/dev

哪個應該返回類似的東西:

Branch dev set up to track remote branch refs/remotes/origin/dev.
Switched to a new branch "dev"

現在,當你在dev分支上時,“git pull”會將你的本地dev更新為與遠程dev分支相同的點。 請注意,它將獲取所有分支,但只將您所在的分支拉到樹的頂部。


我在這裡看到的所有答案都是有效的,但有一種更清晰的方法來克隆存儲庫並立即拉出所有分支。

克隆存儲庫時,實際下載了分支的所有信息,但隱藏了分支。 隨著命令

$ git branch -a

您可以顯示存儲庫的所有分支,並使用該命令

$ git checkout -b branchname origin/branchname

然後,您可以一次手動“下載”它們。

但是,當你想要克隆一個包含很多分支的repo時,所有上面說明的方式都是冗長乏味的,這是一個更清潔,更快捷的方式,雖然它有點複雜。 您需要三個步驟來完成此任務:

  1. 第一步

在您的計算機上創建一個新的空文件夾,並從存儲庫中克隆.git文件夾的鏡像副本:

$ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
$ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git

文件夾my_repo_folder中的本地存儲庫仍為空,現在只有一個隱藏的.git文件夾,您可以從終端看到“ls -alt”命令。

  1. 第二步

通過將git配置的布爾值“裸”切換為false,將此存儲庫從空(裸)存儲庫切換到常規存儲庫:

$ git config --bool core.bare false
  1. 第三步

抓取當前文件夾中的所有內容並在本地計算機上創建所有分支,從而使其成為正常的repo。

$ git reset --hard

所以現在你可以輸入命令“git branch”,你可以看到所有的分支都被下載了。

這是您可以快速克隆包含所有分支的git存儲庫的快速方法,但這不是您希望以這種方式為每個項目執行的操作。


當您執行“git clone git:// location”時,將獲取所有分支和標記。

為了在特定的遠程分支上工作,假設它是原始遠程:

git checkout -b branch origin/branchname

看一下這個問題的答案,我注意到它可以縮短它:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

但要注意,如果其中一個遠程分支被命名為例如admin_master,它將不會被下載!

感謝bigfish的原創理念


這些答案都沒有削減它,除非用戶沒人在正確的軌道上。

將repo從一個服務器/系統移動到另一個服務器/系統時遇到了麻煩。當我克隆了repo時,它只為master創建了一個本地分支,所以當我推送到新的遠程時,只推出了master分支。

所以我發現這兩種方法非常有用。希望他們幫助別人。

方法1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

方法2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

這個Bash腳本幫助我:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

它將為除master之外的所有遠程分支創建跟踪分支(您可能從原始clone命令獲得)。 我想你可能還需要做一個

git fetch --all
git pull --all

為了確定。

一個班輪git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs像往常一樣:在我們知道複製rm -rf Universe之前在你的設置中進行測試

單行的積分轉到用戶cfi


這樣做:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

你看,'git clone git://example.com/myprojectt'取出所有東西,甚至是分支,你只需要簽出它們,然後你的本地分支就會被創建。


遲到總比沒有好,但這是最好的方法:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

此時,您擁有遠程倉庫的完整副本及其所有分支(使用git branch驗證)。 如果您的遠程--bare具有自己的遠程--bare則可以使用--mirror而不是--bare


首先,克隆遠程Git存儲庫並cd入其中:

$ git clone git://example.com/myproject
$ cd myproject

接下來,查看存儲庫中的本地分支:

$ git branch
* master

但是您的存儲庫中還隱藏著其他分支! 你可以使用-a標誌看到這些:

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

如果您只是想快速查看上游分支,可以直接查看:

$ git checkout origin/experimental

但是如果你想在那個分支上工作,你需要創建一個本地跟踪分支,它由以下內容自動完成:

$ git checkout experimental

你會看到的

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

最後一行引發了一些人:“新分支” - 是嗎? 它的真正含義是從索引中獲取分支並在本地為您創建。 一行實際上提供了更多信息,因為它告訴您正在設置分支以跟踪遠程分支,這通常意味著origin / branch_name分支

現在,如果你看看當地的分支機構,你會看到:

$ git branch
* experimental
  master

您實際上可以使用git remote跟踪多個遠程存儲庫。

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

在這一點上,事情變得非常瘋狂,所以運行gitk看看發生了什麼:

$ gitk --all &

Git通常(未指定時git ls-refs)從一個或多個其他存儲庫中獲取所有分支和/或標記(refs,參見:) 以及完成其歷史記錄所需的對象。換句話說,它獲取已經下載的對象可以訪問的對象。請參閱:什麼是git fetch真的?

有時你可能有分支/標籤沒有直接連接到當前的分支/標籤,所以git pull --all/ git fetch --all在這種情況下沒有幫助,但你可以通過以下方式列出它們:

git ls-remote -h -t origin

並通過知道ref名稱手動獲取它們。

所以要獲取所有內容,請嘗試:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000如果您使存儲庫變淺,該參數可能會有所幫助。

然後再次檢查所有分支:

git branch -avv

如果上面沒有幫助,你需要手動將缺失的分支添加到被跟踪的列表中(因為它們以某種方式丟失):

$ git remote -v show origin
...
  Remote branches:
    master      tracked

通過git remote set-branches喜歡:

git remote set-branches --add origin missing_branch

所以它可能會在remotes/origin獲取之後出現:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

故障排除

如果您仍然無法獲得除主分支以外的任何內容,請檢查以下內容:

  • 仔細檢查你的遙控器(git remote -v),例如
    • 驗證即git config branch.master.remoteorigin
    • 通過以下方式檢查是否origin指向正確的URL :( git remote show origin請參閱此post)。

我要在這裡加2美分,因為我在這裡試圖找出如何拉下我在本地刪除的遠程分支。起源不是我的,我不想經歷重新克隆一切的麻煩

這對我有用:

假設您需要在本地重新創建分支:

git checkout -b recreated-branch-name
git branch -a (to list remote branches)
git rebase remotes/remote-origin/recreated-branch-name

所以,如果我從gituser / master分到sjp然後將其分支到sjp / mynewbranch,它將如下所示:

$ git checkout -b mynewbranch
$ git branch -a
  master
  remotes/sjp/master
  remotes/sjp/mynewbranch
$ git fetch (habit to always do before)
$ git rebase remotes/sjp/mynewbranch

截至2017年初,本評論的答案有效:

git fetch <origin-name> <branch-name>為你帶來分支。雖然這不會立即拉出所有分支,但您可以單獨執行此分支。





remote-branch