Преобразование рабочего процесса Git в Mercurial - PullRequest
3 голосов
/ 05 февраля 2012

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

Как правило, для проекта на GitHub я бы разбилПроект на GibHub из исходного проекта, а затем получить оба локально, с двумя разными именами удаленных:

# Clone the initial repository and call the remote repository 'github-origin'
git clone -o github-origin git://github.com/orig_author/project.git

# Add the forked GitHub repo as an additional remote repo ('github-mine')
cd project
git remote add github-mine git://github.com/me/project.git
git fetch github-mine

Когда я перечисляю ветви с git branch -a, я получаю что-то вроде этого:

* master
  remotes/github-mine/some_feature
  remotes/github-mine/master
  remotes/github-origin/HEAD -> github-origin/master
  remotes/github-origin/some_feature
  remotes/github-origin/master

Я могу создать свои собственные локальные ветви, используя git checkout -b new_feature, а затем отправить их обратно в мой репозиторий GitHub, добавив две ссылки:

* my_feature
  remotes/github-mine/my_feature

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

Если первоначальный автор внес дополнительные изменения, я могу не отставать от git fetch github-orig и, возможно, объединить или перебазировать свои локальные изменения соответствующим образом.В качестве быстрого теста (при условии, что текущая ветвь равна my_feature):

git fetch github-origin
git checkout -b temp
git rebase github-origin/master

Важным моментом этого рабочего процесса является возможность узнать, где находится ветвь каждого репозитория по сравнению с моими собственными ветвями.В частности, важно знать, что мои ветви не совпадают с удаленными ветками с одинаковыми именами (даже между двумя репозиториями GitHub, например, две ветви master не обязательно должны быть одинаковыми).Увидеть все это довольно просто, используя gitk --all.

Я не уверен, как сделать то же самое в проекте Mercurial (например, в BitBucket).

Вот что япопытался сделать, основываясь на этой таблице эквивалентности команд :

hg clone https://bitbucket.org/orig_author/project

# Edit .hg/hgrc and add 'bb-mine=https://bitbucket.org/.../project' to [paths]

# Apparently equivalent to git fetch.
hg pull bb-mine

Это похоже на работу, и это тянет удаленные коммиты (на самом деле, я пробовал это в хранилище, гдеЯ уже нажал одну из моих веток).Я вижу все ветви, используя hg branches, но без указания того, откуда они пришли.hg view ничего не показывает.Что еще более важно, мой tip теперь является последним из моих коммитов, но у меня нет эквивалента github-origin/master, который у меня был бы (будь то до моих собственных коммитов или после, если другой автор внес больше изменений).

Я хотел бы иметь возможность сделать hg pull (эквивалент git fetch) в любой момент времени в будущем, чтобы увидеть, в чем разница между моей локальной копией и новыми изменениями, внесеннымидругие авторы не обязательно меняют что-либо в моем локальном репозитории или в моем репозитории BitBucket (по крайней мере, пока я не устраню потенциальные конфликты из-за этих изменений).

Кроме того, я также склоняюсьиметь свой собственный backup репозиторий, когда я использую Git (который является SSH-сервером, на котором я могу публиковать все ветви, даже незавершенную работу, которая еще не предназначена для публикации).

Я понимаю, что Mercurialспособ ветвления не совсем такой же, как способ Git.Тем не менее, есть ли эквивалентный рабочий процесс для Mercurial, или мне просто придется изменить свой подход?Как я могу узнать, где находятся все репозитории, которые я использую, со своими соответствующими ветками (некоторые из них могут иметь общее)?

1 Ответ

6 голосов
/ 05 февраля 2012

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

[...] Что еще более важно, мой tip теперь является последним из моих коммитов, но у меня нет эквивалента метки github-origin / master, которую ябудет (будь то до моих собственных коммитов или после, если другой автор внес дополнительные изменения).

Не придавайте большого значения метке tip.Это устаревшая концепция, которая означает все меньше и меньше, когда у вас несколько ветвей.Основная проблема заключается в том, что это просто самый последний набор изменений в вашем репозитории, и поэтому он будет переходить от (именованной) ветви к (именованной) ветви при извлечении.Вместо этого мы предпочитаем говорить о default и о других именованных ветвях / закладках, поскольку эти идентификаторы перемещаются более контролируемым образом.

Как узнать, где находятся все репозитории, которые я использую, сих соответствующие ветви (некоторые из которых они могут иметь общее)?

Расширение remotebranches может помочь вам получить более Git-подобный рабочий процесс здесь.

Но, в общем, вам следует изучить закладки , если вы хотите использовать Git-подобные ветки в Mercurial. именованные ветви , которые вы создаете с помощью hg branch, мало похожи на ветви, которые вы делаете с git branch (в Git отсутствует концепция именованных ветвей Mercurial).

Используйте hg incoming и hg outgoing чтобы увидеть различия между репозиториями.Вот как я обычно вижу то, что нужно вытащить или передать другому клону.

...