Как работать на нескольких машинах, синхронизировать их без интернета? - PullRequest
1 голос
/ 09 декабря 2011

Уже довольно давно я использую Dropbox для синхронизации Git-репозитория на нескольких виртуальных машинах (одна Windows, один Mac, один Linux).Я перенесу свои изменения на одну из машин, а Dropbox позаботится о синхронизации изменений файлов и репо на других машинах.

Это работает очень легко.Я пишу код на OSX, тестирую код на Windows и Linux, возможно, вносит в него некоторые изменения, а затем фиксирую один из трех.

Однако у него есть три основных недостатка:

  1. Требуется подключение к интернету.Мне часто приходится полагаться на свой мобильный телефон для подключения к Интернету, что ненадежно, если я нахожусь в поезде и работает только на несколько сотен Мбайт в месяц.
  2. Dropbox синхронизирует ВСЕ, включая объектные файлы, базы данных отладки Visual Studioи просто множество ненужных вещей, которые не нужно синхронизировать.
  3. Он всегда проходит через серверы Dropbox, что хорошо для небольшого проекта или какого-либо материала с открытым исходным кодом, но я не хочу выдвигатьмои рабочие файлы на ненадежный сервер.

Итак, как вы управляете такой средой?

Редактировать: На самом деле все три виртуальные машины работаютна том же ноутбуке, поэтому сетевые соединения между ними не проблема.Кроме того, я часто пишу код на одной ОС и компилирую на другой - и иду туда и обратно, пока не найду все ошибки.Я не хочу спамить репо компании сотнями добавочных коммитов.

Редактировать 2:
Чтобы дать вам представление о том, что я ищу, вот частичныйРешение, которое я придумал: на каждой машине я создал git-репозиторий для файлов, с которыми я хочу работать.Как правило, я начинаю работать над ошибкой / функцией на одной машине, а затем фиксирую свою работу.На следующей машине я позвоню git reset origin, чтобы загрузить изменения с первой машины, затем продолжу работу над коммитом, используя git commit --amend.Это будет идти вперед и назад несколько раз.Как только я это сделаю, я, наконец, передам изменения по-настоящему (больше не нужно вносить поправки) и начну работать над следующей функцией / ошибкой.

Однако этот рабочий процесс кажется громоздким и неэлегатным.То, что я ищу, - это то, что приводит к одному и тому же результату - одному коммиту на репо - но быстро создается между тремя машинами.

Ответы [ 2 ]

2 голосов
/ 09 декабря 2011

Можно подумать о настройке собственного сервера управления версиями программного обеспечения.

Большинство клиентов для этих серверов имеют реализации на разных ОС и платформах.Но если вы хотите общаться между компьютерами, которые не находятся в локальной сети, вам понадобится подключение к Интернету.

Сетевое взаимодействие серверов контроля версий может быть открыто через NAT через шлюз в Интернет.Вы можете реализовать безопасность, настроив туннельный механизм.Любой клиент затем туннелирует к серверу шлюза и затем связывается с сервером контроля версий.

Что касается контроля над тем, какие файлы на самом деле являются версионными: у меня есть некоторый опыт работы с SVN, с помощью которого вы можете выбрать на уровне файлов, какие файлы добавить к версионированию.тогда SVN-клиент просто игнорирует остальные файлы и каталоги.

Редактировать:

Чтение редактирования оригинального вопроса автора: Возможно, настройте 4-ю виртуальную машину, содержащую сервер контроля версий.SVN не сложно (как ни крути) управлять.(РТМ).Пусть три виртуальных машины подключатся к серверу 4-го числа.(Это конечно, если есть возможность параллельно запускать машины на одной машине.)

0 голосов
/ 09 декабря 2011

Если вы можете разделить диск между ними, поместите в него репозиторий.(Убедитесь, что вы делаете резервные копии! Особенно для съемных носителей.)

Редактировать : Более подробно, вы можете разместить свое мастер-репо на 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-репо, вы, вероятно, просто хотите вместо этого клонировать его на 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 - просто убедитесь, что вы знаете, где у вас есть.

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