如何在裸仓库上运行git p4提交?

时间:2013-03-19 23:18:45

标签: git perforce git-p4

TLDR

如何在裸仓库上运行git p4 submitgit p4 submit的哪个命令行选项是什么?

LONG STORY

我希望我公司的团队使用perforce,转移到git。我想用Git-P4实现这一目标。我想将一部分perforce克隆到一个git仓库,并将其作为一个远程仓库,以便人们克隆它,将更改推送到远程仓库,我会定期将远程仓库中所做的更改重新提交给perforce 。所以我按照本教程

http://answers.perforce.com/articles/KB_Article/Git-P4

归结为这个命令:

git p4 clone //depot/path.to/folder@all folder --bare

那可行,然后在我的客户端机器上

git clone "user1@server:/home/user1/path/to/folder"

,这很好,它显示出来,所以我编辑了一个测试文件,然后执行

git add file
git commit -m 'test'
git push.

然后工作,但是现在回到远程仓库现在在带回购的文件夹中,我这样做,

git p4 rebase

我得到了这个

git p4 rebase
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/path.to/folder/
No changes to import!
fatal: This operation must be run in a work tree
Some files in your working directory are modified and different than what is in your index. You can use git update-index <filename> to bring the index up-to-date or stash away all your changes with git stash.

git p4 submit

给了我这个:

Perforce checkout for depot path //depot/path.to/folder/ located at /home/user1/path/to/perforce.folder/
Synchronizing p4 checkout...
... - file(s) up-to-date.
fatal: Not a git repository: '.'
Command failed: ['git', 'rev-list', '--no-merges', 'remotes/p4/master..master']

所以问题是当我提交时,git repo不能是一个简单的仓库,它必须是一个带有工作目录的常规仓库,对吧?但如果是这样的话,为什么甚至给我一个--bare选项呢?我正在执行--bare选项的原因是,当我将其删除时,我得到了一组有关远程仓库工作副本中未提交更改的错误。但是如何让git p4提交而没有任何错误?

2 个答案:

答案 0 :(得分:3)

我对git p4的理解非常有限,但理论上这应该有用。

要以某种方式使用git p4,使您的裸git repo和perforce repos同步,您需要至少维护3种不同类型的存储库:

  • BareGitRepo - 您创建的裸仓库。我建议 直接在此repo中使用任何git p4命令。只需一个常规的裸git repo就足够了。所有使用git的开发人员都应直接克隆此存储库并仅将更改作为远程推送到此repo中。
  • GitP4Repo BareGitRepo 克隆的非裸仓库,但要与perforce同步。这是您运行所有git p4命令的地方。
  • P4Workspace - 一个perforce客户端工作区,您可以使用该工作区将git repo中的更改提交给perforce。

GitP4Repo

  • 最初使用git p4 clone <PERFORCE_FILE_PATH>
  • 设置回购
  • 定期同步 BareGitRepo 的更改。 (像git fetch origin && git rebase origin/master master
  • 之类的东西
  • 重新定位p4定期使用git p4 rebase进行更改。 (实际上git p4 sync后跟git rebase p4/master
  • 使用git p4 submit将更改提交到perforce。您需要在客户端工作区中映射 P4Workspace
  • 使用git push origin master推送从perforce合并的更改,返回 BareGitRepo

我能想到的事情:

  • 这些步骤需要定期运行(取决于您希望perforce提交与git repo同步的频率)。
  • 当你运行git p4 rebase时,git commit SHA1可能会改变,因为它会在新的perforce提交之上调用git rebase覆盖你的git repo的提交。我不确定是否有使用git merge的选项,并保留git提交的SHA1哈希值。

最后回答你的问题,为什么git p4 clone--bare选项,我只能想象git-p4的clone命令试图与常规git clone类似命令。

git clone还有一个--bare选项,用于创建裸存储库。不,您也无法在此类存储库中运行git pullgit checkoutgit rebase

答案 1 :(得分:1)

你不能从一个简单的回购提交。一个简单的回购只是用于克隆和推送更改。如果你想提交,你需要在另一个地方克隆裸仓库。

为什么你想要一个简单的回购呢?好吧,它是在你托管一个git项目时使用的,它有一个每个人都推送的简单主存储库。通常,裸仓库生活在不是任何人直接使用的服务器上。保持'裸'回购允许git尽可能高效地压缩所有数据。在许多情况下,与签出的回购单的单个修订版相比,您可能会看到10:1的压缩率。