fetch в git не получает все ветки


202

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

Правильное действие , кажется , что

git fetch
git branch -a
* master
  remotes/origin/HEAD --> origin/master
  remotes/origin/master
git checkout -b dev-gml origin/dev-gml

На этом этапе возникает проблема, по какой-то причине после того, как git fetchя не вижу удаленную ветку dev-gml. Почему нет? Если я клонирую репозиторий заново, он есть, поэтому, безусловно, существует удаленная ветка:

$ mkdir ../gitest
$ cd ../gitest
$ git clone https://github.com/example/proj.git
Cloning into proj...
remote: Counting objects: 1155, done.
remote: Compressing objects: 100% (383/383), done.
remote: Total 1155 (delta 741), reused 1155 (delta 741)
Receiving objects: 100% (1155/1155), 477.22 KiB | 877 KiB/s, done.
Resolving deltas: 100% (741/741), done.
$ cd projdir
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/dev-gml
  remotes/origin/master

Я пытался git update, git pull, git fetch --all, git pretty-pleaseво всех возможных перестановках ...


45
Что git config --get remote.origin.fetchпроизводит? Если это не так +refs/heads/*:refs/remotes/origin/*, то, вероятно, так и должно быть.
Торек

да это именно то, что он производит
Эдвард Ньюэлл

3
Точно такая же проблема, но комментарий выше решил ее! Я имел +refs/heads/master:refs/remotes/origin/masterс masterвместо*
Мирко

1
Та же проблема для меня, но ни одно из предложений на этой странице не решает ее. Weird.
Магнус

1
@ thoni56: Да, это скорее всего из-за мелкого клона.
Trần

Ответы:


386

Проблема может быть замечена при проверке remote.origin.fetchнастройки
(строки, начинающиеся с, $являются приглашениями bash с набранными мною командами. Остальные строки являются результирующим выводом)

$ git config --get remote.origin.fetch
+refs/heads/master:refs/remotes/origin/master

Как вы можете видеть, в моем случае, пульт дистанционного управления был настроен на выборку основной ветви только и только. Я исправил это, как показано ниже, включая вторую команду для проверки результатов.

$ git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
$ git config --get remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*

Подстановочный знак, *конечно, означает все под этим путем.

К сожалению, я увидел этот комментарий после того, как уже покопался и нашел ответ методом проб и ошибок.


2
Вероятно, это должен быть принятый ответ, поскольку это фактически решило проблему в оригинальном сообщении.
LocalPCGuy

1
просто примечание, мне пришлось добавить --replace-allпараметр, чтобы заменить все значения в конфигурации для моегоremote.origin.fetch
Garis M Suero

4
Обратите внимание, что это может произойти, если вы клонировали свой репозиторий только с одной веткой, напримерgit clone <url> --branch <branch> --single-branch [<folder>]
Narretz

2
Проверьте ответ Stux
Newbee

5
Это может произойти, когда вы клонируете сgit clone ... --depth 1
Анатолий Бивол

107

У меня была эта проблема сегодня на репо.

Это не было +refs/heads/*:refs/remotes/origin/*проблемой согласно главному решению.

Симптом был просто , что git fetch originили git fetchпросто не появлялось ничего делать, хотя были удаленные ветви , чтобы принести.

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

удалить с помощью: git remote rm origin

и воссоздать с: git remote add origin <git uri>


14
У меня был правильный GIT конфигурации для remote.origin.fetchт +refs/heads/*:refs/remotes/origin/*. Вышеуказанное решение помогло мне.
Newbee

9
Это решение было правильным и для меня. Это прискорбно, поскольку это указывает на потенциальную ошибку в Git.
Роберт Ошлер

2
Это также решило мою проблему. Я также, кажется, имею эту проблему на машине с git версии 2.19.1v, но не испытывал ее на другой машине с git версии 2.17.1
jerpint

6
git remote update originработал на меня. Я думаю, что-то нужно освежить?
Фелипе Жерар

2
git remote update originне работал для меня, но удаление и добавление удаленного сделал.
Анатолий Кметюк

58

Удаленное обновление

Вам нужно бежать

git remote update

или

git remote update <remote> 

Затем вы можете запустить git branch -rсписок удаленных филиалов.

Оформить заказ на новую ветку

Чтобы отследить (новую) удаленную ветку как локальную:

git checkout -b <local branch> <remote>/<remote branch>

или (иногда это не работает без дополнительного remotes/):

git checkout -b <local branch> remotes/<remote>/<remote branch>

Полезные хитрости


5
Но моя проблема в том, что я не могу проверить существующую удаленную ветку, потому что мой клиент git не думает, что она существует. Смотри мой вопрос. Обратите внимание, что когда я запускаю, git fetchа затем git branch -aон не показывает все ветви. Мне пришлось удалить мой рабочий каталог и повторно клонировать, чтобы увидеть ветку dev-gml, созданную соавтором. Это сработало на этот раз, но мы будем часто разветвляться!
Эдвард Ньюэлл

Привет @EdwardNewell, спасибо за ответ, просто чтобы сообщить, твоя ссылка cheat.errtheblog.com/s/git для меня мертва ...
Kjellski

Прошло много времени с тех пор, как я впервые задал этот вопрос, и я просто получил пинг, потому что кто-то опубликовал заново. Я принимаю этот ответ, хотя изначально у меня ничего не получалось. Причина, по которой я, наконец, пометил это как правильное, заключается в том, что я подозреваю, что то, что он (а) написал Edit:очень хорошо, могло сработать. Это то, что я бы попробовал, если бы все еще сталкивался с проблемой. HTH
Эдвард Ньюэлл

Для справки, немного, что помогло мне здесь git remote update origin. Это сделало недостающую ветку видимой через git branch -l -r. (Я посмотрел, git config --get remote.origin.fetchи результат оказался таким, +refs/heads/*:refs/remotes/origin/*как ожидалось.)
Роберт Додье,


4

Чтобы сделать его более конкретным, создайте отслеживающую ветвь, что означает, что вы сейчас отслеживаете удаленную ветвь.

git branch --track branch remote-branch
git branch --track exp remotes/origin/experimental

После чего вы можете

git branch   # to see the remote tracking branch "exp" created .

Тогда для работы над этой веткой делай

git checkout branchname
git checkout exp

После того, как вы внесли изменения в ветку. Вы можете выполнить git fetch и git merge с удаленной веткой отслеживания, чтобы объединить изменения и отправить в удаленную ветку, как показано ниже.

git fetch origin
git merge origin/experimental  
git push origin/experimental

Надеюсь, это поможет и даст вам представление о том, как это работает.


1

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

Также в моем случае git config --get remote.origin.fetchничего не вернули

Проблема в том, что в .git/configфайле в строке выборки соответствующего удаленного блока произошла опечатка . Вероятно, что-то, что я добавил по ошибке ранее (иногда я непосредственно просматриваю этот файл или даже редактирую его)

Итак, проверьте правильность вашей удаленной записи в .git/configфайле, например:

[remote "origin"]
    url = https://[server]/[user or organization]/[repo].git
    fetch = +refs/heads/*:refs/remotes/origin/*

0

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


0

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

В ветке Notice по- noExternal3прежнему отображается удаленный репозиторий. Не уверен, какое сочетание команд bash нашло бы или настроило это.


0

Была такая же проблема сегодня при настройке моего репо с нуля. Я перепробовал все, ничего не работало, кроме удаления источника и повторного добавления.

git remote rm origin
git remote add origin git@github.com:web3coach/the-blockchain-bar-newsletter-edition.git

git fetch --all
// Ta daaa all branches fetched

-1

У нас была такая же проблема, и вы должны использовать

git fetch

git push origin branch_name

git branch -r

Надеюсь, что это поможет кто-то сталкивается с той же проблемой

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.