2

TLDR

git p4 submit裸のレポでどのように実行しますか? それはどのコマンドラインオプションgit p4 submitですか?

長い話

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 リポジトリをベア リポジトリにできないことです。作業ディレクトリを持つ通常のリポジトリにする必要があります。しかし、そうであれば、なぜ私に--bareオプションを与えるのでしょうか? オプションを実行している理由--bareは、それを省略したときに、リモート リポジトリの作業コピーでコミットされていない変更に関する別のエラー セットが発生したためです。しかし、エラーなしで git p4 を送信するにはどうすればよいですか?

4

2 に答える 2

3

私の理解git p4はかなり限られていますが、理論的にはこれでうまくいくはずです。

裸の git リポジトリと perforce リポジトリの両方が同期されるように使用するgit p4には、少なくとも 3 つの異なるタイプのリポジトリを維持する必要があります。

  • BareGitRepo - 作成したベア リポジトリ。このレポのコマンドを直接使用しないことをお勧めします。git p4通常の裸の git リポジトリだけで十分です。git を使用するすべての開発者は、このリポジトリを直接複製し、変更をリモートとしてこのリポジトリにのみプッシュする必要があります。
  • GitP4Repo BareGitRepoから複製された非ベア リポジトリですが、perforce と同期します。ここですべてのgit p4コマンドを実行します。
  • P4Workspace - git リポジトリから perforce に変更を送信できる perforce クライアント ワークスペース。

GitP4Repoで:

  • 最初に使用してレポをセットアップしますgit 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 からマージされた変更をプッシュし、BareGitRepoに戻します。git push origin master

私が考えることができる落とし穴:

  • これらの手順は定期的に実行する必要があります (perforce コミットを git リポジトリと同期する頻度に応じて)。
  • git commit SHA1 は、新しい perforce コミットの上に git リポジトリからのコミットをオーバーレイするgit p4 rebaseように起動するため、a を実行すると変更される可能性があります。代わりに使用するオプションがあり、git コミットの SHA1 ハッシュを保持するgit rebaseかどうかはわかりません。git merge

最後に、あなたの質問に答えるために、なぜオプションgit p4 cloneがあるのか​​ 、git-p4のコマンドが通常のコマンドに似ている--bareことしか想像できません。clonegit clone

git clone--bareベアリポジトリを作成するために使用されるオプションもあります。いいえ、そのようなリポジトリでgit pullor またはgit checkoutまたはを実行することはできません。git rebase

于 2013-03-20T00:31:34.463 に答える
1

裸のリポジトリから送信することはできません。ベアリポジトリは、変更元のクローンを作成し、変更をプッシュするためだけのものです。送信する場合は、ベアリポジトリを別の場所に複製する必要があります。

では、なぜ裸のレポが必要なのですか?まあ、それはあなたが誰もがプッシュする単純なマスターリポジトリを持つgitプロジェクトをホストしているときに使用されます。通常、ベアリポジトリは、誰も直接使用していないサーバー上に存在します。'bare'リポジトリを維持することで、gitはすべてのデータを可能な限り効率的に圧縮し続けることができます。多くの場合、チェックアウトされたリポジトリの単一のリビジョンと比較して、10:1の圧縮率が表示される場合があります。

于 2013-03-20T09:02:01.583 に答える