git-p4 и тянет из других репо - PullRequest
2 голосов
/ 25 октября 2009

У меня есть ноутбук и рабочий стол, для которого я пытаюсь научиться использовать git для управления своей работой с репозиторием Perforce. Я успешно использую git-p4 на настольном компьютере, и могу успешно использовать его и на ноутбуке, в изоляции. Тем не менее, я хотел бы иметь возможность «вытягивать» или «проталкивать» изменения с ноутбука на настольный компьютер или наоборот, без предварительной регистрации в ветви p4, синхронизируемой с git.

Итак, вот что я сделал для настройки двух репозиториев: 1) настроить репо на моем рабочем столе, используя клон git-p4. Сделайте некоторую работу над ним, сделайте несколько коммитов в git и несколько отправьте git-p4. Все работало как положено. 2) позже на моем ноутбуке установили репо, готовясь к работе на обеих машинах. Аналогично, используйте git-p4, чтобы сделать клон текущего репо p4 (теперь уже проверено несколько ревизий, где я делал git-p4 в (1).

Теперь, что я надеялся сделать: 1) сделать некоторую работу на рабочем столе. Зафиксируйте работу для мерзавца, но не для p4. 2) подойдите к ноутбуку и сделайте git pull ... из репозитория рабочего стола. 3) продолжить работу над ноутбуком, периодически комментируя git. 4) (опционально) коммит на p4 с ноутбука 5) (дополнительно) нажмите на рабочий стол (или вытяните с ноутбука на рабочий стол) и продолжите работу на рабочем столе и т. Д.

По сути, я хотел бы иметь возможность перемещать / перемещать вещи назад и вперед между ноутбуком и настольным компьютером без фактической проверки на p4.

Похоже ли это на то, что должно быть возможно? Если да, то есть ли шаги, которые я делаю не так?

Вот что происходит: когда я пытаюсь выполнить «вытягивание» в (2) выше, я получаю сообщения об ошибках, в которых говорится, что есть конфликты - и эти конфликты связаны с изменениями, которые были сделаны между первыми проверками ветки p4 и время создания второго репозитория git-p4. Другими словами, они, кажется, являются воспроизведением изменений, которые должны были уже быть в коде, который содержался во втором репо, но по какой-то причине они не были.

Я довольно новичок в Git, так что я надеюсь, что мой вопрос не сумасшедший, глупый или невозможный для понимания. Заранее благодарим за любую помощь, которую вы можете оказать.

1 Ответ

5 голосов
/ 26 октября 2009

Проблема в том, что ваши два репозитория (настольный компьютер и ноутбук) не понимают, что они связаны друг с другом через Perforce. Обычный клон git-p4 возьмет с вершины дерева и, как таковой, вы получите разные идентификаторы фиксации для идентичных изменений. Это потому, что git «commit» содержит информацию о своих родителях.

Самое простое решение - это работать следующим образом:

  1. Создайте клон git-p4 на рабочем столе.
  2. git clone с рабочего стола на ноутбук.

Теперь и ваш ноутбук, и ваш рабочий стол будут иметь общую историю от Perforce. (Вы можете убедиться в этом, увидев, что идентификаторы фиксации в git log были другими, но после этих двух шагов они должны быть одинаковыми.)

После этого вы сможете перемещаться между двумя репозиториями без конфликтов.

Фактически, вы сможете git p4 sync или git p4 rebase в любом месте, потому что git-p4 достаточно умен, чтобы обнаружить работу другого и продолжить. Ваш ноутбук также попытается git pull с исходного сервера (вашего рабочего стола), если сможет, если я правильно помню.

Два других совета:

  • Не используйте git push между этими двумя хранилищами. Как правило, небезопасно отправлять в не голые репозитории , т. Е. В те репозитории, которые имеют рабочие деревья, например, те, которые вы описали здесь. Если вы сделаете такой толчок, то индекс будет отличаться от рабочего дерева, и такие вещи, как git status (и, следовательно, git commit и т. Д.), Не будут работать так, как вы ожидаете.
  • Держите Perforce в отдельной ветке (я использую master) и делаю все ваши разработки в ветках тем. Тяните только к этим веткам. Когда вы делаете git p4 sync или rebase, переключитесь обратно на master ветку. Затем выполните слияние с master до вашей ветки. Это помогает сохранять предысторию предельно ясной и отделенной от работы, которую вы делаете в git.
...