5

我有一个 git 存储库,我想将它镜像到 Perforce 存储库。我已经下载了 git-p4 脚本(没有给出弃用警告的更新版本),并且一直在使用它。我已经想出了如何从 Perforce 中提取更改,但是当我尝试从 git repo 同步更改时出现错误。这是我到目前为止所做的:

git clone git@github.com: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;不需要完整的历史记录。谢谢。

4

2 回答 2

1

9 年后,Git 2.23(2019 年第三季度)可能会解决这个问题

请参阅Mike Mueller ( )提交的 c3f2358(2019 年 5 月 28 日) 。(由Junio C Hamano 合并 -- --提交add59c4,2019 年 6 月 17 日)mdymike
gitster

p4 unshelve: 修复Not a valid object name HEAD0Windows 上的“”

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方法使用字符串形式,因此Windows 上未对 0 参数中的插入符号 ( ^) 字符进行转义。 插入符号恰好是转义字符,这就是 git 命令接收.HEAD^
HEAD0

可以通过在命令提示符下键入来确认该行为ECHO HEAD^0,该命令会发出HEAD0.

解决方案是简单地使用将命令传递给的数组格式,fOpen无论如何都推荐并在此代码的其他部分使用这种格式。

于 2019-06-19T23:14:53.020 回答
0
fatal: Not a valid object name

应该意味着遥控器的 HEAD 以某种方式指向了不正确的参考。
换句话说,当您在 git repo 中执行 P4 导入时,由于 SHA1 不正确,无法从该 git repo 提交到 P4。为什么?我不知道。

这就是为什么,在你提到的线程中,用户:

  • --import-local使用("Import into refs/heads/, not refs/remotes")将 P4 存储库克隆到 B 中,
  • 使 B(p4 存储库的 Git 克隆)成为一个裸存储库(所以你永远不会在其中工作,因为它的工作树是空的)
  • 修复HEADB 以引用 B 中导入的 p4 master 分支

  • 将 B 克隆到 C,一个非裸 repo(它的工作树不是空的,你可以在里面工作)

B 仅用于初始导入。

其余的工作在 C 中完成(没有不正确的 SHA1 问题),其中:

  • git-p4 syncremotes/p4/master(除了 在 C 中声明remotes/origin/*
  • git-p4 submit
于 2010-04-22T18:02:45.600 回答