Я не уверен, что это что-то поддерживается Git, но в теории мне кажется, что это должно работать.
Мой рабочий процесс часто включает в себя редактирование файлов в нескольких ветках одновременно. Другими словами, я часто хочу открыть несколько файлов в одной ветви, пока я редактирую содержимое другого файла в другой ветви.
Мое типичное решение для этого состоит в том, чтобы сделать две проверки, но позор, что я не могу разделить ветки и ссылки между ними. То, что я хотел бы, это просто иметь две рабочие директории, управляемые одной и той же папкой .git.
Я знаю о локальных решениях git clone (по умолчанию это жесткая ссылка на общие объекты и опция --shared, которая устанавливает альтернативное хранилище объектов с исходным репо), но эти решения только сокращают использование дискового пространства и особенно в случае --shared, похоже, чревато опасностью.
Есть ли способ использовать одну папку .git и иметь на ней две рабочие директории? Или Git жестко запрограммирован, чтобы в любой момент был проверен только один рабочий каталог?
git-new-workdir
будет заменен наgit checkout --to=<path>
Git 2.5. Смотрите мой ответ нижеgit worktree add <path> [<branch>]
(Git 2.5 rc2). Смотрите мой отредактированный ответ нижеОтветы:
Git 2.5 предлагает с июля 2015 года замену
contrib/workdir/git-new-workdir
: git worktreeСмотрите коммит 68a2e6a от Junio C Hamano (
gitster
) .В выпуске упоминается :
Смотрите коммит 799767cc9 (Git 2.5rc2)
Это означает, что теперь вы можете сделать
git worktree add <path> [<branch>]
Предупреждение: еще есть раздел
git worktree
«ОШИБКИ», о котором нужно знать.Примечание: с помощью git 2.7rc1 (ноябрь 2015 г.) вы можете составить список своих рабочих деревьев.
См совершать bb9c03b , совершать 92718b7 , совершают 5193490 , совершают 1ceb7f9 , совершают 1ceb7f9 , совершают 5193490 , совершают 1ceb7f9 , совершают 1ceb7f9 (08 окт 2015), совершать 92718b7 , совершать 5193490 , совершают 1ceb7f9 , совершают 1ceb7f9 (08 окт 2015), совершают 5193490 , зафиксировать 1ceb7f9 (8 октября 2015 г.), зафиксировать 1ceb7f9 (08 октября 2015 г.) и зафиксировать ac6c561(02 октября 2015) Майкл Раппаццо (
rappazzo
) .(Слиты Junio C Hamano -
gitster
- в фиксации a46dcfb , 26 октября 2015)Например:
Примечание: если вы перемещаете папку рабочего дерева, вам необходимо вручную обновить
gitdir
файл.См. Коммит 618244e (22 января 2016 г.) и коммит d4cddd6 (18 января 2016 г.) от Nguyễn Thái Ngọc Duy (
pclouds
) .Помогает: Эрик Саншайн (
sunshineco
) .(Слиты Junio C Hamano -
gitster
- в фиксации d0a1cbc , 10 февраля 2016)Новый документ в git 2.8 (март 2016 года) будет включать:
Будьте осторожны при удалении ветки: до git 2.9 (июнь 2016 года) вы могли удалить одну из используемых веток в другом рабочем дереве.
См. Коммит f292244 (29 марта 2016 г.) Казуки Ямагути (
rhenium
) .Помогает: Эрик Саншайн (
sunshineco
) .(Слиты Junio C Hamano -
gitster
- в фиксации 4fca4e3 , 13 Apr 2016)Точно так же до git 2.9 (июнь 2016 г.) переименование ветви, отмеченной в другом рабочем дереве, не корректировало символический заголовок в другом рабочем дереве.
См. Коммит 18eb3a9 (8 апреля 2016 г.) и коммит 70999e9 , коммит 2233066 (27 марта 2016 г.) от Kazuki Yamaguchi (
rhenium
) .(Слиты Junio C Hamano -
gitster
- в фиксации 741a694 , 18 Apr 2016)Механизм блокировки официально поддерживается git 2.10 (3 квартал 2016 г.)
См. Коммит 080739b , коммит 6d30862 , коммит 58142c0 , коммит 346ef53 , коммит 346ef53 , коммит 58142c0 , коммит 346ef53 , коммит 346ef53 (13 июня 2016 г.) и коммит 984ad9e , коммит 6835314 (03 июня 2016 г.) от Nguyễn Thái Ngọc Duy (
pclouds
) .Предложил: Эрик Саншайн (
sunshineco
) .(Слиты Junio C Hamano -
gitster
- в фиксации 2c608e0 , 28 Jul 2016)В Git 2.13 (второй квартал 2017 года) добавлена
lock
опция в коммите 507e6e9 (12 апреля 2017 года) от Nguyễn Thái Ngọc Duy (pclouds
) .Предложил: Дэвид Тейлор (
dt
) .Помогает: Джефф Кинг (
peff
) .(Объединено Junio C Hamano -
gitster
- в коммите e311597 , 26 апреля 2017 г.)То
git worktree add' --lock
же самое, что иgit worktree lock
послеgit worktree add
, но без условий гонки.Git 2.17+ (Q2 2018) добавляет
git worktree move
/git worktree remove
: см. Этот ответ .В Git 2.19 (Q3 2018) добавьте «
--quiet
», чтобы сделать «git worktree add
» менее многословным.См. Коммит 371979c (15 августа 2018 г.) Элии Пинто (
devzero2000
) .При поддержке: Мартин Агрен, Дуй Нгуен (
pclouds
) и Эрик Саншайн (sunshineco
) .(Слиты Junio C Hamano -
gitster
- в фиксации a988ce9 , 27 августа 2018)Обратите внимание, что «
git worktree add
» используется для «поиска доступного имени с помощью stat и затемmkdir
», что склонно к гонке.Это было исправлено с помощью Git 2.22 (Q2 2019) с использованием
mkdir
и реакциейEEXIST
в цикле.Смотрите коммит 7af01f2 (20 февраля 2019 г.) Михала Суханека (
hramrach
) .(Слиты Junio C Hamano -
gitster
- в фиксации 20fe798 , 09 Apr 2019)Git 2.22 (Q2 2019) исправляет логику, чтобы сказать, имеет ли репозиторий Git рабочее дерево, защищает "
git branch -D
" от удаления ветви, которая в настоящее время извлечена по ошибке.Реализация этой логики была нарушена для репозиториев с необычным именем, что, к сожалению, является нормой для подмодулей в наши дни.
См. Коммит f3534c9 (19 апреля 2019 г.) Джонатана Тана (
jhowtan
) .(Объединено Junio C Hamano -
gitster
- в коммите ec2642a , 8 мая 2019 г.)источник
git
Дистрибутив поставляется с более способствовали сценарию под названиемgit-new-workdir
. Вы бы использовали его следующим образом:где project-dir - это имя каталога, в котором находится ваш
.git
репозиторий. Этот сценарий создает другой.git
каталог со многими символическими ссылками на исходный, за исключением файлов, которые не могут быть общими (например, текущая ветвь), что позволяет вам работать в двух разных ветвях.Это звучит немного хрупко, но это вариант.
источник
git-new-workdir-recursive
который является оберткой дляgit-new-workdir
.Я наткнулся на этот вопрос в надежде найти решение, которого не нашел здесь. Так что теперь я сделал найти то , что мне было нужно, я решил разместить его здесь для других.
Предостережение: Это, вероятно, не очень хорошее решение, если вам нужно редактировать несколько веток одновременно, например, состояния OP. Это наличие нескольких ветвей Выданы одновременно , что вы не намерены редактировать. (Несколько рабочих каталогов, поддерживаемых одной папкой .git.)
С тех пор, как я впервые пришел к этому вопросу, я кое-чему научился:
Что такое « голое хранилище ». По сути, это содержимое
.git
каталога, не находящееся в рабочем дереве.Тот факт, что вы можете указать местоположение репо, которое вы используете (местоположение вашего
.git
каталога) в командной строке сgit
параметром--git-dir=
Тот факт, что вы можете указать местоположение вашей рабочей копии с
--work-tree=
Что такое «зеркальное репо».
Это последнее довольно важное различие. На самом деле я не хочу работать с репо, мне просто нужно, чтобы копии разных веток и / или тегов проверялись одновременно. На самом деле, я должен гарантировать, что ветви не будут отличаться от веток моего пульта. Так что зеркало идеально подходит для меня.
Так что для моего случая использования я получил то, что мне было нужно, выполнив:
Большое предостережение об этом заключается в том, что для этих двух копий не существует отдельной ГОЛОВКИ. Таким образом, после вышесказанного, запуск
git --git-dir=<localgitdir> --work-tree=firstcopy status
покажет все отличия от branch2 до branch1 как незафиксированные изменения - потому что HEAD указывает на branch2. (Вот почему я использую эту-f
опциюcheckout
, потому что я вообще не планирую вносить какие-либо изменения локально. Я могу извлечь любой тег или ветвь для любого рабочего дерева, если я использую эту-f
опцию.)Для моего случая использования нескольких проверок, сосуществующих на одном компьютере без необходимости их редактирования , это прекрасно работает. Я не знаю, есть ли какой-нибудь способ иметь несколько HEAD для нескольких рабочих деревьев без сценария, такого как описано в других ответах, но я надеюсь, что это в любом случае полезно для кого-то еще.
источник
$HOME
. Есть еще одно предостережение о вышеописанном методе, который я обнаружил позже, который касается файлов, которые не существуют в той или иной ветке. Если вы извлекаете A в dir1, затем извлекаете B в dir2, а затем принудительно извлекаете C в dir1. Если существует файл, который существует в A, но не в B или C, файл не будет удален из dir1 даже при принудительной проверке , Поэтому вам может потребоваться поэкспериментироватьgit clean
в таком случае - или сделать то, что я сделал, и просто использовать этот метод только для заполнения только что созданного каталога.Единственное решение, которое я могу придумать, - это клонировать две директории и добавить их как удаленные репозитории друг друга. Затем вы можете продолжать вытаскивать вещи из измененного в другой, фактически не выталкивая что-либо в удаленный репозиторий.
Я предполагаю, что вы хотите иметь два рабочих каталога, а не два клона удаленного, потому что вы не хотите выдвигать некоторые ветви на удаленный. В противном случае два клона вашего пульта будут работать нормально - вам просто нужно сделать несколько нажатий и нажатий, чтобы синхронизировать все три.
источник