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

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

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

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

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

5 ответов


Я видел это также, когда у меня было два удаленных РЕПО с тем же (по умолчанию) шаблоном выборки (fetch = +refs/heads/*:refs/remotes/origin/*) и той же ветви.

Я все еще не понял, как исправить это правильно, так как я хочу продолжать нажимать/тянуть на оба РЕПО, но вручную добавлять информацию в проект .git/config строительство, например:

[branch "mybranch"]
  remote = origin
  merge = refs/heads/mybranch

потому что он находит меньше одного

нет: потому что он находит больше чем одна соответствуя удаленная ветвь, которая значит функцию remote_find_tracking() возвращает более одной ветви отслеживания для данной локальной ветви ref.

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

считают, что remote_find_tracking() принимает один удаленный и refspec с заполненным src и возвращает данный refspec после заполнения его dst, если соответствующее отслеживание было настроено для удаленного, то есть git.

/*
 * For the given remote, reads the refspec's src and sets the other fields.
 */
int remote_find_tracking(struct remote *remote, struct refspec *refspec);

может быть, он считает, что у него уже есть локальное соответствие следующей ветви some_remote_branch. У вас есть местное отделение с таким же названием?
Или наоборот: ваша текущая ветвь имеет удаленную ветвь с аналогичным именем, что делает ее естественным кандидатом для любого git-merge: пытается сделать его track другое удаленная ветка сделает git-merge невозможно выбрать, какую локальную ветвь обновить / объединить с изменениями удаленного.


понял! Проблема заключалась в том, что я ранее настроил пульт дистанционного управления с --mirror, С целью создания резервной / общедоступной копии моего репозитория.

если вы запустите

git remote add --mirror <name> <url>

он не только помечает пульт как зеркало (что я хотел для толчков), но и настраивает remote.<mirror>.fetch опция для зеркала в +refs/*:refs/*, что означает, что все ваши ветви внезапно "отслеживают" ваш зеркальный репозиторий и любая попытка создать ветку отслеживания будет неудача.

(в качестве дополнительного бонуса, под управлением git fetch <mirror> собирается перезаписать все ваши ссылки со старыми из вашего резервного РЕПО.)

решение, которое, похоже, устраняет эту проблему, устанавливает remote.<mirror>.fetch to : (что, я надеюсь, означает "никогда ничего не приносить"). Это, по-видимому, устраняет проблему отслеживания и устраняет смертельную выборку.


Я попал в такую ситуацию, но не знаю как. Список из git branch -av показал мне только одну удаленную ветку отслеживания для ветки, о которой я заботился (origin/dev).

то, что я сделал, чтобы исправить это, было использовать шестнадцатеричный хэш фиксации вместо origin/dev:

git checkout -b dev abc123
git push -u origin dev

когда я сделал толчок с -u ГИТ сказал Branch dev set up to track remote branch dev from origin. последующие тяги и толчки работали так, как я ожидал.


ни один из упомянутых здесь работал для меня. В итоге получилось вот что:--6-->

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

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

теперь я открыл .git/config файл (который не имел никакой записи ветви test) и добавил следующее вручную:

[branch "test"]
        remote = origin
        merge = refs/heads/test

после чего все работало нормально.