Синхронизация репозиториев Git на разных машинах без push - PullRequest
3 голосов
/ 14 ноября 2009

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

Проработав пару дней над этим, все статьи, которые я нашел, похоже, предполагают, что вы захотите перейти в центральное хранилище, прежде чем извлекать его из этого на других машинах, но это кажется пустой тратой пространства. и (перевод) время. Есть ли руководства, которые могут объяснить, как сделать что-то подобное?

Редактировать 2: Пэт Нотц дал необходимый совет для исправления .git / config:

[branch "master"]
  remote = machine2
  merge = refs/heads/master
[remote "machine1"]
  url = ssh://192.168.0.4/~/settings
  fetch = +refs/heads/*:refs/remotes/machine1/*
[remote "machine2"]
  url = ssh://machine2/~/settings
  fetch = +refs/heads/*:refs/remotes/machine2/*

Редактировать 3: Большое спасибо за ответы. Результат можно найти в отдельном посте в блоге .

Ответы [ 2 ]

3 голосов
/ 14 ноября 2009

Как уже упоминалось, git pull является хорошим ответом здесь. Команда pull по сути является комбинацией fetch и merge; первый перенесет все удаленные коммиты в ваш репозиторий в виде (возможно, новой) ветви, а второй объединит эту ветку с вашей текущей веткой. Конечно, определить, какая ветвь получит слияние, немного хитро. В общем, вы должны настроить это для каждого хранилища. В Git есть особый случай, когда ветка, которая в настоящий момент извлечена, отслеживает удаленную ветвь в хранилище, из которого вы извлекаете, и эта удаленная ветвь является only , в которой есть изменения, и в этот момент Git просто Предположим, вы хотите объединить удаленную ветку с текущей и сделать это автоматически.

Помимо некоторой довольно непрозрачной конфигурации, pull имеет некоторые другие проблемы, заслуживающие упоминания. В частности: он связан с командой merge. Другими словами, если вы извлекаете удаленные изменения и у вас есть некоторые изменения в вашей локальной ветке, Git будет вынужден выполнить слияние, чтобы объединить две ветви. В принципе, это просто замечательно, но это наносит ущерб любой перебазировке, которую вы, возможно, захотите сделать в какой-то момент в будущем. Вы упомянули, что ваш вариант использования - это три ваших компьютера. Если бы я был тобой, я бы постарался сохранить свою историю в одной и той же ветке по всем трем как можно линейнее. Не объединяйте машину A с машиной B , перебазируйте изменения B поверх изменений A , чтобы получить один , линейная история на этой логической ветви.

Чтобы сделать это, вам придется использовать команду git fetch напрямую, а не через pull. Точнее, вы захотите сделать что-то вроде этого:

git fetch A
git rebase A/master

Замените "A/master" на имя удаленной ветви, которую вы отслеживаете локально. Любые изменения в вашем локальном репозитории будут переписаны в заголовке A/master, что даст вам линейную историю, а не историю, которая кратковременно расходится только для объединения нескольких коммитов позже.

3 голосов
/ 14 ноября 2009

Вы можете просто потянуть. То есть у вас есть несколько новых коммитов на машине A, и теперь вы находитесь на машине B, тогда вы просто вытягиваете из A, как

git pull A

В документации git pull есть много полезных примеров и примеров использования, включая использование пультов .

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