Контроль версий (hg): можно ли синхронизировать один каталог с разными репозиториями?

323
MostlyHarmless

У меня есть каталог для моих рабочих файлов, который находится под контролем версий (Mercurial):

~ / MyFiles

В подпути у меня есть каталог с пакетами Emacs для моей настройки режима org:

~ / MyFiles / орг-режим

Как я уже сказал, весь путь находится под контролем версий и поэтому «синхронизируется» с хранилищем Hg. Первоначальным источником для org-modeподкаталога является также (git) хранилище в Интернете ( http://orgmode.org/cgit.cgi/org-mode.git/ ).

Поэтому было бы неплохо иметь возможность извлекать новые версии этого каталога непосредственно из официального репозитория org-mode, а затем фиксировать их в моем личном репозитории, чтобы всегда иметь версию, которая работает с моей конфигурацией Emacs.

Для программиста это может быть очень простой вопрос - поскольку я не программист, я не уверен, как с этим справиться, но я предполагаю, что это должно быть распространенной проблемой.

Конечно, я могу сохранить каталог org-mode локально по другому пути и оставить его вне контроля версий, но тогда я не смогу легко восстановить полную рабочую настройку в определенный момент времени.

2
Зачем вам файлы org-mode под hg? Вы работаете над ними или это глобальные файлы, которые можно обновлять независимо от вашей работы? Doktoro Reichard 10 лет назад 0
моя работа зависит от этих файлов, потому что я часто использую функции, которые работают только с самой последней версией режима org, и в случае проблем я хочу иметь возможность легко вернуться к последней работающей версии. MostlyHarmless 10 лет назад 0
Насколько я понимаю, проблем с совместимостью при использовании hg и git нет, как вы объяснили. Тем не менее, я бы рекомендовал, чтобы каждый раз, когда вы извлекали изменения из репозитория в режиме org, вы также фиксировали hg (т. Е. Делали запрос на извлечение одним изменением). Если предположить, что git хранит все, что ему нужно, в папке org-mode, то откат от hg или git будет иметь те же эффекты. Doktoro Reichard 10 лет назад 2
большое спасибо! Если вы превратите свой комментарий в ответ, я могу принять его. Но правильно ли я понимаю: он может работать только так, как я использую 2 разных VCS, поэтому я не мог сделать это только с помощью `git` или` hg`, чтобы несколько «перекрывающихся» рабочих каталогов синхронизировались с разными репозиториями? MostlyHarmless 10 лет назад 0
Я превращу свои комментарии в ответ, но, пожалуйста, воздержитесь от его принятия, так как кто-то может тем временем появиться и выработать лучший ответ. Я не пользуюсь VCS широко, поэтому мои знания могут быть ошибочными в некоторых частях. Что касается вашего вопроса в последнем комментарии, то нет причин не делать этого; если он работает с git, он должен работать с hg. Doktoro Reichard 10 лет назад 1

3 ответа на вопрос

1
Doktoro Reichard

Использование hg и git в одном и том же дереве не несет в себе никакого конфликта; Поскольку эти программы были разработаны независимо, само собой разумеется, что они не мешают друг другу.

Однако и в этом случае hg накладывается на git (другой способ убедиться, что репозиторий git зависит от базовой структуры каталога hg ). Таким образом, рассмотрим следующий пример, где у вас уже есть клонированный режим org, и есть патч, ожидающий извлечения из онлайн-хранилища.

Вот как может выглядеть hg перед тем, как вы извлечете изменения из git :

c:\myfiles> hg log -l 1 changeset: 123:da5f372c3901 tag: tip user: John Doe <john@doe.com> date: Fri Jun 13 12:00:00 2014 -0500 summary: Some change in the work files 

Затем вы извлекаете изменения в режиме org из git . Однако здесь важнее всего то, что действие pull не сразу отражается на репозитории hg .

Вы можете проверить, работают ли более новые исправления в режиме org . Если они не работают сразу после запуска, вы должны запустить hg revert --all, что восстановит то, как хранилище выглядело во время последней фиксации. Если они работают или вы не обнаружите никаких проблем, вам следует зафиксировать изменение в hg, отражающее, что вы перенесли набор изменений в org-mode .

c:\myfiles> hg com -m "Pulling changes in org-mode"  c:\myfiles> hg log -l 1 changeset: 124:da5f372c3901 tag: tip user: John Doe <john@doe.com> date: Fri Jun 13 12:01:00 2014 -0500 summary: Pulling changes in org-mode 

Если git хранит свои метаданные относительно хранилища в папке org-mode (то есть, как hg делает с папкой .hg в корне хранилища), не должно быть проблем с откатом коммита в hg (если случайно после коммита обнаружите, что есть проблема с org-mode ):

c:\myfiles> hg rollback rolling back last transaction  c:\myfiles> hg log -l 1 changeset: 123:da5f372c3901 tag: tip user: John Doe <john@doe.com> date: Fri Jun 13 12:01:00 2014 -0500 summary: Some change in the work files 

Кроме того, как указано в моих комментариях, вы можете делать это независимо от того, какое программное обеспечение VCS вы используете. Если у вас есть:

c:\my_repo c:\my_repo\2nd_repo 

Проблем не будет, так как для работы с каждым репозиторием вам придется работать, находясь внутри каталога, в котором вы работаете.

1 - я адаптировал некоторый код отсюда, потому что, как указано, у меня нет большого опыта в этой теме

1
SlightlyCuban

Звучит так, как будто вы хотите, чтобы орг-режим был подпунктом . И кажется, что git поддерживается в качестве subrepo. В документации ясно, что делать дальше:

echo "http://orgmode.org/cgit.cgi/org-mode.git" >> .hgsub hg add .hgsub git clone http://orgmode.org/cgit.cgi/org-mode.git org-mode 

Это позволит отслеживать ваши вещи локально и извлекать изменения из orgmode, когда они доступны.

0
bbaassssiiee

Ваш код зависит от «ветки поставщика». У каждого есть свой репозиторий. Нет проблем. Большинство систем контроля версий позволяют «экспортировать» последний код, то есть без метаданных. Если вы добавите это в свой собственный репозиторий, то столкновения не будет. Маловероятно, что вам нужно фиксировать оба хранилища. Но если вам нужно, вы можете решить это. Поисковый запрос: «филиал продавца»