Как использовать git для этой конкретной цели?

Вот ситуация. Есть две машины, ноутбук A и рабочая станция B. B имеет фиксированный IP-адрес, A имеет динамический IP-адрес, и я хочу избежать необходимости подключения от B до A (например, для настройки туннеля ssh; аргумент, предположим, что ssh от B до A невозможно).

На обеих машинах есть репозиторий git, /home/user/foo.git . Проблема: работа над A, объединить изменения в A:/home/user/foo.git и B:/home/user/foo.git . В конце концов, оба хранилища должны быть одинаковыми.

Самое простое решение, которое я смог придумать, заключается в следующем:

 A:~$ cd foo.git A:~/foo.git$ git commit -a A:~/foo.git$ ssh B B:~$ cd foo.git B:~/foo.git$ git commit -a B:~/foo.git$ logout A:~/foo.git$ git pull ssh://B/home/user/foo.git A:~/foo.git$ git push ssh://B/home/user/foo.git master 

(прежде чем я смог это сделать, мне пришлось изменить конфигурацию git на B и добавить крюк после приема, как описано в ответе на этот вопрос о стеке )

Мои вопросы:

1) является правильным? 2) существует ли более простой способ достижения той же цели?

У вашего пост-приемного крючка есть довольно серьезные оговорки IMO!

У меня аналогичная настройка, но сервер B имеет две копии репо. Один из них является открытым репо и используется как удаленный по умолчанию («источник») для обоих. Тогда мне не нужно приводить аргументы «git push» и «git pull». Это последнее единственное упрощение, которое у меня есть над командами, которые вы упоминаете. (И в моем случае B – сервер, у меня есть блок ARM, который я могу просто оставить).

Если вы «действительно не используете Git», это не обязательно лучшая идея. Git был разработан для питания, и пользовательский интерфейс по-прежнему не так прост, как другие DVCS. Более простые инструменты для этого использования могут включать

http://git-annex.branchable.com/assistant/ (новый – я не пробовал)

http://www.cis.upenn.edu/~bcpierce/unison/ (старый режим ожидания, работает над ssh)

Dropbox (несвободный и требует подключения к Интернету, но с пятном и оптимизирует перенос по локальной сети)

Или есть Mercurial или даже Darcs. Я думаю, что либо бы избежать проблемы, что Git требует дополнительного голого репо или опасного фиксации. Mercurial должен быть более удобным для пользователя, чем Git. Darcs имеет другой дизайн для любых других DVCS … так что это может быть не лучшая идея. Глядя на документы, кажется, что Базар будет сомнительным для этого случая.

Если все, что вас удерживает, это то, что вы не можете ssh от B до A, но вы можете ssh от A до B, а затем установите обратный туннель ssh .

Я думаю, что это плохо для вас, я также думаю, что rsync намного лучше подходит для вашей задачи, поскольку вы просто должны хранить файлы в синхронизации git, по моему мнению, не идеальны, потому что:

  • вам явно не нужна какая-либо ветвящаяся / версия / распределенная модель
  • вам нужно иметь дело с файлами, git не имеет дело с файлами напрямую, в двух словах git видит каждый «объект» в вашей файловой системе (файлы и директории в основном) как хэш SHA1, вследствие чего нет возможности реально восстановить файл или просто сделать что-либо конкретное для файла, единственное, что git может сказать, – это изменение содержимого вашей ветки или нет, вот и все, и оно даже не поддерживает реальный трек в середине, для Например, контрольная сумма выполняется, если вы не совершаете, когда добавляете файлы на сцену.