Почему ветвь git -t не работает с "Не отслеживать: неоднозначная информация"?
Когда я пытаюсь создать новую ветку, отслеживающую удаленную ветку, я получаю следующее:
$ git branch -t test origin/foo
error: Not tracking: ambiguous information for ref refs/remotes/origin/foo
Источник кажется каким-то образом ищет ветки для отслеживания и выбрасывает меня, потому что он находит less больше, чем один, но я точно не понимаю, что он ищет, так как я уже сказал ему, что отслеживать в командной строке.
Может кто-нибудь сказать мне, что происходит и как это исправить?
Ответы
Ответ 1
Получил! Проблема состояла в том, что я ранее настроил пульт с --mirror
, чтобы иметь резервную/общедоступную копию моего репозитория.
Если вы запустите
git remote add --mirror <name> <url>
он не только указывает на удаленный доступ в качестве зеркала (именно это я и хотел нажимать), но также настраивает параметр remote.<mirror>.fetch
для зеркала на +refs/*:refs/*
, что означает, что все ваши ветки вдруг "отслеживают" ваше зеркало репозиторий и любая попытка создания ветки отслеживания будет терпеть неудачу.
(В качестве дополнительного бонуса запуск git fetch <mirror>
будет перезаписывать все ваши refs старыми из резервного резервного копирования.)
Решение, которое, как представляется, устраняет эту проблему, устанавливает remote.<mirror>.fetch
в :
(что, я надеюсь, означает "никогда ничего не брать" ). Это, по-видимому, устраняет проблему отслеживания и устраняет смертельную выборку.
Ответ 2
Я видел это также, когда у меня было два удаленных репо с тем же шаблоном выборки (по умолчанию) (fetch = +refs/heads/*:refs/remotes/origin/*
) и теми же ветвями.
Я до сих пор не решил, как правильно его исправить, так как я хочу продолжить push/pull для обоих репо, но вручную добавляет информацию в проект .git/config
, например:
[branch "mybranch"]
remote = origin
merge = refs/heads/mybranch
Ответ 3
поскольку он находит менее одного
Нет: поскольку он находит более одной соответствующей удаленной ветки, что означает, что функция remote_find_tracking()
возвращает более одной ветки отслеживания для данной локальной ссылки ref.
Является some_remote_branch
уже не отслеживается одним из ваших локальных веток?
(a git config -l
позволит вам проверить, что вы в настоящее время настроили).
(a git branch -r
также может помочь вам перечислить текущие ветки удаленного отслеживания.)
удаленные ветки, которые, как я думал, являются чем-то иным, чем ветки удаленного отслеживания.
Неверно, как показано этот поток:
удаленные ветки - это "реальные" ветки удаленного отслеживания. Вы не фиксируете их локально, это, по сути, копии только для чтения именно того, что происходит в удаленном репозитории.
Если вы попробуете 'git -checkout' ветку удаленного отслеживания, вы получите отдельную головку.
Локальная ветка:
От ветки, на которую вы можете совершать изменения. При желании ветвь может быть настроена так, чтобы "следовать" одной из ветвей удаленного отслеживания. Это означает, что "git-pull
" без аргументов (когда локальная ветвь проверена) автоматически будет "git-fetch
", а затем "git-merge
" ветвь удаленного отслеживания.
Сейчас:
это работа git-fetch
для обновления ветвей удаленного отслеживания с любыми изменениями, обнаруженными в удаленном репозитории.
git-pull
запускает git-fetch
, а затем запускает git-merge
, чтобы обновить ветвь, отмеченную в данный момент.
Проблема заключается в том, что для git -merge:
Когда это произойдет, git-merge
должен решить, какой remote-tracking-branch
должен объединиться в локально удаленную локальную ветвь.
Вы можете установить, какой remote-tracking-branch
будет выбран в этой ситуации с опцией --track.
--track
устанавливает локальную следующую ветвь для обращения к удаленной ветке, а не к ветке отслеживания
Подумайте, что remote_find_tracking()
принимает один удаленный и refspec с src заполненным и возвращает данный refspec после заполнения своего dst, если соответствующее отслеживание было настроено для удаленного, что означает git.
/*
* For the given remote, reads the refspec src and sets the other fields.
*/
int remote_find_tracking(struct remote *remote, struct refspec *refspec);
Может быть, он считает, что он уже имеет локальную следующую ветку, соответствующую some_remote_branch
. У вас есть локальная ветка с таким же именем?
Или, наоборот: ваша текущая ветка имеет удаленную ветвь с похожим именем, что делает ее естественным кандидатом для любого git-merge
: попытка отслеживать другую удаленную ветвь сделает git-merge
неспособным выбрать, какие локальные ветвь для обновления/слияния с изменениями удаленного.
Ответ 4
Я попал в такую ситуацию, но я не знаю, как это сделать. Список из git branch -av
показал мне только одну удаленную ветвь отслеживания для ветки, о которой я заботился (origin/dev
).
Что я сделал, чтобы исправить это, было использовать шестнадцатеричный хэш хеширования вместо origin/dev
:
git checkout -b dev abc123
git push -u origin dev
Когда я сделал push с -u
Git said Branch dev set up to track remote branch dev from origin.
Последующие вытягивания и нажатия сделали так, как я ожидал.