如何在多台机器上工作,在没有Internet的情况下保持同步?

时间:2011-12-09 10:02:10

标签: networking version-control cross-platform

现在已经有一段时间了,我一直在使用Dropbox在几个虚拟机(一个Windows,一个Mac,一个Linux)上同步一个Git存储库。我会在其中一台机器上提交我的更改,而Dropbox会将文件和repo的更改同步到其他机器上。

这非常无缝。我在OSX上编码,在Windows和Linux上测试代码,也许在那里进行一些更改,然后从三个中的一个提交。

然而,它有三个主要缺点:

  1. 需要互联网连接。我经常不得不依赖我的手机进行互联网连接,如果我在火车上,每月只有几百Mb,这是不可靠的。
  2. Dropbox同步包括目标文件,Visual Studio调试数据库以及一些不需要同步的不必要的东西。
  3. 它总是通过Dropbox服务器,这适用于一些小项目或一些开源软件,但我不想将我的工作文件推送到不受信任的服务器。
  4. 那么,你如何管理这样的环境?

    修改 实际上,所有三个虚拟机都存在于同一台笔记本电脑上,因此它们之间的网络连接不是问题。此外,我经常在一个操作系统上编码并在另一个操作系统上编译 - 然后来回查看所有错误。我不想通过数百次增量提交向公司回购邮件发送垃圾邮件。

    编辑2:
    为了让您了解我正在寻找的内容,这是我提出的部分解决方案:在每台机器上,我创建了一个我想要使用的文件的git存储库。通常,我将开始处理一台机器的bug /功能,然后提交我的工作。在下一台机器上,我将调用git reset origin从第一台机器加载更改,然后使用git commit --amend继续处理提交。这将来回几次。一旦完成,我将最终提交真实的更改(不再修改)并开始处理下一个功能/错误。

    但是,这种工作流程既麻烦又不优雅。我正在寻找的是导致相同输出的东西 - 一个在repo上提交 - 但是在三台机器之间流利地创建了。

2 个答案:

答案 0 :(得分:2)

您可以考虑设置自己的软件版本控制服务器。

这些服务器的大多数客户端都在不同的操作系统和平台上实现。 但是如果你想在不在局域网中的机器之间进行通信,那么你将需要一个互联网连接。

版本控制服务器网络通信可以通过网关暴露在互联网上。您可以通过设置隧道机制来实现安全性。然后,任何客户端都会隧道连接到网关服务器,然后与版本控制服务器通信。

至于控制哪些文件实际版本化:我有一些SVN的经验,您可以在文件级别选择要添加到版本控制的文件。然后,SVN客户端将简单地忽略其余的文件和目录。

修改:

阅读原作者问题的编辑: 也许设置第四台虚拟机,包含版本控制服务器。 SVN不是(通过任何想象力)难以管理。 (RTM)。让第三个虚拟机连接到服务器。 (这是当然的,如果可以在同一台机器上并行运行机器。)

答案 1 :(得分:0)

如果您可以在三者之间共享磁盘,请将主存储库放在该磁盘上。 (确保备份!特别是对于可移动媒体。)

编辑:更详细地说,您可以将主存储库放在USB记忆棒或硬盘驱动器上的共享分区上(因为您指示在同一硬件上使用多个虚拟机)。

要设置私人git回购,只需创建一个空目录并运行git init

假设您使用的是Ubuntu盒子并且有一个带有文件系统的USB记忆棒,您可以在/media/usbgit中安装的所有操作系统中进行读写,请运行:

vnix$ mkdir /media/usbgit/mycode
vnix$ cd /media/usbgit/mycode
vnix$ git init
Initialized empty Git repository in /media/usbgit/mycode/.git/

(鉴于你已经有一个git repo,你可能只想把它克隆到USB记忆棒上:

vnix$ cd /media/usbgit
vnix$ git clone /home/you/work/wherever/mycode
Initialized empty Git repository in /media/usbgit/mycode/.git/

现在将包含您从中提取的所有提交。)

现在您有一个空的存储库,您可以在所有框中克隆和提取。一旦安装了USB记忆棒,就可以从中进行克隆。

vnix$ cd
vnix$ mount | fgrep usbgit
/dev/whatever on /media/usbgit type NTFS (rw)
vnix$ git clone /media/usbgit/mycode
Initialized empty Git repository in /home/you/mycode/.git/
warning: You appear to have cloned an empty repository.

所有这些对SVN也是可行的(使用svnadmin create来初始化存储库,并svn checkout file:///media/usbgit/mycode来检查它),但是你将失去分布式VCS的好处,这似乎在你的情景。

特别是,对于分布式VCS,您可以拥有多个私有存储库(每个工作目录都是一个存储库),您可以与私有主公共存储库同步和提取例如在Github上 - 只要确保你知道你在哪里。