Несколько рабочих каталогов с Git?



Я не уверен, что это что-то поддерживается Git, но в теории кажется, что это должно работать для меня.



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



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



Я знаю о локальных решениях клонирования git (по умолчанию это hardlink shared objects и параметр --shared, который устанавливает альтернативное хранилище объектов с исходным РЕПО), но эти решения только сокращают использование дискового пространства, и особенно в случае --shared, кажутся чреватыми опасностью.



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

562   4  
git

4 ответов:

Git 2.5 предлагает с июля 2015 года замену contrib/workdir/git-new-workdir:git worktree

посмотреть совершить 68a2e6a by Junio C Hamano (gitster).

The релиз, обратите внимание, упоминает:

замена contrib/workdir/git-new-workdir это не зависит от символических ссылок и делает совместное использование объектов и ссылок более безопасным, делая borrowee и заемщиков осведомленными о каждом другой.

посмотреть commit 799767cc9 (Git 2.5rc2)

это означает, что теперь вы можете сделать git worktree add <path> [<branch>]

создать <path> и в кассу <branch> в нее. Новый рабочий каталог связан с текущим репозиторием, разделяя все, кроме работы конкретные файлы каталогов, таких как голова, индекса и т. д. Элемент git worktree добавил:

A репозиторий Git может поддерживать несколько рабочих деревьев, что позволяет проверить более одной ветке одновременно.
С git worktree add, с репозиторием связано новое рабочее дерево.

это новое рабочее дерево называется " связанным рабочим деревом "в отличие от" основного рабочего дерева", подготовленного"git init" или "git clone".
Хранилище имеет одно основное рабочее дерево (если это не "голый" репозиторий) и ноль или более связанных между собой рабочих деревья.

детали:

каждое связанное рабочее дерево имеет частный подкаталог в репозитории $GIT_DIR/worktrees чтобы быть в курсе из.

поддержка подмодулей является неполным.
Не рекомендуется делать несколько проверок суперпроекта.


Примечание: с git 2. 7rc1 (ноябрь 2015) Вы можете список ваши рабочие деревья.
Смотрите commit bb9c03b,совершить 92718b7,совершить 5193490,commit 1ceb7f9, commit 1ceb7f9,совершить 5193490,commit 1ceb7f9,commit 1ceb7f9 (08 окт 2015), совершить 92718b7,совершить 5193490,commit 1ceb7f9,commit 1ceb7f9 (08 окт 2015), совершить 5193490,commit 1ceb7f9 (08 окт 2015), commit 1ceb7f9 (08 окт 2015), и commit ac6c561 (02 окт 2015) by Михаил Раппаццо (rappazzo).
(слитый Junio C Hamano--gitster-- in commit a46dcfb, 26 окт 2015)

worktree добавить ''

'git worktree list' выполняет итерацию по списку рабочего дерева и выводит сведения о рабочем дереве, включая путь к рабочему дереву, в настоящее время проверил ревизию и ветвь, и если рабочее дерево голое.

$ git worktree list
/path/to/bare-source            (bare)
/path/to/linked-worktree        abcd1234 [master]
/path/to/other-linked-worktree  1234abc  (detached HEAD)

также вариант формата фарфора доступный.

формат фарфора имеет строку на атрибут.

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

например:

$ git worktree list --porcelain

worktree /path/to/bare-source
bare

worktree /path/to/linked-worktree
HEAD abcd1234abcd1234abcd1234abcd1234abcd1234
branch refs/heads/master

worktree /path/to/other-linked-worktree
HEAD 1234abc1234abc1234abc1234abc1234abc1234a
detached

Примечание: Если вы перемещаете папку рабочего дерева, вам нужно вручную обновить gitdir' в директории записи.
Например, если связанное рабочее дерево перемещается в /newpath/test-next и .git file указывает на /path/main/.git/worktrees/test-next, потом обновить /path/main/.git/worktrees/test-next/gitdir ссылка .


будьте осторожны при удалении ветки: до git 2.9 (июнь 2016), вы можете удалить один в использовании в другое рабочее дерево.

, когда "git worktree" функции в "git branch -d" разрешено удаление ветви, извлеченной из другого рабочего дерева.

посмотреть commit f292244 (29 марта 2016) by Казуки Ямагути (rhenium).
Помог-by:Эрик Саншайн (sunshineco).
(слитый Junio C Hamano--gitster-- in commit 4fca4e3, 13 апр 2016)

branch -d: отказаться от удаления ветки, которая в данный момент извлечена

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


