windows - 同步到闪存驱动器和多台计算机

标签 windows linux mercurial

让我先描述一下我想做什么,为什么我想做,然后让我告诉你我做了什么,我遇到了什么问题。
我有多台机器,我想用usb闪存盘保持同步。这是我的家用笔记本电脑,我的旅行笔记本电脑,还有我的办公桌。而且都有双windows7-kubuntu11.10设置。我是唯一的用户,我没有连接到任何网络。我唯一担心的是在我使用的机器上随时都有最新的文件。每次我连接到一台机器,每次断开连接,我都能很好地同步到usb闪存盘。我很少忘记。在我的设置中,我有多达7个拷贝,3个拷贝在linux上,3个拷贝在widows上,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确实将新文件复制到了usbflashdrive上的克隆目录中,但是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 rollback、$hg rervert newfolder/newfile来找回它们,但这既可怕又乏味。现在我又回到原点了,如何将这些新文件和新目录推送到usb闪存盘上?
在一般和基本级别上,我有两个问题:如何处理目录的添加和删除?我通常会在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)

上面是我刚刚做的事情,看起来就像我对第一次发生的事情的回忆。在推荐的拉合并之后,删除了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到目的地):
$ 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

有一个推+ UADE命令(拉+更新已经存在)是很方便的。
一旦知道了问题所在,就可以找到对它的引用,但就我所知,还没有关于如何在https://www.mercurial-scm.org/wiki/Tutorial中使用$hg push的明确示例。(相比之下,$hg pull有很好的文档记录)。如果我错过了,请道歉。
感谢Martin在下面的几条评论中提到了$hg更新的重要性。他的评论促使我进行实验,找出在我所遵循的步骤中遗漏了什么。
我认为我无法推送到目的地,这引发了我最初的问题,是因为在适当的时候没有更新目的地存储库。以上是我的理解,如果不正确将被编辑。

最佳答案

让我再试一次,逐一回答你的两个问题:
将新文件推送到克隆
也许有人会告诉我为什么我不能将新文件推送到克隆上?
hg pushhg pull之间有区别。这两个命令基本上是对称的,但不是完全对称的。不同之处在于,如果推送在远程存储库中创建新的头,则推送将中止。头是没有孩子的变更集。在此存储库中,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]

这是正常的,每次你拉的时候都会发生。这就是push和pull的区别:pull将在本地存储库中创建多个head,如果push在远程存储库中创建多个head,则push将中止。
现在您应该将d合并到您的y并提交。这将创建:
local:  [a] --- [b] --- [c] --- [x] --- [y] --- [z]
                           \                   /
                            [d] --------------'

现在您可以将z推到遥控器。注意,当您按下z时,您不会在遥控器中创建多个磁头。我相信这就是为什么你不能推你的闪存驱动器。
合并时删除的文件
当我合并时,克隆将如何删除原始repo中的文件
当合并两个头部时,Mercurial将查看在公共祖先点和两个头部之间修改的每个文件。在上面的示例中,它将查看在cd之间更改的文件以及在cy之间更改的文件:
如果在这两个路径上都修改了一个文件,那么Mercurial将尝试进行内部三路合并。如果失败,它将启动一个三向合并工具(如KDiff3),并要求您解决冲突。
如果一个文件只在其中一个pat上被修改过,那么这个modifiction就赢了。
由于这些文件只是从您的工作副本中删除的,因此我得出结论,这些文件是在d中删除的,而不是在xy中触及的。检查用hg status --change xhg status --change y更改了哪些文件。

关于windows - 同步到闪存驱动器和多台计算机,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8873452/

相关文章:

java - Windows 保留名称 "c​on"解决方法/hack

python - 在 Windows 上,我运行 python 程序时未使用 virtualenv

linux - 如何在linux中提取进程层次结构信息?

c++ - 我如何从 Ocaml 调用 C++ 代码,使用它自己的共享库 .so ?

Mercurial:注释/归咎于当前行号

version-control - 带有 Mercurial 源代码控制的 TFS

mercurial - 使用hg-git时不推送任何更改

mysql - 在第 1 行的 ' ■/' 附近导入 mysqldump 文件错误 1064 (42000)

windows - 如何运行多个SVN服务

Linux cp 命令保存文件结构