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, поэтому мастер не проверяется