Подтвердить что ты не робот

Почему ветвь git -t не работает с "Не отслеживать: неоднозначная информация"?

Когда я пытаюсь создать новую ветку, отслеживающую удаленную ветку, я получаю следующее:

$ git branch -t test origin/foo
error: Not tracking: ambiguous information for ref refs/remotes/origin/foo

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

Может кто-нибудь сказать мне, что происходит и как это исправить?

4b9b3361

Ответ 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. Последующие вытягивания и нажатия сделали так, как я ожидал.