2

我有一台笔记本电脑和一台台式机,我正在尝试学习使用 git 来管理我对 perforce 存储库的工作。我在桌面上成功地使用了 git-p4,并且也可以在笔记本电脑上成功地使用它,隔离。但是,我想做的一件事就是将更改从笔记本电脑“拉”或“推”到台式机,反之亦然,而无需先将它们签入与 git 同步的 p4 分支。

所以,这就是我设置两个存储库的方法:1)使用 git-p4 clone 在我的桌面上设置一个存储库。做一些工作,向 git 提交几次,向 git-p4 提交几次。一切都按预期工作。2)稍后,在我的笔记本电脑上设置一个仓库,准备在两台机器上工作。同样,使用 git-p4 克隆当前的 p4 存储库(现在在过去检查了几个修订,我在 (1) 中执行了 git-p4。

现在,我希望做的是:1)在桌面上做一些工作。将工作提交给 git,但不是 p4。2)转到笔记本电脑,然后从桌面存储库中执行 git pull ...。3)继续我在笔记本电脑上的工作,定期提交 git。4)(可选)从笔记本电脑提交到 p4 5)(可选)推送到桌面(或从笔记本电脑拉到桌面)并继续在桌面上工作,等等。

基本上,我希望能够在笔记本电脑和台式机之间来回推/拉东西,而无需实际签入 p4。

这听起来应该是可能的吗?如果是这样,上面是否有我做错的步骤?

以下是不断发生的事情:当我尝试在上面 (2) 中执行“拉动”时,我收到错误消息,指出存在冲突 - 这些冲突与 p4 分支的第一次签出和创建第二个 git-p4 存储库的时间。换句话说,它们似乎是对应该已经在第二个 repo 包含的代码中的更改的重放,但由于某种原因,它们不是。

我对 git 很陌生,所以我希望我的问题不是疯狂愚蠢或无法理解。提前感谢您提供的任何帮助。

4

1 回答 1

5

问题是您的两个存储库(台式机和笔记本电脑)没有意识到它们通过 Perforce 相互关联。正常的git-p4克隆将取自树顶,因此,对于相同的更改,您将获得不同的提交标识符。这是因为 git “commit” 包含有关其父母的信息。

最简单的解决方案是按如下方式工作:

  1. 在桌面上创建 git-p4 克隆。
  2. git clone从您的台式机到您的笔记本电脑。

现在,您的笔记本电脑和台式机都将拥有来自 Perforce 的共同历史。(您可以通过查看提交标识符在git log之前不同但在这两个步骤之后应该相同来验证这一点。)

在此之后,您应该能够在两个存储库之间拉取而不会发生冲突。

事实上,你将能够git p4 syncgit p4 rebase在任何一个地方都可以,因为git-p4你足够聪明,可以检测到对方的工作并继续。git pull如果可以的话,如果我没记错的话,你的笔记本电脑也会尝试从源服务器(你的桌面)。

另外两个建议:

  • 不要git push在这两个存储库之间使用。推送到非裸存储库通常是不安全的,即那些具有工作树的存储库,例如您在此处描述的那些。如果您执行此类推送,则索引将与工作树不同,并且git status(因此git commit等)之类的内容将无法按您期望的方式工作。
  • 将 Perforce 放在一个单独的分支上(我使用master),并在主题分支上进行所有开发。只拉到这些分支。当您执行git p4 syncorrebase时,切换回您的master分支。master然后从向下合并到您的主题分支。这有助于保持上游历史非常清晰,并与您在 git 中所做的工作分开。
于 2009-10-26T00:12:25.870 回答