Как заставить --detect-branchs работать с git-p4?

Мой репозиторий p4 имеет структуру, похожую на:

//depot/project/branch1
//depot/project/branch2
//depot/project/branch3
... etc

Однако, когда я использую git-p4 для клонирования «проекта», все 3 ветки не считаются ветвями, и все они клонируются в одну основную ветку.

Вот как я вызываю git-p4:

git-p4 clone --detect-branches //depot/project

Я ожидал, что git-p4 создаст базу данных git для "project" с тремя ветвями, а корень проекта будет сопоставлен с частью пути после имени ветки (например: если //depot/project/branch1 имеет подкаталог с именем "lib" ( //depot/project/branch1/lib), то моя локальная файловая система должна быть примерно /git_project/lib с 3 ветками git).

Я ожидаю неправильного? Я неправильно вызываю git-p4?


person Michael Brennan    schedule 29.04.2010    source источник
comment
Тебе когда-нибудь везло, Майкл? У меня много проблем с этим, даже с использованием спецификаций ветвей, как описано на многих веб-сайтах.   -  person Br.Bill    schedule 23.11.2016


Ответы (2)


Если вы посмотрите на код git-p4 (также исходно здесь), вы видите:

if self.detectBranches:
  branches = self.splitFilesIntoBranches(description)
  for branch in branches.keys():
    ## HACK  --hwn
    branchPrefix = self.depotPaths[0] + branch + "/"

с splitFilesIntoBranches изучает репозиторий p4 для веток.

Так что, возможно, git-p4 clone //depot/project@all --detect-branches будет хорошо (с @all, как в этом ответ SO и параметр --detect-branches после пути репо)?

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

person VonC    schedule 29.04.2010
comment
Я попробовал @all. Однако, возможно, это не работает из-за скобок в других частях депо? Ветка, упомянутая в выводе ниже, не находится в той части хранилища, которую я пытаюсь клонировать (она находится выше). (Я замаскировал имена проектов и имена пользователей с помощью PROJECT и USER) - person Michael Brennan; 04.05.2010
comment
Инициализирован пустой репозиторий Git в /cygdrive/c/projects/PROJECT/.git/ /bin/sh: -c: строка 0: синтаксическая ошибка рядом с неожиданным токеном (' /bin/sh: -c: line 0: p4 -G ветвь -o dev_OtherProject(ASP.Net)_USER' Импорт ревизии 181332 (0%) Импорт новой ветки PROJECT/Main/dotNet Возобновление с изменением 181332 фатальный: Недопустимое имя ссылки или выражение SHA1: refs/remotes/p4/PROJECT/Delivery/dotNet fast-import: сброс отчета о сбое в .git/fast_import_crash_1832 Не будет Не запустить его 3 раза, по одному на ветку, создать 3 репозитория git? Я думал, что клон git-p4 всегда создает новый репозиторий. - person Michael Brennan; 04.05.2010

Я только что работал над связанной ошибкой с --detect-branches. Скрипт делает несколько вещей:

  1. определить имена ветвей, используя данные p4
  2. создать карту родителя каждой ветки
  3. сопоставить файлы с определенной веткой
  4. удалите префикс ветки перед фиксацией в git

Вам нужно будет следовать коду, чтобы убедиться, что каждый шаг выполняется правильно. Использование pdb для этого работает достаточно хорошо.

Шаг 1 и 2 выполняются в P4Sync.getBranchMapping

Шаг 3 выполняется в P4Sync.splitFilesIntoBranches

Для шага 4 это делается с помощью P4Sync.stripRepoPath. Установите там точку останова, и вы увидите, были ли обнаружены ветки и правильно ли переименовываются файлы.

person cmcginty    schedule 18.08.2012