аналогично, до git 2.9 (июнь 2016) переименование ветви, проверенной в другом рабочем дереве, не корректировало символическую головку в указанном другом рабочем дереве.

посмотреть совершить 18eb3a9 (08 апр 2016), и совершить 70999e9, совершить 2233066 (27 марта 2016) by Кадзуки Ямагути (rhenium).
(слитый Junio C Hamano--gitster-- in совершить 741a694, 18 апр 2016)

branch -m: обновление всех головок рабочего дерева

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

это текущее поведение,/path/to / wt голова не обновляется:

  % git worktree list
  /path/to     2c3c5f2 [master]
  /path/to/wt  2c3c5f2 [oldname]
  % git branch -m master master2
  % git worktree list
  /path/to     2c3c5f2 [master2]
  /path/to/wt  2c3c5f2 [oldname]
  % git branch -m oldname newname
  % git worktree list
  /path/to     2c3c5f2 [master2]
  /path/to/wt  0000000 [oldname]

этот патч устраняет эту проблему путем обновления всех соответствующих головок рабочего дерева при переименовании ветки.


механизм блокировки официально поддерживается git 2.10 (Q3 2016)

посмотреть commit 080739b,совершить 6d30862,commit 58142c0,совершить 346ef53,совершить 346ef53,commit 58142c0,совершить 346ef53,совершить 346ef53 (13 июня 2016), а commit 984ad9e,совершить 6835314 (03 июня 2016) by Nguyễn Thái Ngọc Duy (pclouds).
Предложенный-by:Эрик Саншайн (sunshineco).
(слитый Junio C Hamano--gitster-- in commit 2c608e0, 28 июля 2016)

git worktree lock [--reason <string>] <worktree>
git worktree unlock <worktree>

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

<worktree>: если последние компоненты пути в пути рабочего дерева уникальны среди рабочих деревьев, его можно использовать для определите рабочие деревья.
Например, если у вас есть только РАБОЧИЕ деревья в "/abc/def/ghi" и "/abc/def/ggg", значит "ghi" или "def/ghi " достаточно указать на прежнее рабочее дерево.


Git 2.13 (Q2 2017) добавить lock опции in совершить 507e6e9 (12 апр 2017) by Nguyễn Thái Ngọc Duy (pclouds).
Предложенный-by:Дэвид Тейлор (dt).
Помог-по: Джефф Кинг (peff).
(слитый Junio C Hamano--gitster-- in commit e311597, 26 апр 2017)

разрешить блокировку рабочего дерева сразу после его создания.
Это помогает предотвратить гонку между "git worktree add; git worktree lock" и "git worktree prune".

так git worktree add' --lock эквивалентно git worktree lock после git worktree add, но без гонки состояние.


Git 2.17+ (Q2 2018) добавляет git worktree move/git worktree remove:посмотреть этот ответ.


ГИТ 2.19 (3-й квартал 2018) добавить "--quiet опции" сделать "git worktree add" меньше многословный.

посмотреть совершить 371979c (15 Авг 2018) by Элиа Пинто (devzero2000).
Помогали: Мартин Огрен,Duy Nguyen (pclouds) и Эрик Солнца (sunshineco).
(слитый Junio C Hamano--gitster-- in commit a988ce9, 27 авг 2018)

worktree добавить --quiet опции

добавить '--quiet ' option to git worktree, а другой git команды.
- add ' это единственная команда, на которую он влияет, так как все другие команды, кроме 'list', в настоящее время молчат по умолчанию.

The git дистрибутив поставляется с вклад скрипт под названием git-new-workdir. Вы бы использовали его следующим образом:

git-new-workdir project-dir new-workdir branch

где project-dir-это имя каталога, содержащего ваш .git репозитория. Этот скрипт создает другой `.каталог git' с множеством символических ссылок на исходный файл, за исключением файлов, которые не могут быть разделены (например, текущая ветвь), что позволяет работать в двух разных ветвях.

это звучит немного хрупко, но это выбор.

я наткнулся на этот вопрос, надеясь на решение, которое я не нашел здесь. Так что теперь, когда я сделал найти то, что мне нужно, я решил разместить его здесь для других.

предостережение: это, вероятно, не очень хорошее решение, если вам нужно edit несколько ветвей одновременно, как OP состояний. это для того, чтобы иметь несколько ветвей проверил одновременно, что вы не собираетесь редактировать. (Множественная работа каталоги, поддерживаемые одним .папка git.)

было несколько вещей, которые я узнал, так как я пришел к этому вопросу в первый раз:

  1. что " "голый" репозиторий" это. Это по существу содержание .)

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

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

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

Comments

    Ничего не найдено.