首先让我描述一下我想做什么,以及为什么要这样做,然后让我告诉你我的尝试以及我遇到的问题。
我想要使用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存储库。以上是我的理解,如果不正确将被编辑。
答案 0 :(得分:2)
您应该阅读Mercurial tutorial或guide,以真正了解hg push
和hg pull
以及multiple heads mean的基础知识。
但是,是的,您当然可以推送到闪存驱动器以保持机器同步。专注于一个存储库(您称之为文件夹)并执行
$ hg push /media/USB/folder
将更改发送到闪存驱动器。如果“推送创建新的远程磁头”失败,则表示闪存驱动器某些更改比当前计算机更强。然后,您将要拉和合并(如错误消息提示)。拉动后,历史记录在您的存储库中显示如下:
[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 :(得分:1)
让我再试一次,逐一回答你的两个问题:
也许有人会告诉我如何将新文件推送到克隆?
hg push
和hg pull
之间存在差异。这两个命令主要是但不完全是对称的。不同之处在于,如果在远程存储库中创建新头,则push将中止。 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]
这是正常的,并且在您拉动时始终发生。这是推拉之间的差异: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
检查更改了哪些文件。