С момента написания я не смог найти способ получить git-p4
для импорта дополнительных путей непосредственно из клиента Perforce. Тем не менее, я считаю, что я разработал способ сделать это вручную, и у него есть git-p4
.
Отказ от ответственности: Я не несу ответственности за любой ущерб, который могут возникнуть следующие шаги. Вероятно, было бы неплохо создать резервную копию вашего дерева .git
.
Идея
Как вы говорите, просто добавив путь к clientspec Perforce и делать git p4 rebase
изначально ничего не делает. Однако я заметил, что git p4 rebase
будет добавлять файлы с этого пути после того, как они будут изменены в Perforce, и если новый путь находится в пределах git-p4
в списке depot-paths
. (. depot-paths
является первоначальный список путей депо предоставляется git p4 clone
) Поэтому вам нужно:
- Чтобы получить первоначальную копию нового пути в репозиторий Git.
- Чтобы обмануть
git-p4
, полагая, что он добавил, что сама первоначальная копия.
- Чтобы получить
git-p4
, чтобы включить новый путь в свой список depot-paths
.
Таким образом, вы можете синхронизировать копии файлов с Perforce, убедившись, что они совместимы с файлами, уже импортированными из Perforce, а затем вы можете явно добавить их в свой репозиторий Git.
git-p4
по-видимому, не хранит его depot-paths
списка, ни последний импортируемый номер изменения Perforce где-нибудь другой, чем в Git сообщений фиксации, так что вы можете обмануть git-p4
путем репликации его метаданных в собственном коммите.
Наконец, вы можете перемещать p4/master
(и p4/HEAD
, который является псевдонимом p4/master
), чтобы указать на ваш новый совершать так, что команды будущего git p4 rebase
лечения, которые совершают как нечто импортируемого из Perforce.
Шаг за шагом
Заканчивать фиксации, соответствующий p4/master
. Убедитесь, что у вас нет никаких поэтапных или неустановленных изменений. Если вы это сделаете, пристегните их.
Добавить новый путь к клиенту Perforce, используемому git-p4
. В приведенных ниже шагах я буду называть это //depot/new/path/
.
Запустите git log
, чтобы просмотреть сообщение о фиксации из перенесенного вами Перфорационного изменения. Она будет иметь строку, которая выглядит как:
[git-p4: depot-paths = "//depot/tree/": change = 12345]
Запишите номер изменения Perforce.
В клиенте Perforce синхронизируйте добавленный путь к этому номеру изменения. Например: p4 sync //depot/new/path/[email protected]
Рекурсивно скопируйте эти вновь синхронизированные файлы с вашего клиента Perforce в соответствующее место в вашем репозитории Git. (Некоторая помощь может потребоваться здесь, если есть символические ссылки.)
Запустите git add
по этому новому пути в вашем хранилище Git.
Пробег 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/
).
Запустить git log
еще раз. Подтвердите, что строка git-p4
в сообщении фиксации выглядит как импортированные изменения Perforce. Обратите внимание на хэш SHA1 вашего фиксации.
Перейти к корню вашего репозитория 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-p4
depot-paths
), в некоторых случаях вы потенциально можете избежать всей этой работы. Например, если вы заранее знаете, что кто-то собирается добавить новый каталог в хранилище Perforce, и этот каталог уже включен вашим depot-paths
, но не вашим запросом клиентов, вы можете просто добавить его в свой клиентский интерфейс Perforce. Затем вы сможете получить этот новый путь автоматически после его добавления в Perforce.
Альтернативно вы можете добавить новый путь к своему клиенту Perforce, а затем отправить изменение Perforce, которое касается всех файлов в этом пути. Я делаю не, рекомендую сделать это, однако, поскольку это может быть разрушительным для других (и представьте, если бы все это сделали). Я упоминаю это только для полноты.
Это в основном дублирует http://stackoverflow.com/questions/20781449/git-p4-clone-sync-how-to-add-new-p4-path, хотя я не уверен, что ответ там работает (для меня это не сработало, и это, по-видимому, тоже не работает для вас). – jamesdlin