mercurial同步到闪存驱动器和多台机器

时间:2012-01-15 21:19:08

标签: windows linux mercurial

首先让我描述一下我想做什么,以及为什么要这样做,然后让我告诉你我的尝试以及我遇到的问题。

我想要使用usb flashdrive保持同步的多台机器。有我的家用笔记本电脑,旅行笔记本电脑和办公桌面。并且都有双windows7-kubuntu11.10设置。我是唯一的用户,我没有连接到任何网络。我唯一担心的是在任何给定时间使用我所使用的机器中的最新文件。每次连接机器和每次断开连接时,我都非常擅长同步到usb闪存驱动器。我很少忘记。在我的设置中,我有多达7份我的东西,3份在linux上,3份在寡妇身上,1份在usb上(更不用说备份,其中很多都是)。

我是新手,所以在这个时候我没有系统可以在windows和linux之间来回转换。我一直在windows上使用syncback和在linux上使用dirsyncpro,但设置场景时考虑到我太厚了,无法理解如何使用rsync。我正在学习使用mercurial,因为我知道它可以跨平台工作。

我在我的linux机器上设置了mercurial(还没在windows上试过),我有1)在.hgrc中设置一个电子邮件并在所有机器上使用相同的文件,2)我已经完成了$ hg init然后在我要跟踪的所有文件夹中添加$ hg add和$ hg commit -m“first commit”,3)我已经完成了$ hg clone / home / docs / media / USBNAME / docs并验证了克隆确实复制到usb flashdrive上,4)我测试过添加文件并执行$ hg push / media / USBNAME / docs会将新文件复制到usb flashdrive的clone目录中,但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回滚来获取它们,$ hg rervert newfolder / newfile,但这既恐怖又乏味。现在我回到原点,如何将这些新文件和新目录推送到usb flashdrive上?

在一般和基本级别,这是我的两个问题:如何处理目录添加和删除?我通常会在Linux上使用像krusader,dolphin或gnome-commander这样的文件管理器来添加和删除文件。 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)

以上是我刚刚做的事情,看起来就像是我对第一次发生的事情的回忆。在推荐的pull和merge之后,删除了5个文件。这些是我想要推送到USB的文件,而不是删除。我究竟做错了什么?谢谢你的耐心等待。

编辑2.通过删除令人分心的问题重新集中我的问题。

解。我现在明白上面第二组命令中的问题是什么:目标存储库中缺少hg更新。这对新手来说并不明显,因为虽然$ hg pull会提醒更新,但$ hg push却没有。因此,要正确推送需要从源目录推送,然后从目标目录更新。

Pulling提供了一个有用的提示,以便随后更新:

$ 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到目的地):

$ 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命令(拉+更新已经存在)会很方便。

一旦知道问题是什么,就可以找到对它的引用,但据我所知,没有关于如何在https://www.mercurial-scm.org/wiki/Tutorial中使用$ hg push的明确示例。 (相比之下,$ hg pull已有详细记录)。如果我错过了,请道歉。

感谢Martin在下面的几条评论中提到$ hg更新的重要性。他的评论促使我进行实验并找出我所遵循的步骤序列中缺少的内容。

我想我无法推送到目的地,这提示我的初步问题,是由于没有在财产时更新destinaton存储库。以上是我的理解,如果不正确将被编辑。

2 个答案:

答案 0 :(得分:2)

您应该阅读Mercurial tutorialguide,以真正了解hg pushhg pull以及multiple heads mean的基础知识。

但是,是的,您当然可以推送到闪存驱动器以保持机器同步。专注于一个存储库(您称之为文件夹)并执行

$ hg push /media/USB/folder

将更改发送到闪存驱动器。如果“推送创建新的远程磁头”失败,则表示闪存驱动器某些更改比当前计算机更强。然后,您将要拉和合并(如错误消息提示)。拉动后,历史记录在您的存储库中显示如下:

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

其中xy是您刚刚提取的更改集。您的工作副本仍会反映变更集c。合并和提交时,您将闪存驱动器(xy)中的最新更改与计算机上的更改(c)集成到新的更改集d

在合并过程中,Mercurial首先找到cy的共同祖先:b。然后,它会查看在bc之间以及by之间修改的每个文件。如果文件仅在合并的一侧进行了修改,则该修改将“获胜”并成为合并的一部分。这包括删除,因此当您的合并中删除五个文件时,我只能断定它们已在上面的xy中删除,而未在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 summaryhg heads,也许您会发现自己有两个脑袋。你必须hg merge将它们放在一个头上才能继续使用一行历史记录。

答案 1 :(得分:1)

让我再试一次,逐一回答你的两个问题:

将新文件推送到克隆

  

也许有人会告诉我如何将新文件推送到克隆?

hg pushhg pull之间存在差异。这两个命令主要是但不完全是对称的。不同之处在于,如果在远程存储库中创建新头,则push将中止。 head 是没有子项的变更集。在此存储库中,c是唯一的头:

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

让我们想象你克隆这个并开始工作。您创建了xy

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]

这是正常的,并且在您拉动时始终发生。这是推拉之间的差异:pull会在本地存储库中愉快地创建多个头,如果它在远程存储库中创建多个头,则push将中止。

您现在应该将d合并到您的y并提交。这会创建:

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

现在可以将z推送到遥控器。请注意,当您按z时,您在遥控器中创建多个头。我相信这就是为什么你不能推动你的闪存驱动器。

合并时删除的文件

  

当我合并时,克隆将如何删除原始仓库中的文件

当您合并两个头时,Mercurial会查看在共同祖先点和两个头之间修改的每个文件。在上面的示例中,它将查看在cd之间更改的文件以及在cy之间更改的文件:

  • 如果在这两个路径上都修改了文件,那么Mercurial将尝试进行内部三向合并。如果失败,它会启动一个三向合并工具(例如KDiff3)并要求您解决冲突。

  • 如果仅在其中一个拍子上修改了文件,则此修改获胜

由于文件只是从您的工作副本中删除,因此我得出结论,这些文件已在d中删除,而未在xy中触及。使用hg status --change xhg status --change y检查更改了哪些文件。