git: простое решение для перемещения между рабочими копиями - PullRequest
14 голосов
/ 24 января 2010

Что я хочу сделать: На моей (ssh, удаленно доступной) университетской машине я работаю над проектом, который я помещаю под контроль исходного кода git (git init, затем git commit -a после каждого изменения, все отлично работает). Теперь я хочу работать над этим проектом на моей частной машине дома. Должно быть легко, так как git - это распределенный vcs, верно?

Я прочитал git tutorial , в котором предлагается сделать git pull в университете, чтобы сделать изменения дома. Это не сработает, поскольку моя машина дома недоступна удаленно. Поэтому я подумал, что сделаю git push дома. Это работает, но это сложно (требует git reset в университете и т. Д.), , так как репозитории non-bare не предназначены для нажатия .

Вопрос 1: Есть ли более простой способ, чем добавить дополнительный пустой репозиторий в мою настройку (что означало бы, что у меня было: (1) «основной» пустой репозиторий, (2) работающий в университете копия, (3) домашняя рабочая копия)?
Если бы я действительно нуждался в этой настройке, я мог бы остаться с SVN.

Вопрос 2: Если эта настройка действительно нужна, как мне создать этот пустой репозиторий (я думаю, git clone --bare) и сделать его "основным" репозиторием , т.е. , скажите рабочим копиям, что git push должен идти туда .

PS: Я знаю, что есть плавающий крюк после получения, который позволяет вам перемещаться в непокрытые репозитории. Я попробовал это, но это не сработало, так как версия git на машине университета довольно старая (1.5.5.6) и пропускает некоторые команды, используемые хуком. Обновление не вариант, и я бы все равно предпочел решение без сторонних скриптов.

Ответы [ 2 ]

13 голосов
/ 24 января 2010

Вы действительно не должны нажимать на извлеченную ветку, поскольку она эффективно вытягивает коврик из-под удаленной рабочей копии. Тогда трудно понять, изменилось ли рабочее дерево из-за того, что головка ветки сместилась, или если были также локальные изменения, которые были бы потеряны reset --hard.

Самое простое, что нужно сделать - это нажать на другую ветку. Затем вы можете объединить это с веткой извлечения рабочей копии (или перебазировать локальную ветку на нее), когда у вас есть доступ к удаленному компьютеру и вам нужно поработать над ним.

Из дома:

git push origin HEAD:from-home

Из «работы»:

git merge from-home

Вы можете настроить вашу конфигурацию по умолчанию для определенного push-refspec.

, например

git config remote.origin.push +master:from-home

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

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

Итак, при отправке создайте пульт под названием «home» - вы, очевидно, не сможете извлечь его из-за конфигурации вашей сети. Это не имеет значения.

В домашних условиях скажите ему: «Когда я нажимаю на источник, он обновляет пульт источника с именем home :

git config remote.origin.push +master:home/master

Теперь все становится очень гладко. Из дома запустите git push origin и перейдите к исходному пункту, и запустите git status или git branch -a -v - вы увидите что-то вроде: «хозяин отстает от дома / хозяина на 3 коммита и его можно быстро переслать». 1033 *

Другими словами, использование home для отправки изменения в доменное имя с именем удаленного источника функционально аналогично использованию origin для извлечения из дома.

Единственным недостатком здесь является то, что вам нужно будет постоянно делать новые настройки git config, когда вы создаете дополнительные ветки дома. Это накладные расходы, которые вы платите за настройку сети. К счастью, это просто и происходит только один раз для каждой ветви.

1 голос
/ 24 января 2010
  1. Этот вопрос подводит итог моего опыта с попыткой синхронизации двух рабочих копий. В конце концов я решил, что было бы более естественно и просто иметь пустой репозиторий. Это не «основной» репозиторий в смысле SVN - вы можете иметь один, например, в универе и один дома, и между ними есть push-pull.

  2. Кто-то, возможно, опубликует правильный способ установить пустой репозиторий в качестве вашей цели push, но, не глядя на документы, я просто удалил рабочую копию и снова клонировал ее из чистого репозитория.

...