Для чого я буду використовувати git-worktree?


211

Я читав пост Гітхуба на git-worktree . Вони пишуть:

Припустимо, ви працюєте в сховищі Git у відділенні під назвою feature, коли користувач повідомляє про помилку з високою терміновістю master. Спочатку ви створюєте пов’язане робоче дерево з новою гілкою, hotfixперевіряєте відносно головного […] Ви можете виправити помилку, натиснути виправлення та створити запит на витяг.

Коли я працюю над гілкою, яка називається функцією, і повідомляється про деяку невідкладну помилку в майстрі, я зазвичай відкладаю все, над чим працюю, і створюю нову гілку. Коли я закінчу, можу продовжувати працювати. Це дуже проста модель, я так працював роками.

З іншого боку, використання git-worktree має свої обмеження:

Наприклад, забороняється перевіряти одну і ту ж гілку в двох пов'язаних робочих деревах одночасно, оскільки це дозволило б змін, здійсненим в одному робочому дереві, вивести інше з синхронізації.

Чому я вибрав би складніший робочий процес для вирішеної проблеми?

Чи щось із git-worktreeцього не можна було зробити заздалегідь, що виправдовує всю цю нову складну особливість?


12
Одне, що ви не можете приховати, - це нерозподілені контури, після злиття або відновлення конфліктів.
chirlu

11
Якщо ви працюєте зі складеними мовами, підшивання означає, що вам доведеться перекомпілювати все, коли ви видаляєте їх.
mb14

У нас є кілька різних продуктів на основі одного і того ж вихідного коду (300 Мб), і я планую об'єднати їх в одне велике репо-репортаж і використовувати робоче дерево, щоб кожен продукт перевірявся в іншій папці, а не мав купу величезних клони, які не залишаються синхронізованими
endolith

Відповіді:


196

Для мене git worktree - найбільше вдосконалення з давніх часів. Я працюю в розробці програмного забезпечення для підприємств. Там дуже часто трапляються такі версії, як те, що випустили 3 роки тому. Звичайно, у вас є відділення для кожної версії, щоб ви могли легко перейти до неї та виправити помилку. Однак перемикання коштує дорого, тому що ви тим часом повністю реструктурували сховище і, можливо, побудували систему. Якщо ви перемкнетесь, ваш IDE буде з розуму намагатися адаптувати налаштування проекту.

За допомогою робочого дерева ви можете уникнути цієї постійної конфігурації. Перевірте ці старі гілки в окремих папках за допомогою робочого дерева. Для кожної філії ви отримали незалежний проект IDE.

Звичайно, це можна було зробити в минулому, клонувавши репо кілька разів, і це був мій підхід до цих пір. Однак це також означало, що витрачається багато місця на місце, і ще гірше потрібно отримувати одні і ті ж зміни від репо.


4
Вам не довелося кілька разів отримувати одні і ті ж зміни від репо. Ви могли просто скопіювати каталог .git першого клону.
misiu_mp

1
@ jdk1.0 вибачте за плутанину, коментар був спрямований на misiu_mp
mxttie

2
Як хтось, хто використовував 2-3 високо тиражувані репо, щоб я міг створити одну гілку функцій, розвиваючи іншу, я мав кожне місцеве репо як віддалений від інших, і я повністю погоджуюся з характеристиками Sebi з боку недоліків (багато вилучення та натискання!) ) Крім того, як тільки я перейду на робоче дерево, я зрозумію, що мені більше не доведеться турбуватися про місцеві одноіменні гілки, що розходяться (що трапляється приблизно раз на 6-10 місяців, коли я перериваюсь кілька разів протягом періоду днів і закінчую працюючи з тією ж гілкою функцій із кількох репостів, але забудьте синхронізувати їх резервною копією ...)
sage

3
@iheanyi - (1). Це швидше, якщо IDE підтримує зовнішні файли даних (наприклад, індексація баз даних), пов'язані з певним каталогом. Якщо ви обмітаєте вміст у тому самому каталозі, це, як правило, скасовує будь-які кеші даних IDE, і його доведеться повторно індексувати.
Стів Холлаш

