git-p4 submit не работает с недопустимым именем объекта HEAD ~ 261

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

git clone [email protected]:asdf/qwerty.git
git-p4 sync //depot/path/to/querty
git merge remotes/p4/master     (there was a single README file...)

Итак, я скопировал происхождение новому чистому директору, получил красивое объединенное дерево файлов, и git status показывает, что я в курсе. Но:

> git-p4 submit
fatal: Not a valid object name HEAD~261
Command failed: git cat-file commit HEAD~261

Эта ветка в списке рассылки git кажется быть актуальным, но я не могу понять, что они делают со всеми пунктами A, B и C. Не мог бы кто-нибудь пояснить, что означает «Недействительное имя объекта» и что я могу сделать, чтобы решить эту проблему? Все, что я хочу делать, это периодически делать снимки источника / мастера в Perforce; полная история не требуется. Спасибо.


person Harlan    schedule 22.04.2010    source источник
comment
Чтобы уточнить, у меня есть существующая кодовая база в репозитории git (хранится на github, но это не имеет значения) и репозиторий Perforce, который пуст. Я хочу делать периодические снимки главной ветки репозитория git в репозиторий Perforce. Все примеры git-p4, которые я видел, предполагают, что репозиторий Perforce является основным и что я создаю новое репо git. Для меня это не так. Я не хочу каким-либо образом изменять существующий проект git, но инструкции в списке рассылки и ответ VonC предполагают, что новая работа находится в этом странном репозитории с двойным клонированием.   -  person Harlan    schedule 10.05.2010
comment
Мне жаль, что твоя награда не сработала. Может быть, поможет новый вопрос с другим контекстом или другими деталями.   -  person VonC    schedule 18.05.2010
comment
Тема в списке рассылки звучит так, как будто в ней есть полезная информация, но ссылка не работает, и ни в кэше Google, ни в archive.org нет копии.   -  person funroll    schedule 02.05.2013
comment
Есть новости как решить эту проблему?   -  person Michael Dorner    schedule 06.04.2015


Ответы (2)


9 лет спустя эта проблема может исчезнуть с Git 2.23 (третий квартал 2019 г.).

См. commit c3f2358 (28 мая 2019 г.) по Майк Мюллер (mdymike).
(Объединено Junio ​​C Hamano - gitster - в совершить add59c4 >, 17 июня 2019 г.)

p4 unshelve: исправьте "Not a valid object name HEAD0" в Windows

git p4 unshelve выдает следующие ошибки:

fatal: Not a valid object name HEAD0
Command failed: git cat-file commit HEAD^0

(git version 2.21.0.windows.1, python 2.7.16)

Вызов pOpen, используемый git-p4 для вызова команды git, может принимать в качестве первого аргумента либо строку, либо массив.
Форма массива предпочтительна, поскольку зависящее от платформы экранирование специальных символов будет обрабатываться автоматически. (
https://docs.python.org/2/library/subprocess.html)
Однако метод extractLogMessageFromGitCommit использовал строковую форму, поэтому символ каретки (^) в аргументе HEAD^0 не экранировался в Windows.
Каретка оказывается escape-символом, поэтому команда git была получение HEAD0.

Поведение можно подтвердить, набрав ECHO HEAD^0 в командной строке, которая выдает HEAD0.

Решение состоит в том, чтобы просто использовать формат массива для передачи команды fOpen, что рекомендуется и в любом случае используется в других частях этого кода.

person VonC    schedule 19.06.2019

fatal: Not a valid object name

должно означать, что каким-то образом HEAD пульта указывает на неправильную ссылку.
Другими словами, когда вы выполняете импорт P4 в репозитории git, нет возможности отправить из этого репозитория git на P4 из-за неправильного SHA1. Почему? Я не знаю.

Вот почему в упомянутой вами теме пользователь:

  • клонировать репо P4 в B с помощью --import-local ("Импортировать в refs/heads/, а не refs/remotes"),
  • сделать B (клон Git репозитория p4) a bare репо (так что вы не когда-либо работать в нем, так как его рабочее дерево пусто)
  • исправить HEAD элемента B для ссылки на главную ветвь p4, импортированную в B

  • clone B в C, репо без голого (его рабочее дерево не пустое, вы можете работать в нем)

B был там только для первоначального импорта.

Остальная работа выполняется на C (в котором нет проблем с неправильным SHA1) с помощью:

  • git-p4 sync (объявить в C remotes/p4/master в дополнение к remotes/origin/*)
  • git-p4 submit
person VonC    schedule 22.04.2010
comment
Простите, я не понимаю. Не могли бы вы попробовать еще раз? Спасибо. - person Harlan; 22.04.2010
comment
@Harlan: Я подчеркнул роль репо C. Я не полностью понимаю точную причину этой проблемы, но я просто хотел проиллюстрировать обходной путь, предложенный в упомянутой вами теме. - person VonC; 22.04.2010
comment
Кроме того, шаги в этом потоке списка рассылки, похоже, не имеют отдельного репозитория git origin, который у меня есть, и, похоже, имеют B и C на разных машинах, что меня смущает. - person Harlan; 22.04.2010
comment
@Harlan: B и C находятся на одной машине. Что касается обходного пути, это действительно после git-p4 clone, а не git clone. Тем не менее, идея остается: один первоначальный импорт в локальном репозитории git, после этого сделанный голым (B), и вся работа, выполненная из C (клонированная из B) - person VonC; 22.04.2010