Вопрос: Как клонировать все удаленные ветви в Git?


у меня есть masterи developmentветви, обе GitHub , Я cloneд, pulled и fetchно я не могу получить ничего, кроме masterответвление назад.

Я уверен, что мне не хватает чего-то очевидного, но я прочитал руководство, и я не получаю никакой радости.


3529


источник


Ответы:


Во-первых, клонировать удаленный Гит хранилище и 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 &

3994



Если у вас много удаленных филиалов, которые вы хотите получить сразу, выполните следующие действия:

$ git pull --all

Теперь вы можете проверить любую ветку, как вам нужно, без попадания в удаленный репозиторий.


738



Эта удар сценарий помог мне:

#!/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Как обычно: тест в вашей настройке перед копированием вселенной rm -rf, как мы ее знаем

Кредиты для одного лайнера идут в пользовательский cfi


377



Используя --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: Как клонировать репозиторий со всеми удаленно отслеживаемыми ветвями?


267



You can easily switch to a branch without using the fancy "git checkout -b somebranch origin/somebranch" syntax. You can just do:

git checkout somebranch

Git will automatically do the right thing:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

Git will check whether a branch with the same name exists in exactly one remote, and if it does, it tracks it the same way as if you had explicitly specified that it's a remote branch. From the git-checkout man page of Git 1.8.2.1:

If <branch> is not found but there does exist a tracking branch in exactly one remote (call it <remote>) with a matching name, treat as equivalent to

$ git checkout -b <branch> --track <remote>/<branch>

204



Regarding,

$ git checkout -b experimental origin/experimental

using

$ git checkout -t origin/experimental

or the more verbose but easier to remember

$ git checkout --track origin/experimental

might be better, in terms of tracking a remote repository.


87



The fetch that you are doing should get all the remote branches, but it won't create local branches for them. If you use gitk, you should see the remote branches described as "remotes/origin/dev" or something similar.

To create a local branch based on a remote branch, do something like:

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

Which should return something like:

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

Now, when you are on the dev branch, "git pull" will update your local dev to the same point as the remote dev branch. Note that it will fetch all branches, but only pull the one you are on to the top of the tree.


77



When you do "git clone git://location", all branches and tags are fetched.

In order to work on top of a specific remote branch, assuming it's the origin remote:

git checkout -b branch origin/branchname

56