Вопрос

у меня есть master и development ветка, оба перенесены в GitHub.у меня есть cloneд, pullЭд, и fetched, но я по-прежнему не могу получить ничего, кроме master ответвление назад.

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

Это было полезно?

Решение

Сначала клонируйте удаленный Гит хранилище и 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 pull --all

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

Этот Баш мне помог скрипт:

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

Он создаст ветки отслеживания для всех удаленных ветвей, кроме главной (которую вы, вероятно, получили из исходной команды клонирования).Я думаю, что вам, возможно, все еще придется сделать

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.

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

Вы можете легко переключиться на ветку, не используя причудливый синтаксис «git checkout -b somebranch origin/somebranch».Вы можете просто сделать:

git checkout somebranch

Git автоматически сделает правильные действия:

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

Git проверит, существует ли ветка с таким же именем ровно на одном удаленном сервере, и если да, то отслеживает ее так же, как если бы вы явно указали, что это удаленная ветка.На странице руководства git-checkout Git 1.8.2.1:

Еслиu003Cbranch> не найдено, но существует ветвь отслеживания именно в одном пульте (назовите этоu003Cremote> ) с соответствующим именем, рассматривать как эквивалентное

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

Касательно,

$ git checkout -b экспериментальное происхождение/экспериментальное

с использованием

$ git checkout -t origin/experimental

или более подробный, но легче запоминающийся

$ git checkout --track origin/experimental

может быть лучше с точки зрения отслеживания удаленного репозитория.

Выполняемая вами выборка должна получить все удаленные ветки, но не создаст для них локальные ветки.Если вы используете 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"

Теперь, когда вы находитесь в ветке разработки, «git pull» обновит вашу локальную версию разработки до той же точки, что и удаленная ветка разработки.Обратите внимание, что он извлекает все ветки, но тянет только ту, на которой вы находитесь, на вершину дерева.

Когда вы выполняете «git clone git://location», выбираются все ветки и теги.

Чтобы работать поверх определенной удаленной ветки, предполагая, что это исходный удаленный компьютер:

git checkout -b branch origin/branchname

Используйте псевдонимы.Хотя в Git нет встроенных однострочных строк, вы можете определить свои собственные как

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

а затем использовать его как

git clone-branches

Почему вы видите только «мастер»

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 fetch origin Это приведет к тому, что все удаленные ветки станут вашими локальными.

git branch -a Это покажет вам все удаленные ветки.

git checkout --track origin/<branch you want to checkout>

Проверьте, находитесь ли вы в нужной ветке, с помощью следующей команды;

git branch

Вывод будет таким;

*your current branch 
some branch2
some branch3 

Обратите внимание на знак *, обозначающий текущую ветку.

Лучше поздно, чем никогда, но вот лучший способ сделать это:

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

На данный момент у вас есть полная копия удаленного репозитория со всеми его ветками (проверьте с помощью git branch).Вы можете использовать --mirror вместо --bare если в вашем удаленном репозитории есть собственные пульты.

Просто сделайте это:

$ 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» извлекает все, даже ветки, вам просто нужно их извлечь, и тогда ваша локальная ветка будет создана.

Вам нужно всего лишь использовать «git clone», чтобы получить все ветки.

git clone <your_http_url>

Несмотря на то, что вы видите только главную ветку, вы можете использовать «git Branch -a», чтобы увидеть все ветки.

git branch -a

И вы можете переключиться на любую ветку, которая у вас уже есть.

git checkout <your_branch_name>

Не волнуйтесь, после того, как вы «клонируете git», вам не нужно подключаться к удаленному репозиторию, «git Branch -a» и «git checkout» могут быть успешно запущены, когда вы закрываете Wi-Fi.Таким образом, доказано, что когда вы выполняете «git clone», он уже скопировал все ветки из удаленного репо.После этого вам не понадобится удаленный репозиторий, у вашего локального репозитория уже есть коды всех филиалов.

А git clone предполагается скопировать весь репозиторий.Попробуйте клонировать его, а затем запустите git branch -a.В нем должны быть перечислены все филиалы.Если затем вы хотите переключиться на ветку «foo» вместо «master», используйте git checkout foo.

Используйте мой инструмент git_remote_branch (на вашем компьютере должен быть установлен Ruby).Он создан специально для того, чтобы максимально упростить манипуляции с удаленными ветками.

Каждый раз, когда он выполняет операцию от вашего имени, он печатает ее на консоли красным цветом.Со временем они окончательно впиваются в мозг :-)

Если вы не хотите, чтобы grb запускал команды от вашего имени, просто используйте функцию «объяснение».Команды будут выведены на вашу консоль, а не выполнены за вас.

Наконец, все команды имеют псевдонимы, чтобы облегчить запоминание.

Обратите внимание, что это альфа-программное обеспечение ;-)

Вот справка при запуске grb help:

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 branch -a

можно показать все ветки репозитория, причем командой

$ git checkout -b branchname origin/branchname

