2

TLDR

如何git p4 submit在裸回购上运行?那是哪个命令行选项git p4 submit

很长的故事

我希望我公司内使用 perforce 的团队迁移到 git。我想使用 Git-P4 来实现这一点。我想将一部分 perforce 克隆到 git repo,并将其作为远程 repo,以便人们克隆它,将更改推送到远程 repo,我会定期将远程 repo 中所做的更改重新提交回 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.

这行得通,但是现在回到带有repo的文件夹中的远程repo,我这样做,

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不能是一个裸repo,它必须是一个带有工作目录的普通repo,对吗?但如果是这样的话,为什么还要给我一个--bare选择呢?我选择这个选项的原因--bare是,当我把它排除在外时,我得到了一组不同的错误,这些错误是关于远程 repo 的工作副本中未提交的更改。但是如何让 git p4 提交而没有任何错误呢?

4

2 回答 2

3

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

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

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

GitP4Repo 中

  • 最初使用设置 repogit p4 clone <PERFORCE_FILE_PATH>
  • 定期从BareGitRepo同步更改。(有点像git fetch origin && git rebase origin/master master
  • 定期p4使用git p4 rebase. (本质上确实git p4 sync跟着 a git rebase p4/master
  • 使用 . 将更改提交到 perforce git p4 submit。这是您需要在客户端工作区中映射P4Workspace的地方。
  • 使用perforce 将合并的更改推送回BareGitRepogit push origin master

我能想到的问题:

  • 这些步骤需要定期运行(取决于您希望 perforce 提交与您的 git 存储库同步的频率)。
  • 当您运行 a 时,git commit SHA1 可能会发生变化,git p4 rebase因为它会调用git rebase将来自您的 git 存储库的提交覆盖在较新的 perforce 提交之上。我不确定是否可以使用选项git merge,并保留 git 提交的 SHA1 哈希。

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

git clone还有一个--bare用于创建裸存储库的选项。不,您也不能在这样的存储库上运行git pullor 。git checkoutgit rebase

于 2013-03-20T00:31:34.463 回答
1

您不能从裸仓库提交。裸仓库仅用于克隆和推送更改。如果要提交,则需要在另一个位置克隆裸仓库。

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

于 2013-03-20T09:02:01.583 回答