Mercurial для синхронизации на flashdrive и нескольких машинах - PullRequest
0 голосов
/ 16 января 2012

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

У меня есть несколько машин, которые я хочу синхронизировать с помощью флэш-накопителя USB. Это мой домашний ноутбук, мой дорожный ноутбук и рабочий стол в офисе. И у всех есть двойная установка windows7-kubuntu11.10. Я единственный пользователь, я не подключен ни к одной сети. Мое единственное беспокойство - наличие последних файлов на машине, которую я использую в любой момент времени. Я очень хорошо синхронизируюсь с флэш-накопителем USB каждый раз, когда я подключаюсь к машине, и каждый раз, когда я отключаюсь. Я редко забываю С моей установкой у меня есть целых 7 копий моих вещей, 3 на Linux, 3 на вдовы и 1 на USB (не говоря уже о резервных копиях, многие из них).

Я новичок в этом, поэтому на данный момент у меня нет системы, чтобы переходить между окнами и Linux. Я использовал syncback на windows и dirsyncpro на linux, но чтобы установить сцену, учтите, что я слишком толст, чтобы понять, как использовать rsync. Я учусь использовать Mercurial именно потому, что я понимаю, что он может работать на разных платформах.

Я установил Mercurial на своих Linux-машинах (еще не пробовал в Windows), у меня есть 1), настроил электронную почту в .hgrc и использовал один и тот же файл на всех машинах, 2) Я сделал $ hg init затем $ hg add и $ hg commit -m "first commit" во всех папках, которые я хочу отслеживать, 3) я сделал $ hg clone / home / docs / media / USBNAME / docs и проверил, что клон действительно действовал скопировать на флэш-накопитель USB, 4) Я проверил, что добавление файлов и выполнение $ hg push / media / USBNAME / docs копирует новый файл в каталог клонов на флэш-накопитель USB, но 5) я создал новый каталог с некоторыми новые файлы, и это не будет выдвинуто. Это почти то, где я застрял.

$hg addremove
$hg commit -m "added stuff"
$ hg push /media/USBNAME/docs
pushing to /media/USBNAME/docs
searching for changes
abort: push creates new remote head bb0e20a00aa3!
(you should pull and merge or use push -f to force)

В то время я чувствовал, что форсирование толчка могло быть немного, ну, в общем, сильным. Таким образом, я сделал тягу вместо этого. Но это удалило новые папки. Я смог вернуть их, выполнив откат $ hg, rehvert $ hg newfolder / newfile, но это было и страшно, и утомительно. И теперь я вернулся к исходной точке, как я могу вставить эти новые файлы и новый каталог на флэш-накопитель USB?

На общем и базовом уровне, вот мои 2 вопроса: как я могу обрабатывать добавления и удаления каталогов? Обычно я буду использовать файловый менеджер, такой как krusader, dolphin или gnome-commander, в linux для добавления и удаления файлов. У Mercurial нет проблем с просмотром новых файлов в новых папках и их фиксацией. Но я не могу заставить его толкнуть их на «клона». Эта проблема только для новой папки, насколько я могу судить. Добавление новых файлов в существующие папки работает как положено.

РЕДАКТИРОВАТЬ # 1

Следуя предложениям Мартина, я хотел бы сообщить и попросить несколько последующих советов о том, что я делаю.

$ cd /home/docs
$ hg status
$ hg addremove
$ hg commit -m "yet another test"
$ hg push /media/USBNAME/docs
  pushing to /media/USBNAME/docs
  searching for changes
  abort: push creates new remote head 119134ce5d5d!
  (you should pull and merge or use push -f to force)
$ hg pull /media/USBNAME/docs
  pulling from /media/USBNAME/docs
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 2 changesets with 0 changes to 0 files (+1 heads)
  (run 'hg heads' to see heads, 'hg merge' to merge)
