Git Extensions Push с настройками по умолчанию (*:refs/head /*) портит все ветви
Проблема
Это похоже на ошибку GitExtensions, к которой я не смог найти конкретную информацию. Я считаю, что проблема возникает, когда у вас есть пустой репозиторий с более чем одной веткой. Если вы затем нажмете, вы получите предупреждение, что если вы решите игнорировать, вы найдете беспорядок ветки. Или, в зависимости от того, как вы нажимаете, не появляется даже предупреждение, и это повсеместно обречено!
Допустим, у нас есть 2 локальных филиала master
а также another
, И по умолчанию origin
набор для толкания. После обычного толчка мы также нашли бы origin/master
а также origin/another
, это все.
Но после обреченного толчка мы найдем дублированный origin/master
а также origin/another
плюс origin/refs/heads/master
и это также дублируется. За каждую дополнительную ветку. И это не значит, что мы выдвигаем все ветви или что-то в этом роде, и при этом мы не используем функцию Multiple Branches.
На самом деле, после того, как это произошло, мы не можем даже просто push
без ошибок! (да, используя Windows, конечно)
Pushing to \\\server\git\repo error: dst refspec refs/heads/another matches more than one. error: failed to push some refs to '\\\server\git\repo'
Проблема становится очевидной, если перечислить ветви с git branch -r
,
Починить это
Нам нужно сделать что-то вроде этого:
- Вручную удалите
refs/heads
папка вorigin
, Иногда это работает только с помощьюgit push origin :<branchName>
Остальным нам нужно перейти более надежно и прямо в папку. Это трудный шаг, и главная проблема возникает, когда они не работают... git fetch -p
, для внесения изменений происхождения в местный.- В конечном итоге пройти через всех клиентов и использовать
git remote update
, При необходимости удалите одни и те же ветки одну за другой или любым другим способом, например, снова и снова, прямо в папку. Иногда на этих шагах возникает еще одна проблема, которую я пока не могу диагностировать.
Частота
Для нас это установленный факт. Несмотря на то, что я не провел много экспериментов, чтобы выяснить, чем именно это вызвано, это происходит на любой из 5 машин, использующих этот репозиторий, все настроены одинаково, за исключением bare
,
И каждый раз, когда это случается, мне нужно бежать и выяснять, как это исправить. На этот раз я решил задокументировать это, так как я никогда не мог найти что-либо в сети достаточно конкретное.
Зачем
Вопрос здесь: почему это происходит и как это предотвратить? Это даже ошибка GitExtensions только? Это, конечно, происходит с нашей стороны, только с этим конкретным сценарием, в GitExtensions.
1 ответ
Имея дело с другим более простым представителем, случайно (также по совпадению и наконец) обнаружил преступника!
Под .git/config
у нас были эти 2 строки для [remote "origin"]
:
push = refs/heads/*:refs/heads/*
push = refs/tags/*:refs/tags/*
Просто добавив это к вершине, решил все проблемы:
push = *:* # hack for git extensions
Поначалу причина для двух строк заключалась в том, чтобы "подтолкнуть все к серверу", включая теги и заголовки.
Я полагаю, что GitExtensions каким-то образом читают их и неправильно изменяют свое поведение по умолчанию (почему он получает только правильную сторону от первого параметра?) И, таким образом, эффективно делают это при каждом нажатии:
> git push origin *:refs/heads/*
И, парень, скажу вам, убрать этот бардак не просто задача!
Решаемые.