5
@iheanyi - (2) З часом історія всього стане набагато більшою, ніж файли робочого дерева в будь-який момент. Історія всього == .gitкаталог. З багатьма локальними клонами з висхідного потоку у вас є багато локальних копій однієї бази даних, оскільки кожен клон має власну .gitбазу даних. З багатьма локальними робочими деревами кожне дерево використовує ту саму .gitбазу даних. Так, якщо у вас є локальні клони місцевого робочого дерева, Git буде важко пов’язати багато вмісту .git, але не в Windows.
Стів Холлаш

70

Я можу побачити для цього використання.

Якщо у вас є тестовий набір, який працює тривалий час, уявіть години, і ви запускаєте його, він ефективно блокує цю робочу копію до завершення тестів. Перемикання гілок під час цих тестів дозволило би розбити їх способами, які важко зрозуміти.

Тому git-worktreeя міг би створити другу ідею для іншої галузі, яка там працює.

Крім того, коли я переходжу на якусь іншу гілку, щоб зробити коротке розслідування, мій IDE вважає, що багато файлів раптово змінилися і проіндексують всі ці зміни, просто щоб знову повторно індексувати їх, коли я перемикаюсь назад.

Третім випадком використання буде порівняння файлів за допомогою інших інструментів, ніж git-diff, як звичайно diff, між двома каталогами, а не двома гілками.


6
Не вдалося б git cloneпрацювати так само добре?
1515

12
Але клонування великого сховища з віддаленого пристрою може зайняти тривалий час. Я працюю проти одного сховища, на яке клонують кілька хвилин. Я здогадуюсь, що ти міг би це зробити git clone --reference. Також управління всіма іншими галузями буде здійснюватися лише один раз, а не один раз за робочою директорією.
Андреас Ведербранд

6
Не клонуйте віддалено, а клоніруйте з локального. Я не розумію питання управління галузями, ви можете уточнити?
jthill

14
Я намагався використовувати клони, і справді виникає проблема управління. Замість одного набору гілок у мене є набір клонів, яких я не бачу всіх разом в одному інтерфейсі. Якщо мені потрібно вибрати якісь зміни, мені доведеться знайти або просунути їх. Це додає додаткових кроків до всіх дій. Все виконується, але тертя завжди є.
max630

2
А коли справа доходить до створення резервної копії, одиничне сховище набагато простіше.
max630

64

Одне очевидне використання - одночасне порівняння поведінки (не джерела) різних версій - наприклад, різних версій веб-сайту або просто веб-сторінки.

Я спробував це локально.

  • створити каталог page1.

  • всередині створити каталог srcі git initце.

  • в srcстворенні page1.htmlз невеликим вмістом і його фіксації.

  • $ git branch ver0

  • $ git worktree add ../V0 ver0

  • в srcмайстер додайте більше тексту page1.htmlі введіть його.

  • $ git branch sty1

  • відредагуйте page1.htmlу sty1гілці (додайте якийсь характерний стиль CSS) та додайте її.

  • $ git worktree add ../S1 sty1

Тепер ви можете використовувати веб-браузер, щоб одночасно відкривати та переглядати ці 3 версії:

  • ..\page1\src\page1.html // що б git не було поточним

  • ..\page1\V0\page1.html // початкова версія

  • ..\page1\S1\page1.html // експериментально стильова версія


2
Я не бачу, як це пояснює перевагу використання робочих дерев для цієї мети над клоном.
iheanyi

@iheanyi Можна сказати те саме про branch; і відповідь однакова: вона легша за вагу і побудована для роботи.
OJFord

1
@OJFord в чомусь справа. Ця відповідь не пояснює мені, що таке робоче дерево - це інакше. Це, очевидно, не псевдонім для гілки чи клону, але ефект, який я бачу тут, здається, той самий. Я не бачу, як це легше ваги, ніж просто використання гілки чи клону.
iheanyi

@iheanyi Це інакше, ніж використання гілки - ви не можете використовувати гілки самостійно, щоб отримати відразу кілька станів робочого дерева - і легшу вагу, ніж другий (.., n-й) клон. Я мав на увазі те, що ви можете сказати також про галузь «чому не просто клонувати і не вносити свої зміни», але декілька гілок в одному репо є легшою вагою і простішим способом керування такою поведінкою.
OJFord