$ hg merge
0 files updated, 0 files merged, 5 files removed, 0 files unresolved
(branch merge, don't forget to commit)

Это то, что я только что сделал, и похоже на мое воспоминание о том, что произошло в первый раз. После рекомендуемого извлечения и объединения 5 файлов были удалены. Это те файлы, которые я хочу вставить на USB, а не удалить. Что я делаю неправильно? Спасибо за ваше терпение.

РЕДАКТИРОВАТЬ 2. перефокусировать мой вопрос, удалив отвлекающие побочные вопросы.

РЕШЕНИЕ. Теперь я понимаю, в чем проблема во втором наборе команд выше: отсутствует обновление hg в целевом хранилище. Это не очевидно для новичка, потому что, хотя $ hg pull выдает напоминание об обновлении, $ hg push - нет. Таким образом, для правильной отправки нужно нажать из исходного каталога и затем обновить из целевого каталога.

Вытягивание дает полезное напоминание для последующего обновления:

$ cd ~/dir-dest
$ hg pull ~/dir-source
  pulling from ~/dir-source
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
  (run 'hg update' to get a working copy)
$ hg update

Нажатие не дает напоминания об обновлении и включает в себя дополнительный шаг (необходимо перейти к месту назначения):

$ cd ~/dir-source
$ hg push ~/dir-dest
  pushing to ~/dir-dest
  searching for changes
  adding changesets
  adding manifests
  adding file changes
  added 1 changesets with 1 changes to 1 files
$ cd ~/dir-dest
$ hg update

Было бы удобно иметь команду push + udate (pull + update уже существует).

Как только кто-то знает, в чем проблема, можно найти ссылки на него, но, насколько я могу судить, нет явного примера того, как использовать $ hg push в https://www.mercurial -scm.org / wiki /Учебное пособие .(напротив, $ hg pull хорошо задокументировано).И если я пропустил это, извинения.

Спасибо Мартину, который упомянул важность обновления $ hg в одном из своих нескольких комментариев ниже.Его комментарий побудил меня поэкспериментировать и выяснить, чего не хватало в последовательности шагов, за которыми я следовал.

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

Ответы [ 2 ]

2 голосов
/ 16 января 2012

Вы должны прочитать Руководство по Mercurial или руководство , чтобы действительно изучить основы hg push и hg pull и что означает несколько голов .

Но да, вы, конечно, можете нажать и вытащить на флешку, чтобы синхронизировать ваши машины. Сфокусируйтесь на одном хранилище (то, что вы называете папкой) и выполните

$ hg push /media/USB/folder

чтобы отправить изменения на флешку. Если произойдет сбой с «push создает новую удаленную головку», то это означает, что на флэш-накопителе есть некоторые изменения , чем на вашей текущей машине. Затем вы захотите вытащить и объединить (как подсказывает сообщение об ошибке). После извлечения история выглядит так в вашем хранилище:

[a] --- [b] --- [c]
           \
            [x] --- [y]

, где x и y - это наборы изменений, которые вы только что вытащили. Ваша рабочая копия все еще отражает набор изменений c. При слиянии и фиксации последние изменения с флэш-накопителя (x и y) объединяются с изменениями на вашем компьютере (c) в новый набор изменений d.

В процессе слияния Mercurial сначала находит общего предка c и y: b. Затем он просматривает каждый файл, который был изменен между b и c и между b и y. Если файл был изменен только на одной стороне слияния, то это изменение «выигрывает» и становится частью слияния. Это включает в себя удаления, поэтому, когда пять файлов удаляются в вашем слиянии, тогда я могу только заключить, что они были удалены либо в x или y выше, но не затронуты в c. Вы можете использовать hg revert, чтобы вернуть их, прежде чем совершить слияние.

Когда слияние завершено, у вас есть:

[a] --- [b] --- [c] --- [d]
           \           /
            [x] --- [y]

Затем вы можете отодвинуться назад, поскольку у вас есть только одиночная головка , d. Команды:

$ hg pull /media/USB/folder
$ hg merge
$ hg commit -m "Merge with latest stuff on machine X"
$ hg push /media/USB/folder

Это все основные вещи Mercurial, которые описаны в руководствах. Вы пишете

Так что вместо этого я потянул. Но это удалило новые папки. Я смог вернуть их, выполнив $ hg rollback; $ hg rervert newfolder/newfile, но это было и страшно, и утомительно.

Пожалуйста, не запускайте hg rollback для развлечения - никогда не запускайте его в первые месяцы использования Mercurial :-) Это единственная базовая команда, которая может привести к потере данных.

