Git - У Bare repo не может быть worktree для главной ветки - ПОЧЕМУ?

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

Единственное исключение, похоже, объединяется в master. Когда я делаю git worktree add /tmp/path/to/worktree master, я получаю сообщение об ошибке:

fatal: 'master' уже проверен на '/path/to/bare/repo'

Но это явно неверно, git worktree list дает:

/path/to/bare/repo (голый)

... и, конечно же, на этом пути нет дерева работы, а только файлы с открытым репо, которые вы ожидаете.

ОБНОВЛЕНИЕ: Я связался с сопровождающими git, и они согласны с тем, что это может быть ошибка. У меня есть предварительный патч от них, чтобы проверить. Кроме того, я также смог воспроизвести желаемое поведение без патча.

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

Ответ 1

Оказывается, что это ошибка в git, начиная с реализации worktree в 2.5 и выше.

Голый репозиторий по-прежнему имеет ссылку HEAD reflink. Независимо от того, на что ссылается эта ссылка, считается, что git (с включением и включением 2.10) является ветвью по умолчанию для новых клонеров и (ошибочно) обрабатывается так, как если бы она находилась в активном дереве работ.

Я получил патч от сопровождающих git, чтобы исправить это поведение, и, похоже, он работает. В качестве альтернативы, должно быть возможно использовать update-ref для голого репо, чтобы временно переключиться с мастера.

Я буду тестировать оба этих параметра.

Ответ 2

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

В качестве обходного пути вы можете запустить git update-ref --no-deref HEAD 'HEAD^{commit}'. Он отсоединяет текущий HEAD, поэтому мастер не проверяется