затем вы можете «загрузить» их вручную по одному.


Однако, если вы хотите клонировать репозиторий с большим количеством ветвей, все способы, показанные выше, являются длительными и утомительными по сравнению с гораздо более чистым и быстрым способом, который я собираюсь показать, хотя он и немного сложен.Для этого вам понадобится три шага:

  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. Третий шаг

Возьмите все, что находится внутри текущей папки, и создайте все ветки на локальном компьютере, сделав это обычным репозиторием.

$ git reset --hard

Итак, теперь вы можете просто ввести команду «git Branch» и увидеть, что все ветки загружены.

Это быстрый способ клонировать репозиторий git со всеми ветками одновременно, но это не то, что вы хотите делать таким образом для каждого отдельного проекта.

Глядя на один из ответов на вопрос, я заметил, что его можно сократить:

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

Но будьте осторожны, если одна из удаленных веток называется, например.admin_master он не скачается!

Спасибо bigfish за оригинальную идею

Клонирование из локального репозитория не будет работать с помощью 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 branch, они какие-то скрытые...

Итак, если вы хотите увидеть названия всех ветвей, просто добавьте --all флаг такой:

git branch --all или git branch -a

Если вы просто оформите заказ в отделении, вы получите все, что вам нужно.

Но как насчет того, чтобы после клонирования ветка была создана кем-то другим?

В этом случае просто выполните:

git fetch

и еще раз проверь все ветки...

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

git fetch && git checkout your_branch_name

Также создал изображение ниже, чтобы вы могли упростить то, что я сказал:

git branch --all to get all branches

#!/bin/bash
for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

Этот код перенесет весь код удаленных ветвей в локальное репо.

Для копирования и вставки в командную строку:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

Для большей читабельности:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


Это будет:

  1. проверить мастер (чтобы мы могли удалить ветку, в которой находимся)
  2. выберите удаленный для оформления заказа (измените его на любой пульт, который у вас есть)
  3. перебрать все ветки пульта, кроме мастера и HEAD
    1. удалить локальная ветка (чтобы мы могли проверить принудительно обновленные ветки)
    2. проверить филиал с удаленного
  4. проверьте мастера (ради этого)

На основе отвечать из ФонК.

Мне нужно было сделать то же самое.Вот мой Рубин сценарий.

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

Я написал это маленькое PowerShell функции, чтобы иметь возможность проверять все мои ветки git, которые находятся на удаленном источнике.

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

Дополнительные функции git можно найти на мой репозиторий настроек git

Git обычно (если не указано) извлекает все ветки и/или теги (ссылки, см.: git ls-refs) из одного или нескольких других репозиториев вместе с объектами, необходимыми для завершения их истории.Другими словами, он выбирает объекты, доступные уже загруженным объектам.Видеть: Что значит git fetch действительно?

Иногда у вас могут быть ветки/теги, которые не связаны напрямую с текущим, поэтому git pull --all/git fetch --all в этом случае не поможет, но вы можете перечислить их:

git ls-remote -h -t origin

и получите их вручную, зная имена ссылок.

Итак, чтобы принеси их всех, пытаться:

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.remote является origin.
    • Проверить, если origin указывает на правильный URL-адрес через: git remote show origin (видеть это почта).

Ни один из этих ответов не помог, за исключением того, что пользователь «никто» не на правильном пути.

У меня возникли проблемы с перемещением репо с одного сервера/системы на другой.Когда я клонировал репозиторий, он создал только локальную ветку для мастера, поэтому, когда я перешел на новый удаленный сервер, была отправлена ​​только главная ветка.

Итак, я нашел эти два метода ОЧЕНЬ полезными.Надеюсь, они помогут кому-то еще.

Метод 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

Используйте команды, которые вы можете запомнить

Я использую Bitbucket, службу хостинга репозиториев Atlassian.Поэтому я стараюсь следовать их документам.И это прекрасно работает для меня.С помощью следующих простых и коротких команд вы можете проверить свою удаленную ветку.

Сначала клонируйте свой репозиторий, затем перейдите в папку назначения.И последнее, но не менее важное: получение и оформление заказа:

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

Вот и все.Вот немного более реальный пример:

git clone https://username@bitbucket.org/team/repository.git project_folder
cd project_folder
git fetch && git checkout develop

Подробную информацию о командах вы найдете в документации:Команда клонирования, Получить команду, Команда оформления заказа

По состоянию на начало 2017 года ответ в этом комментарии работает:

git fetch <origin-name> <branch-name> опускает ветку для вас.Хотя это не тянет все ветки одновременно, вы можете выполнить это отдельно для каждой ветки.

Вот еще одна короткая команда с одной линией, которая создает локальные филиалы для всех отдаленных ветвей:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

Это также работает правильно, если уже созданы локальные ветки отслеживания.Вы можете позвонить ему после первого git clone или в любое время позже.

Если вам не нужно иметь master ветка извлечена после клонирования, используйте

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout

git clone --mirror исходное репо хорошо подходит для этого.

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top