'<Branch>' уже проверен в '</other/location>' в git рабочих тонах

Я начал использовать git worktrees. Кажется, что это работает, но я получаю эту ошибку при попытке проверить ветвь в клонированной рабочей строке:

fatal: '<branch>' is already checked out at '</other/location>'

Как мне обойти это без удаления каталога .git/worktrees?

Ответ 1

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

Если вы действительно удалили другое дерево работы, просто запустите git worktree prune, чтобы сделать Git реализовать это. Если вы на самом деле не удалили другое дерево работы, не проверяйте его дважды: это не весело.

Ответ 2

Как мне обойти это, не удаляя каталог .git/worktrees?

Вам будет легче с Git 2. 17+ (Q2 2018), так как " git worktree " выучил подкоманды " move " и " remove ".

Смотрите коммит 7f19def (04 марта 2018 г.) Эрика Саншайна (sunshineco).
См. Коммит ee6763a, коммит cc73385, коммит 78d986b, коммит c64a8d2, коммит 9f792bb, коммит 9c620fc (12 февраля 2018 г.) и коммит 4ddddc1 (24 января 2018 г.) Нгуеном Тай pclouds Дуй (pclouds).
(Объединено Junio C Hamano - gitster - в коммите bd0f794, 14 марта 2018 г.)

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

worktree move: новая команда

Эта команда позволяет перемещать связанные рабочие деревья.
Главное рабочее дерево не может (пока) быть перемещено.

А также:

worktree move: отказаться от перемещения рабочих деревьев с субмодулями

Подмодули содержат файлы .git с относительными путями.
После worktree move эти файлы необходимо обновить, иначе они могут указывать в никуда.

Это повязка на повязку, чтобы убедиться, что " worktree move " не сломало людей на рабочем месте случайно.
При .git кода обновления файла .git этот validate_no_submodules() может быть удален.


Примечание: до Git 2.21 (Q1 2019) " git worktree remove " и " git worktree move " отказывались работать, когда задействован субмодуль.
Это было ослаблено, чтобы игнорировать неинициализированные подмодули.

Ответ 3

Просто перейдите в каталог worktree нужной ветки и автоматически checkout для вас.

В моем случае у меня есть два длительных worktree, которые означают две соответствующие ветки рядом с master.

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

Существует один репозиторий, но у меня есть 3 отдельные папки рядом друг с другом для каждой ветки выше. И сделайте общие изменения в master. затем объедините его с двумя другими версиями.

Конкретные изменения каждой версии также будут размещены в соответствующей папке, а работы по каждому проекту изолированы, и IDE не будет путать.

Надеюсь, что это поможет.

Ответ 4

Обратите внимание, что это также происходит, если в вашем $pwd есть ссылки. git вероятно, должен readlink -f на $pwd перед проверкой.

Редактировать: Или это действительно может быть, потому что я пропустил вызов git worktree prune. Теперь это работает.

Ответ 5

Поскольку вы не можете оформить заказ дважды как в рабочем дереве, так и в исходном хранилище. Как насчет проверки оригинального репо в другом месте, прежде чем оформить рабочее дерево?

git -C </other/location> checkout <branch>~1
git -C <worktree> checkout <branch>