2014-01-27 3 views
4

После выполнения git-p4 clone --use-clientspec я хотел бы добавить дополнительную запись в clientpec и импортировать текущее состояние добавленной записи в мой репозиторий Git.Расширение `git-p4` clientspec после начального клонирования

После того как я продлить clientspec, git-p4 rebase ничего не делает (вероятно, потому что не было никаких новых соответствующих список изменений с момента последнего зафиксированного изменения, все, что я сделал обновляют clientspec)

Я пытался делать git-p4 sync --use-client-spec, но это жалуется что быстрый импорт не удался, потому что новый отзыв не содержит моего первоначального коммита.

Есть ли способ продлить клиентскую спецификацию, не имея git-p4 clone новый репозиторий Git с нуля?

+0

Это в основном дублирует http://stackoverflow.com/questions/20781449/git-p4-clone-sync-how-to-add-new-p4-path, хотя я не уверен, что ответ там работает (для меня это не сработало, и это, по-видимому, тоже не работает для вас). – jamesdlin

ответ

2

С момента написания я не смог найти способ получить git-p4 для импорта дополнительных путей непосредственно из клиента Perforce. Тем не менее, я считаю, что я разработал способ сделать это вручную, и у него есть git-p4.

Отказ от ответственности: Я не несу ответственности за любой ущерб, который могут возникнуть следующие шаги. Вероятно, было бы неплохо создать резервную копию вашего дерева .git.

Идея

Как вы говорите, просто добавив путь к clientspec Perforce и делать git p4 rebase изначально ничего не делает. Однако я заметил, что git p4 rebase будет добавлять файлы с этого пути после того, как они будут изменены в Perforce, и если новый путь находится в пределах git-p4 в списке depot-paths. (. depot-paths является первоначальный список путей депо предоставляется git p4 clone) Поэтому вам нужно:

  1. Чтобы получить первоначальную копию нового пути в репозиторий Git.
  2. Чтобы обмануть git-p4, полагая, что он добавил, что сама первоначальная копия.
  3. Чтобы получить git-p4, чтобы включить новый путь в свой список depot-paths.

Таким образом, вы можете синхронизировать копии файлов с Perforce, убедившись, что они совместимы с файлами, уже импортированными из Perforce, а затем вы можете явно добавить их в свой репозиторий Git.

git-p4 по-видимому, не хранит его depot-paths списка, ни последний импортируемый номер изменения Perforce где-нибудь другой, чем в Git сообщений фиксации, так что вы можете обмануть git-p4 путем репликации его метаданных в собственном коммите.

Наконец, вы можете перемещать p4/masterp4/HEAD, который является псевдонимом p4/master), чтобы указать на ваш новый совершать так, что команды будущего git p4 rebase лечения, которые совершают как нечто импортируемого из Perforce.

Шаг за шагом

  1. Заканчивать фиксации, соответствующий p4/master. Убедитесь, что у вас нет никаких поэтапных или неустановленных изменений. Если вы это сделаете, пристегните их.

  2. Добавить новый путь к клиенту Perforce, используемому git-p4. В приведенных ниже шагах я буду называть это //depot/new/path/.

  3. Запустите git log, чтобы просмотреть сообщение о фиксации из перенесенного вами Перфорационного изменения. Она будет иметь строку, которая выглядит как:

    [git-p4: depot-paths = "//depot/tree/": change = 12345]

    Запишите номер изменения Perforce.

  4. В клиенте Perforce синхронизируйте добавленный путь к этому номеру изменения. Например: p4 sync //depot/new/path/[email protected]

  5. Рекурсивно скопируйте эти вновь синхронизированные файлы с вашего клиента Perforce в соответствующее место в вашем репозитории Git. (Некоторая помощь может потребоваться здесь, если есть символические ссылки.)

  6. Запустите git add по этому новому пути в вашем хранилище Git.

  7. Пробег git commit. Вы можете в основном сказать все, что захотите, в своем сообщении о фиксации (например, «Начальный импорт // depot/new/path/из CLN 12345»). Тем не менее, в конце сообщения вы должны скопировать строку git-p4 метаданные, которые наблюдались перед:

    [git-p4: depot-paths = "//depot/tree/": change = 12345]

    Если //depot/new/path/ не подкаталог //depot/tree, то вы должны изменить depot-paths, чтобы добавить новый путь:

    [git-p4: depot-paths = "//depot/new/path/,//depot/tree/": change = 12345]

    depot-paths список должны быть отсортированы по значению ASCII (т.е. //depot/foo-bar/ должен Prec ede //depot/foo/bar/).

  8. Запустить git log еще раз. Подтвердите, что строка git-p4 в сообщении фиксации выглядит как импортированные изменения Perforce. Обратите внимание на хэш SHA1 вашего фиксации.

  9. Перейти к корню вашего репозитория Git. Редактировать .git/refs/remotes/p4/master. Удалите старый хэш SHA1 и замените его хэшем SHA1 вашего фиксации. (Если .git/refs/remotes/p4/master не существует, проверьте .git/packed-refs и обновить соответствующую строку там.)

Теперь ваш репозиторий Git содержит копию файлов из //depot/new/path/ от изменения 12345. и он должен подобрать любые изменения в этих файлах от будущих изменений в Perforce.

Некоторые другие вещи примечания

  • Очевидно, что новый путь будет существовать в репозитории Git только после того, как ваш коммит импортированы эти файлы, так git bisect не будет полезным, если он колеблется, что границы и включает в себя тех, файлы.

  • Поскольку измененные файлы автоматически добавляются, если они включены в ваш запрос клиента Perforce (и содержатся в git-p4depot-paths), в некоторых случаях вы потенциально можете избежать всей этой работы. Например, если вы заранее знаете, что кто-то собирается добавить новый каталог в хранилище Perforce, и этот каталог уже включен вашим depot-paths, но не вашим запросом клиентов, вы можете просто добавить его в свой клиентский интерфейс Perforce. Затем вы сможете получить этот новый путь автоматически после его добавления в Perforce.

  • Альтернативно вы можете добавить новый путь к своему клиенту Perforce, а затем отправить изменение Perforce, которое касается всех файлов в этом пути. Я делаю не, рекомендую сделать это, однако, поскольку это может быть разрушительным для других (и представьте, если бы все это сделали). Я упоминаю это только для полноты.

Смежные вопросы