Следует обратить внимание на то, что hg pull передает только историю . Это не касается каталога рабочей копии. Таким образом, он не может "удалить новые папки". Может быть, вы сделали hg update tip после hg pull?

В любом случае вам следует внимательно взглянуть на hg log и убедиться, что все наборы изменений, как новые, так и старые, есть. Смотрите также hg summary и hg heads и, возможно, вы обнаружите, что у вас две головы. Вы должны hg merge их объединить в одну голову, чтобы продолжить работу с одной линией истории.

1 голос
/ 17 января 2012

Позвольте мне повторить попытку и ответить на два ваших вопроса один за другим:

Загрузка новых файлов в клон

Возможно, кто-то скажет мне, что я не могуотправить новые файлы в клон?

Существует разница между hg push и hg pull.Две команды в основном, но не полностью, симметричны.Разница в том, что push будет прерван, если он создаст новые заголовки в удаленном хранилище.A head - это набор изменений без детей.В этом хранилище c является единственной главой:

remote: [a] --- [b] --- [c]

Давайте представим, что вы клонируете это и начинаете работать.Вы создаете x и y:

local:  [a] --- [b] --- [c] --- [x] --- [y]

Параллельно кто-то создает d после c в исходном (удаленном) хранилище:

remote: [a] --- [b] --- [c] --- [d]

В каждом хранилищетеперь у вас есть одна голова , а именно y в вашем хранилище и d в удаленном.

Если вы попытаетесь нажать, вам скажут:

$ hg push
pushing to /home/mg/tmp/remote
searching for changes
abort: push creates new remote head a2f1cea74307!
(you should pull and merge or use push -f to force)

«Новая дистанционная головка» - это ваша y ревизия.Если бы он был нажат, у вас было бы

remote: [a] --- [b] --- [c] --- [d]
                           \
                            [x] --- [y]

, и вы видите, что в удаленном хранилище есть две головы .Обычно это признак того, что кто-то забыл вытащить и слить.

Теперь вы должны вытащить и слить, как предложено:

$ hg pull
pulling from /home/mg/tmp/remote
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg heads' to see heads, 'hg merge' to merge)

Ваш локальный репозиторий получит две головы (как видно из+1 heads):

local:  [a] --- [b] --- [c] --- [x] --- [y]
                           \
                            [d]

Это нормально и происходит все время, когда вы тянете.В этом разница между push и pull : pull успешно создаст несколько головок в вашем локальном хранилище, push будет отменен, если он создаст несколько головок в удаленном хранилище.

Теперь вы должныобъединить d с вашим y и зафиксировать.Это создает:

local:  [a] --- [b] --- [c] --- [x] --- [y] --- [z]
                           \                   /
                            [d] --------------'

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

Файлы, удаленные при слиянии

Как получается, что клон будет удалять файлы в исходном репо при слиянии

Когда вы объединяете две головы, Mercurial просматривает каждый файл, который был изменен между точкой общего предка и двумя головами.В приведенном выше примере, он будет смотреть на файлы, измененные между c и d и файлы, измененные между c и y:

  • Если файл был изменен наоба эти пути, тогда Mercurial попытается выполнить внутреннее трехстороннее слияние.Если это не удается, он запускает инструмент трехстороннего слияния (например, KDiff3) и просит разрешить конфликты.

  • Если файл был изменен только на одном из патчей,затем эта модификация выигрывает .

Поскольку файлы просто удаляются из вашей рабочей копии, то я заключаю, что файлы были удалены в d и не затрагивались вx или y.Проверьте, какие файлы были изменены с hg status --change x и hg status --change y.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...