>вы держите working copy в репозитории общего пользования???
нет. я её там не держу. как я уже говорил, нету никакого "главного" репозитория, нет и "общего пользования". working copy появляется там, где сейчас тимлидер, который осуществляет слияние конфликтующих анонимных веток (если такие есть, а такие будут только в том случае, если есть два(или больше) разработчика, каждый из которых имеет собственное мнение об одном и том-же вопросе), а также собирает проект из полученной work. copy, и запускает релиз в продакшен. Естественно удобно, если тимлидер работает за компьютером, который 24/7 в Сети, и в который можно в любой момент запушить изменения.
sash-kan писал(а): ↑26.09.2011 00:56
неужели mercurial не умеет делать bare-репозитории?
угу, вижу как хабралюди прикручивают кучу непонятных костылей/хуков -
http://habrahabr.ru/blogs/Git/127213/
что-бы выполнить задачу, которой в hg попросту НЕ возникает :(
в чём фишка bare?
>пардон, не понял вашей мысли·
>watashiwa_daredeska, насколько понмю, говорил об одном из workflow — т.е., когда несколько разработчиков работают с одной веткой·
>естественно, прежде чем что-то отправлять в эту ветку, нужно сначала получить оттуда изменения и слить со своими· иначе будет «отлуп»·
неестественно.
можно отправить без всякого получения (в hg), и никакого отлупа скорее всего не будет. Т.е. в hg допустимо просто push, без всяческих pull+merge, и это есть основной workflow. Отлуп будет лишь в случае конфликта, когда в данную ветку другой разработчик успел запушить свои изменения. Вот тут придётся либо самому разрабу сливать ветки, либо отдать эту работу тимлидеру, который решит, какой вариант будет в итоге.
sash-kan писал(а): ↑26.09.2011 00:56
git pull — это команда, выполянющая два действия (если есть желание, их можно выполнять и по-отдельности): git fetch (получить новые объекты, не затрагивая working copy) и git merge (объединить полученные объекты со сделанными локально изменениями)·
ага. начинаю понимать логику: hg pull - это _одно_ действие: вытягивание новых ревизий из другого репозитория. В принципе, если на обоих компах имеется доступ в Сеть, то можно всегда начинать работу с hg pull, а уж потом редактировать файлы проекта. В этом случае мы получим локальное ветвление, в том случае, если другой разработчик тоже внёс некоторые изменения. Но тогда workflow будет:
1. hg pull
2. редактирование файлов
3. hg commit
4a. hg push если нет конфликтов
4b. hg merge+hg push, если получилась развилка
4c. hg push -f, если получается развилка, но кодер настаивает на своём варианте, и делегирует право решать тимлидеру. Тогда развилка появится в удалённом репозитории.
Какой из вариантов выбрать(4a || 4b/4c) - подскажет коммит на шаге №3.
Workflow pull+merge пригодится лишь в случае, если кодер не сделал шаг №1, и потерпел неудачу на шаге №4a (на шаге №3 он не сможет узнать об этом фэйле, т.к. он не вытянул свежих изменений. Впрочем, он может потерпеть неудачу даже если вытянет - если кто-то запушит ревизии на шаге №2)
sash-kan писал(а): ↑26.09.2011 00:56
противоположный workflow — каждый работает со своими ветками в общем репозитории·
в чужие ветки никто ничего не коммитит, значит, git pull перед git push можно смело не делать·
такой вариант естественно тоже поддерживается в hg.
sash-kan писал(а): ↑26.09.2011 01:38
о, да, спасибо, что напомнили про эту лебединую песню интуитивной понятности·
номера ревизий в _распределённой_ vcs!
тут и не знаешь, то ли плакать, то ли смеяться·
а что такого? В hg номер ревизии - просто ярлык у этой ревизии. Я смотрю лог, и если мне нужно слить (с tip)
Код: Выделить всё
| @ changeset: 4:3f33bed5178a
|/ user: drBatty from ksu <drbatty@drbatty.ru>
| date: Sun Sep 25 23:11:18 2011 +0400
| summary: added 2.c
|
я просто пишу
Это короче чем
hg merge 3f33bed5178a
вот и всё.
sash-kan писал(а): ↑26.09.2011 01:38
например, по имени·
просто и со вкусом·
и даже интуицию не надо привлекать — одной логики вполне достаточно·
конечно можно и по имени, например, если у меня есть две ветки:
1. current
2. release
То я могу (находясь в ветке release) выполнить hg merge current, что приведёт к тому, что все изменения из current перейдут в release, и у меня появится новая ревизия в ветке release (новый релиз).
Кроме того, на любую ревизию я могу повесить теги, и обращаться к ревизиям (в частности сливать) по этим тегам.
Вот посмотрите, какие теги вешают сами разрабы hg:
http://selenic.com/hg/tags
ИМХО очень удобно и логично.
sash-kan писал(а): ↑26.09.2011 01:38
я говорил про ветку, а не про отдельный коммит из этой ветки·
Именованная ветка в hg имеет совсем другое значение - это просто последовательность ревизий, которая имеет собственное имя. У ветки в hg нет хеша, потому он и не меняется :) На самом деле, "именованная ветка" в hg это тот-же tag, разница в том, что tag не наследуется, а branch наследуется, т.е. прямой потомок ветки release тоже принадлежит к ветке release. В hg у каждой ревизии(кроме начальной) может быть 1 или 2 родителя - если мы находимся в ветке release (это текущая ветка), и пишем hg merge current, то прямой(первый) родитель у получившейся ревизии будет ревизия из release, и сама ревизия будет принадлежать к ветке release.
sash-kan писал(а): ↑26.09.2011 01:38
чёрт, эта разница в терминологии с ума может свести·
если я правильно понял применяемую вами терминологию, то когда я говорю «ветка» вы представляете себе что-то совсем другое, нежели я·
тут вы видимо абсолютно правы.
sash-kan писал(а): ↑26.09.2011 01:38
именованная верхушка последовательности коммитов, каждый потомок в которой несёт в себе хзш-сумму предка (внутри последовательности могут быть «утолщения», произошедшие от слияний, в этом случае верхний в «утолщении» коммит имеет двух (и более) предков, а нижний — двух (и более) потомков)·
Как я понимаю, в hg именованная ветка - всего-лишь наследуемый ярлык на ревизии. Сама по себе "ветка" не имеет хеша, хотя конечно хеш ревизии зависит от имени ветки. Т.е., если у вас есть анонимная ветка, и вы хотите сделать её именной, то просто так навесить на неё ярлык нельзя.
Вот пример: мы имеем анонимную ветку
Код: Выделить всё
@ changeset: 5:081bedbfe2ac
| tag: tip
| parent: 3:af3c8d21b620
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Sun Sep 25 23:13:24 2011 +0400
| summary: y=
|
и хотим сделать её именной веткой current
Shell
$ hg branch current
рабочий каталог помечен как ветвь current
$ hg commit
Теперь ветка стала именной:
Код: Выделить всё
@ changeset: 6:8c62a1378de1
| branch: current
| tag: tip
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Mon Sep 26 07:26:57 2011 +0400
| summary: branch current
|
o changeset: 5:081bedbfe2ac
| parent: 3:af3c8d21b620
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Sun Sep 25 23:13:24 2011 +0400
| summary: y=
|
Если мы сделаем изменения, имя ветки наследуется:
Shell
$ echo >>1.c
$ hg commit
Код: Выделить всё
@ changeset: 7:34e799e001cb
| branch: current
| tag: tip
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Mon Sep 26 07:30:07 2011 +0400
| summary: изменения
|
o changeset: 6:8c62a1378de1
| branch: current
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Mon Sep 26 07:26:57 2011 +0400
| summary: branch current
|
o changeset: 5:081bedbfe2ac
| parent: 3:af3c8d21b620
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Sun Sep 25 23:13:24 2011 +0400
| summary: y=
|
sash-kan писал(а): ↑26.09.2011 01:38
«безымянных» последовательностей в нормальной ситуации просто не бывает — физически такое, конечно, может произойти, если, например, удалить ветку, но после gc весь этот мусор будет удалён·
ну "безымянных" веток в hg тоже не бывает.
Если в моём примере вернутся к ревизии 6:8c62a1378de1
Код: Выделить всё
$ hg up -r6
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
затем внести другие изменения и сделать коммит
Код: Выделить всё
$ echo "// ---" >>1.c
$ hg commit
создана новая голова
то мы увидим такую картину:
Код: Выделить всё
@ changeset: 8:5f274405f943
| branch: current
| tag: tip
| parent: 6:8c62a1378de1
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Mon Sep 26 07:33:00 2011 +0400
| summary: другие изменения
|
| o changeset: 7:34e799e001cb
|/ branch: current
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Mon Sep 26 07:30:07 2011 +0400
| summary: изменения
|
o changeset: 6:8c62a1378de1
| branch: current
| user: drBatty from ksu <drbatty@drbatty.ru>
| date: Mon Sep 26 07:26:57 2011 +0400
| summary: branch current
Видно, что ветка current теперь с двумя головами.
sash-kan писал(а): ↑26.09.2011 01:38
потому что так задумывался·
повторяю - как оно задумывалось, и как это всё реализовано физически - меня волнует слабо. В этом плюс hg - нет нужды знать, как это всё хранится/работает. Достаточно усвоить понятие "ревизия", и понятие "репозиторий". Причём последним может быть вообще один файл (банка(bundle)), или скажем компьютер доступный по ssh, или в простейшем случае другой каталог, или компьютер доступный по http (достаточно выполнить hg serve, и компьютер превращается в hg-сервер, правда ReadOnly, зато с web интерфейсом. Вот с
таким). Разницы между репозиториями никакой нет - все одинаковые, не смотря на свою физическую реализацию.