@OJFord Я не думаю, що це вирішує мою плутанину з worktree. Дозвольте сказати так, чи використовуєте ви гілку, чи клонуєте чи щось інше, кінцевою метою описаного тут процесу є порівняння трьох різних версій чогось одночасно. Виходячи з того, що у відповіді, я не розумію, чому я використовую робоче дерево над якоюсь альтернативою. Відповідь не пояснює, що таке робоче дерево робить, що альтернативи немає. Ви заявляєте про те, що щось легке (або легше), але я не бачу, як робоче дерево робить гілки менш "вагомими".
iheanyi

29
  1. Є законні причини, через які ви можете бажати / потребувати декількох робочих місць у файловій системі одночасно.

    • маніпулювання перевіреними файлами при необхідності внесення змін десь в іншому місці (наприклад, компілювання / тестування)

    • розмежування файлів за допомогою звичайних інструментів різниці

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

    • Якщо вам потрібно багато перемикатися туди-назад, витрачається витрата часу на перевірку та повторну перевірку, що не потрібно робити з кількома робочими місцями.

    • ментальна вартість переключення психічного контексту між гілками через git stashing насправді не вимірюється. Деякі люди вважають, що зберігати таку відсутність варто просто, відкривши файли з іншого каталогу.

  2. Деякі люди запитують "чому б не зробити кілька локальних клонів". Це правда, що з "- локальним" прапором вам не доведеться турбуватися про додаткове використання місця на диску. Це (або подібні ідеї), що я зробив до цього моменту. Функціональними перевагами пов'язаних робочих груп над локальними клонами є:

    1. З місцевими клонами ваші додаткові робочі місця (які є в локальних клонах) просто не мають доступу до походження або гілок вище за течією. "Походження" в клоні не буде таким самим, як "походження" у першому клоні.

      • Біг git log @{u}..або git diff origin/feature/other-featureможе бути дуже корисним, і це або неможливо більше, або складніше. Ці ідеї технічно можливі з локальними клонами за допомогою ряду методів вирішення проблем, але кожен спосіб, який ви могли б зробити, робиться краще та / або простіше через пов'язані робочі місця.
    2. Ви можете ділитися посиланнями між робочими групами. Якщо ви хочете порівняти або запозичити зміни в іншій місцевій філії, тепер ви можете.


11
Крім того, ви можете перерахувати всі робочі місця за допомогою однієї команди, з клонами потрібно самостійно відстежувати їх.
Ян Рінроуз

хм. З git 2.7.0, мабуть, так і є. Добре знати.
Олександр Птах

9

tl; dr: Будь-який час, коли ви хочете, щоб дві робочі дерева перевірили одночасно з будь-якої причини, git-worktreeце швидкий і просторовий спосіб зробити це.

Якщо ви створите інше робоче дерево, більшість частин репо (тобто .git) будуть спільними, тобто якщо ви створите філію або отримаєте дані, поки ви знаходитесь в одному робочому дереві, воно також буде доступне з будь-яких інших робочих дерев, які у вас є. Скажімо, ви хочете запустити свій тестовий набір у відділенні foo без необхідності натискати його кудись, щоб його клонувати, і ви хочете уникнути клопоту з клонування місцевого репо, використовуючи git-worktreeце приємний спосіб створити лише нове оформлення касети якоїсь держави в окреме місце, тимчасово чи постійно. Як і з клоном, все, що вам потрібно зробити, коли ви закінчите з ним, - це видалити його, а посилання на нього буде сміттям, зібраним через деякий час.


2
Документи кажуть, що ви не можете мати однакову гілку в обох робочих копіях, що є серйозним обмеженням. З Mercurial він працював лише з невеликими питаннями.
hypersw

Звичайно, ти можеш. Сторінка людини говорить як; шукати --force. Але це незручно, якщо ви оновлюєте відділення в одному місці і очікуєте працювати над ним в іншому, оскільки робоче дерево не оновлюється.
jsageryd

