Git 2.5 пропонує з липня 2015 року заміну на contrib/workdir/git-new-workdir
: git worktree
Див фіксації 68a2e6a з допомогою Junio C Hamano ( gitster
) .
У примітці до випуску згадується :
Заміна на contrib/workdir/git-new-workdir
це не покладається на символічні посилання та робить обмін предметами та носіями безпеки більш безпечними, роблячи інформацію про позичальників та позичальників.
Див. Команду 799767cc9 (Git 2.5rc2)
Це означає, що тепер ви можете зробити цеgit worktree add <path> [<branch>]
Створіть <path>
і оформить замовлення <branch>
в ньому. Новий робочий каталог пов’язаний з поточним сховищем, він обмінюється всім, окрім файлів, що працюють в конкретних каталогах, таких як HEAD, індекс тощо. git worktree
Розділ додає:
Репозиторій git може підтримувати кілька робочих дерев , дозволяючи перевіряти кілька гілок одночасно.
З git worktree add
, нове робоче дерево асоціюється із сховищем.
Це нове робоче дерево називається "пов'язаним робочим деревом" на відміну від "основного робочого дерева", підготовленого " git init
" або " git clone
" .
У сховищі є одне основне робоче дерево (якщо воно не є голим сховищем) та нульове або більше пов'язаних робочих дерев.
реквізити:
Кожне пов'язане робоче дерево має приватний підкаталог у каталозі репозиторію
$GIT_DIR/worktrees
.
Ім'я приватного підкаталога зазвичай є базовим ім'ям пов'язаного шляху робочого дерева, можливо, додається до числа, щоб зробити його унікальним.
Наприклад, коли $GIT_DIR=/path/main/.git
команда git worktree add /path/other/test-next next
створює:
- пов'язане робоче дерево в
/path/other/test-next
і
- також створює
$GIT_DIR/worktrees/test-next
каталог (або $GIT_DIR/worktrees/test-next1
якщо test-next
він вже прийнятий).
В межах пов'язаного робочого дерева:
$GIT_DIR
встановлено вказувати на цей приватний каталог (наприклад, /path/main/.git/worktrees/test-next
у прикладі) та
$GIT_COMMON_DIR
встановлюється так, щоб повернутись до основного робочого дерева $GIT_DIR
(наприклад /path/main/.git
).
Ці настройки виконуються у .git
файлі, розташованому у верхній папці пов'язаного робочого дерева.
Коли ви закінчите з пов'язаним робочим деревом, ви можете просто його видалити.
Адміністративні файли робочого дерева в сховищі з часом автоматично видаляються (див. gc.pruneworktreesexpire
В git config
), або ви можете запустити git worktree prune
в головному або будь-якому пов'язаному робочому дереві, щоб очистити будь-які застарілі адміністративні файли.
Попередження: все-таки є розділ git worktree
"БУГИ", про який слід знати.
Підтримка субмодулів неповна .
НЕ рекомендується робити кілька замовлень суперпроекту.
Примітка: за допомогою git 2.7rc1 (листопад 2015 р.) Ви можете перелічити свої робочі колекції.
Див здійснювати bb9c03b , здійснювати 92718b7 , роблять 5193490 , здійснюють 1ceb7f9 , здійснюють 1ceb7f9 , роблять 5193490 , здійснюють 1ceb7f9 , здійснюють 1ceb7f9 (08 окт 2015), здійснювати 92718b7 , здійснювати 5193490 , здійснюють 1ceb7f9 , здійснюють 1ceb7f9 (08 окт 2015), здійснюють 5193490 , зробити 1ceb7f9 (08 жовтня 2015 р.), зробити 1ceb7f9 (08 жовтня 2015 р.) та здійснити ac6c561(02 жовтня 2015) Майкла Раппаццо ( rappazzo
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітеті a46dcfb , 26 жовтня 2015 р.)
worktree
: Додати list
команду " "
' 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
файл.
Див. Команду 618244e (22 січня 2016 р.) Та виконувати d4cddd6 (18 січня 2016 р.) Від Nguyễn Thái Ngọc Duy ( pclouds
) .
Допоможи: Ерік Саншайн ( sunshineco
) .
(Об’єднав Хуніо С Хамано - gitster
- в комісії d0a1cbc , 10 лютого 2016 р.)
Новий документ в git 2.8 (березень 2016 року) включатиме:
Якщо ви перемістите пов’язане робоче дерево, вам потрібно оновити gitdir
файл ' ' у каталозі запису.
Наприклад, якщо пов’язане робоче дерево переміщене до нього, /newpath/test-next
а його .git
файл вказує на /path/main/.git/worktrees/test-next
, тоді замість нього оновіться
/path/main/.git/worktrees/test-next/gitdir
на посилання /newpath/test-next
.
Будьте обережні, видаляючи гілку: перед git 2.9 (червень 2016 року) ви можете видалити одну із них, що використовується в іншому робочому дереві.
Коли git worktree
функція " " використовується, " git branch -d
" дозволено видалення гілки, що перевіряється на іншому робочому дереві.
Див. Комісію f292244 (29 березня 2016 р.) Від Kazuki Yamaguchi ( rhenium
) .
Допоможи: Ерік Саншайн ( sunshineco
) .
(Об'єднав Хуніо С Хамано - gitster
- у комітеті 4fca4e3 , 13 квітня 2016 р.)
branch -d
: відмовитись від видалення філії, яка наразі перевірена
Коли гілка перевірена поточним робочим деревом, видалення гілки заборонено.
Однак коли гілку перевіряють лише інші робочі дерева, видалення неправильно вдається.
Використовуйте, find_shared_symref()
щоб перевірити, чи використовується гілка, а не лише порівнювати з головою поточного робочого дерева.
Так само до git 2.9 (червень 2016 року) перейменування філії, перевіреної в іншому робочому дереві, не коригувало символічну HEAD у вказаному іншому робочому дереві.
Див. Команду 18eb3a9 (08 квітня 2016 р.) Та виконувати 70999e9 , здійснити 2233066 (27 березня 2016 р.) Від Kazuki Yamaguchi ( rhenium
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітеті 741a694 , 18 квітня 2016 р.)
branch -m
: оновлення всіх головних робочих дерев
Під час перейменування гілки в даний час оновлюється лише HEAD поточного робочого дерева, але він повинен оновлювати HEAD усіх робочих дерев, які вказують на стару гілку.
Це поточна поведінка, / HEAD / шлях / до / 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)
Див. Комісію 080739b , фіксування 6d30862 , фіксування 58142c0 , здійснення 346ef53 , здійснення 346ef53 , здійснення 58142c0 , здійснення 346ef53 , здійснення 346ef53 (13 червня 2016 р.) Та здійснення 984ad9e , вчинення 6835314 (03 червня 2016 р.) Nguyễn Thái Ngọc Duy ( pclouds
) .
Запропонував: Ерік Саншайн ( sunshineco
) .
(Об’єднав Хуніо С Хамано - gitster
- у комітці 2c608e0 , 28 липня 2016 р.)
git worktree lock [--reason <string>] <worktree>
git worktree unlock <worktree>
Якщо пов'язане робоче дерево зберігається на портативному пристрої або загальнодоступній мережі, яка не завжди монтується, ви можете запобігти обрізанню його адміністративних файлів, видавши git worktree lock
команду, необов'язково вказавши, --reason
щоб пояснити, чому робоче дерево заблоковано.
<worktree>
: Якщо останні компоненти шляху в шляху робочого дерева унікальні серед робочих дерев, його можна використовувати для ідентифікації робочих дерев.
Наприклад, якщо вам потрібно працювати лише з деревами на " /abc/def/ghi
" і " /abc/def/ggg
", тоді " ghi
" або " def/ghi
" достатньо, щоб вказати на колишнє робоче дерево.
Git 2.13 (Q2 2017) додасть lock
опцію в коміті 507e6e9 (12 квітня 2017) Nguyễn Thái Ngọc Duy ( pclouds
) .
Запропонував: Девід Тейлор ( dt
) .
Допоможи: Джефф Кінг ( peff
) .
(Об’єднав Хуніо С Хамано - gitster
- в комісії 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
: див. Цю відповідь .
Git 2.19 (Q3 2018) додає --quiet
параметр " ", щоб зробити " git worktree add
" менш багатослівним.
Див. Комісію 371979c (15 серпня 2018 р.) Від Елія Пінто ( devzero2000
) .
Допомогли: Мартін Агрен, Дуї Нгуєн ( pclouds
) та Ерік Саншайн ( sunshineco
) .
(Об’єднав Хуніо С Хамано - gitster
- в комісії a988ce9 , 27 серпня 2018 р.)
worktree
: --quiet
опція додати
Додайте параметр " --quiet
" git worktree
, як і для інших git
команд.
' add
' - це єдина команда, на яку вона впливає, оскільки всі інші команди, крім ' list
', в даний час замовчуються за замовчуванням.
Зауважте, що " git worktree add
" використовується для "знаходження доступного імені зі статусом, а потім mkdir
", схильним до перегонів.
Це було виправлено за допомогою Git 2.22 (Q2 2019), використовуючи mkdir
та реагуючи на EEXIST
цикл.
Див. Комісію 7af01f2 (20 лютого 2019 р.) Від Міхала Сучанека ( hramrach
) .
(Об'єднав Хуніо С Хамано - gitster
- в комітеті 20fe798 , 09 квітня 2019 р.)
worktree
: виправити worktree add
гонку
Git запускає цикл stat, щоб знайти доступне ім'я робочого дерева, а потім - mkdir
на знайдене ім'я.
Поверніть його на mkdir
цикл, щоб уникнути чергового виклику робочого дерева, додайте пошук того самого вільного імені та створення каталогу.
Git 2.22 (Q2 2019) виправляє логіку, щоб сказати, чи сховище Git має робоче дерево, що захищає " git branch -D
" від видалення гілки, яка зараз перевіряється помилково.
Реалізація цієї логіки була порушена для сховищ з незвичною назвою, що, на жаль, є нормою для підмодулів у наші дні.
Див. Комісію f3534c9 (19 квітня 2019 р.) Джонатана Тана ( jhowtan
) .
(Об’єднав Хуніо С Хамано - gitster
- в комітеті ec2642a , 08 травня 2019 р.)
Запит на отримання коду 178 Статистика
worktree
: оновлення is_bare
евристики
Коли " git branch -D <name>
" запускається, Git зазвичай спочатку перевіряє, чи ця гілка в даний момент перевірена.
Але ця перевірка не виконується, якщо каталог Git цього репозиторію не знаходиться в " <repo>/.git
", що має місце, якщо цей репозиторій є підмодулем, який зберігає super/.git/modules/<repo>
, наприклад, каталог "Git" як " ".
Це призводить до того, що гілка буде видалена, навіть якщо вона перевірена.
Це тому, що get_main_worktree()
в worktree.c
наборах is_bare
на робочому дереві лише з використанням евристики, що репо є голою, якщо шлях робочого дерева не закінчується " /.git
", а не оголений інакше.
Цей is_bare
код був введений у 92718b7 (" worktree
: додати деталі до структури робочого дерева", 2015-10-08, Git v2.7.0-rc0), слідуючи pre-core.bare
евристиці.
Цей патч робить дві речі:
- Навчити
get_main_worktree()
використовувати is_bare_repository()
замість цього, введений у 7d1864c ("Представити is_bare_repository () та змінну конфігурації core.bare", 2007-01-07, Git v1.5.0-rc1) та оновити в e90fdc3 ("Очищення обробки робочих дерев", 2007 -08-01, Git v1.5.3-rc4).
Це вирішує git branch -D <name>
описану вище проблему.
Однак ... Якщо в сховищі є, core.bare=1
але команда " git
" виконується з однієї зі своїх вторинних робочих груп, is_bare_repository()
повертає помилку (що добре, оскільки є робоче дерево).
І ставлення до головного робочого дерева як неоголеного, коли воно голо, викликає проблеми:
Наприклад, не видалення гілки з вторинного робочого дерева, на яке посилається HEAD головного робочого дерева, навіть якщо це основне робоче дерево є оголеним.
Щоб уникнути цього, також перевірте core.bare
при налаштуванні is_bare
.
Якщо core.bare=1
, довіряйте, і інше, використовуйте is_bare_repository()
.
git-new-workdir
буде замінено наgit checkout --to=<path>
Git 2.5. Дивіться мою відповідь нижче