Так, філії в Mercurial є більш прозорим поняттям у цьому аспекті. Як з’являються гілки з одного робочого дерева в іншому? Так само, як і декілька посилань? Мої перші експерименти з worktrees, із запущеним результатом в обох, закінчилися двома (!) Різними (!) Покажчиками, названими origin/master.
hypersw

Worktree - це (як випливає з назви) лише робоче дерево з деякими додатковими функціями; сховище поділяється між усіма робочими групами. Єдина відмінність між двома робочими сферами полягає в тому, що зареєстрована гілка може бути (і для здорових робочих процесів, є) різною. Можна здійснити окреме робоче дерево, тому для його роботи також є власний індекс (він же зона постановки). .gitФайл в окремому worktree є текстовий файл , що містить шлях до його конфігурації, яка знаходиться в початковому сховище.
jsageryd

2
@WilsonF: git checkout --ignore-other-worktrees <branch> git-scm.com/docs/git-checkout/…
jsageryd

7

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

Я працюю над досить великою базою кодів, для складання якої потрібно досить багато часу. На моїй машині у мене зазвичай є гілка розробки разом із гілкою функцій, над якими я працюю, плюс головна гілка, яка представляє поточний стан живої системи.

Однією з найбільших переваг для мене, очевидно, є те, що мені не потрібно перекомпілювати всю річ щоразу, коли я перемикаю гілки (тобто робочі місця). Приємним побічним ефектом є те, що я можу перейти до робочого дерева розробки, зробити там речі, змінити каталог на робоче дерево для моєї поточної гілки функцій, а потім відновити його без необхідності спочатку тягнути.


4

У мене досить незвичний: я займаюся розробкою Windows та Linux на одній машині . У мене у вікні Windows VirtualBox під управлінням Linux. VirtualBox монтує деякі каталоги Windows і використовує їх безпосередньо всередині машини Linux. Це дозволяє мені використовувати Windows для управління файлами, але будувати в Linux. Це проект крос-платформи, тому він будується як для Windows, так і для Linux з однієї структури каталогів.

Проблема полягає в тому, що системи побудови Linux та Windows врізаються одна в одну при використанні в одному каталозі; є кілька складних етапів збирання для завантаження бібліотек тощо, які використовують однакові назви каталогів. Версія Windows системи збирання завантажує специфічні для Windows бібліотеки, а версія Linux для системи завантаження завантажує специфічні для Linux бібліотеки.

В ідеальному світі система збирання буде модифікована таким чином, щоб Windows і Linux могли співіснувати в каталозі, але наразі проблема вирішується робочими колесами. Папка "Linux" може створювати специфічні для Linux артефакти збірки, а папка "Windows" може генерувати специфічні для Windows артефакти збірки. Хоча це навряд чи ідеальне рішення, воно робить приємний зупинку під час очікування усунення помилок системи збирання.

Правда, робоче дерево не було призначене для цього; Мені потрібно тримати версію Windows та версію Linux на окремих гілках, хоча я дійсно вважаю за краще, щоб вони були на одній гілці. Тим не менше, це робить свою роботу і є дещо нетрадиційним випадком роботи, що рятує день.


+1 Це здається дуже ефективним вирішенням для того, щоб зробити не виконувати побудову вихідних каталогів за конфігурацією. У мене є аналогічна установка робочої станції VMware з гостями Ubuntu та macOS.
Tanz87

1

У новому для мене проект я створив функцію. Але деякі технічні характеристики провалилися. Для порівняння результатів masterя створив work-treeрепо. Я порівнював результати крок за кроком у коді запуску, поки не зрозумів, що пішло не так.


Як робоче дерево робить це легше, ніж клон? Питання полягає не в особистих уподобаннях, а в конкретних відмінностях.
Неочікувана

1

Я використовую git worktreeдля розвитку машинного навчання.

У мене є основний функціональний код, і тоді я хочу розділити гілки різних експериментів (різні алгоритми та різні гіперпараметри). git worktreeдозволяє мені інтегрувати dvc поряд із різними версіями мого коду, що спеціалізуються на різних алгоритмах. Після виконання всіх навчальних завдань я оцінюю підсумкові показники та зливаюся, щоб опанувати найкращу галузь / модель.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.