Perforceユーザー向けのGit


86

私はPERFORCEを何年も使用しています。個人コードにgitを使用するように切り替えたいのですが、私が見たすべてのgitチュートリアルは、あなたが完全なソース管理n00b(非常に面倒なものになります)であるか、慣れていることを前提としています。 svn(私はそうではありません)。

私はp4を知っており、分散ソース管理システムの背後にある考え方も理解しています(したがって、売り込みは必要ありません、ありがとう)。私が欲しいのは、p4コマンドから同等のgitコマンドへの変換テーブルと、同等のp4がない「なしでは生きられない」コマンドです。

すべてのp4ユーザーがp4の異なるサブセットを使用していると思われるので、これは私がgitで実行できるようにしたい、p4で定期的に実行するいくつかのことですが、これまで見てきたドキュメントからはすぐにはわかりません。 :

  1. 1つのクライアントで複数の保留中の変更リストを作成します。(p4 change
  2. 保留中の変更リストを編集します。(またp4 change
  3. 保留中のすべてのチェンジリストのリストを参照してください(p4 changes -s pending
  4. クライアント(p4 opened)または保留中の変更リスト(p4 describe)内のすべての変更されたファイルのリスト
  5. 保留中の変更リストの差分を参照してください(これにはp4 diff、とを使用するラッパースクリプトを使用しますp4 describe
  6. 特定のファイルについて、送信された変更リストがどの行に影響したかを確認します(p4 annotate
  7. 特定のファイルについては、ファイルに影響を与えたチェンジリストの説明のリストを参照してください(p4 log
  8. 保留中の変更リストを送信する(p4 submit -c
  9. 保留中のチェンジリストを中止する(p4 revert

これらの多くは「チェンジリスト」を中心に展開しています。「チェンジリスト」はp4の用語です。gitの同等の用語は何ですか?

ブランチは、p4がチェンジリストと呼ぶものの代わりにgitユーザーが使用するもののようです。p4にもブランチと呼ばれるものがあるため、少し混乱しますが、それらは漠然と関連した概念にすぎないようです。(私はいつもp4のブランチの概念はかなり奇妙だと思っていましたが、それはまたもや古典的なRCSのブランチの概念とは異なります。)

とにかく... gitのブランチを使用してp4チェンジリストで通常行うことをどのように達成するかがわかりません。p4では、次のようなことができます。

$ p4 edit a.txt
$ p4 change a.txt
Change 12345 created.

この時点で、a.txtを含むチェンジリストがあります。説明を編集して、変更リストを送信せずに作業を続行できます。また、コードの他のレイヤーのバグ修正など、他のファイルに変更を加える必要があることが判明した場合は、同じクライアントでそれを行うことができます。

$ p4 edit z.txt
$ p4 change z.txt
Change 12346 created.

これで、同じクライアントに2つの別々のチェンジリストがあります。これらを同時に処理することができ、それらを「切り替える」ために何もする必要はありません。コミットするときが来たら、個別に送信できます。

$ p4 submit -c 12346  # this will submit the changes to z.txt
$ p4 submit -c 12345  # this will submit the changes to a.txt

これをgitで複製する方法がわかりません。私の実験から、git add現在のブランチに関連付けられているようには見えません。私が知る限り、その時点でどのブランチにいたかに関係なくgit commit、私が行ったすべてのファイルをコミットgit addするとき:

$ git init
Initialized empty Git repository in /home/laurence/git-playground/.git/
$ ls
a.txt  w.txt  z.txt
$ git add -A .
$ git commit
 Initial commit.
 3 files changed, 3 insertions(+), 0 deletions(-)
 create mode 100644 a.txt
 create mode 100644 w.txt
 create mode 100644 z.txt
$ vi a.txt z.txt 
2 files to edit
$ git status
# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   a.txt
#   modified:   z.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
$ git branch aardvark
$ git checkout aardvark
M   a.txt
M   z.txt
Switched to branch 'aardvark'
$ git add a.txt 
$ git checkout master
M   a.txt
M   z.txt
Switched to branch 'master'
$ git branch zebra
$ git checkout zebra
M   a.txt
M   z.txt
Switched to branch 'zebra'
$ git add z.txt 
$ git status
# On branch zebra
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   a.txt
#   modified:   z.txt
#
$ git checkout aardvark
M   a.txt
M   z.txt
Switched to branch 'aardvark'
$ git status
# On branch aardvark
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   a.txt
#   modified:   z.txt

この例では、aardvarkブランチとzebraブランチにまったく同じ変更のセットが含まれているように見え、その出力に基づいて、git statusどちらかでコミットを実行すると同じ効果があるように見えます。私は何か間違ったことをしていますか?


2
無料の5つのクライアントで十分であると仮定すると、個人コードにPERFORCEを使用できます。
Logan Capaldo 2010

3
それは私がやっていたことですが、オープンソースであり、オープンソースプロジェクトでも使用されているものに切り替えたいと思います。私はgitとMercurialの両方を検討してきました。勢いが増しているように見えるので、私はgitに傾いています。
ローレンスゴンサルベス2010

1
Gitを最初から学ぶ方がよいでしょう。Gitによって規定されたワークフローは、Perforceによって規定されたワークフローとは大きく異なります。翻訳されたワークフローは扱いにくく、機能を同等にしようとすると理解が混乱します。幸い、Gitコミュニティは、初心者向けに豊富なドキュメントを提供しています。git-scm.com/book
パニック大佐

1
@ColonelPanic私はあなたの主張を理解できますが、そのようなドキュメントの問題は、すべてのPERFORCEユーザーがすでに知っている基本的なことを説明するのに時間が無駄になることです。このようなドキュメントを読むことは、変数とは何かを説明する章を費やす別のプログラミング言語のチュートリアルを読もうとするのと同じくらい面倒です。
ローレンスゴンサルベス2013年

私はを含むいくつかの他のgitのドキュメント、読んでいた、と述べた@ColonelPanic下から上にGitコンピュータ科学者のためのGit実際には非常に有用でした。私は数年前からGitを使用しています(この質問が最初に尋ねられたときの注意)。gitの学習に関する主な問題は、ドキュメントの不足ではなく、命名法の不備、内部の不整合、コマンドの過負荷、および特定の問題であると感じています。実際に使用する準備ができていない未完成の部品。誰かが行ってすべてのがらくたを片付けてくれることを願っていますが、それはそれに慣れている人々を苛立たせます。
ローレンスゴン

回答:


72

私はPERFORCEをあまり使用していないので、これは正確に1:1の翻訳ではないかもしれません。次に、gitやmercurialなどの分散ソース管理システムのワークフローはとにかく異なるため、1:1の変換は実際にはありません(また、あるべきではありません)。とにかく、ここに行きます:

  • 複数の保留中の変更リストを作成します->代わりにブランチを使用します。gitブランチでは、軽くて速く、作成に1秒もかからず、通常はマージに2秒もかかりません。分岐やリベースを頻繁に行うことを恐れないでください。

    git branch new-branch-name
    git checkout new-branch-name
    

    または、すべてを1行で実行します。

    git checkout -b new-branch-name
    
  • すべての保留中のチェンジリストのリストを表示->複数の保​​留中のチェンジリストに相当するのは複数のブランチであるため、ブランチを表示するだけです。

    git branch
    

    リモートブランチも表示する場合:

    git branch -a
    

    マージが成功したらすぐにブランチを削除することをお勧めします。これにより、マージが保留されているブランチと、すでにマージされているブランチを追跡する必要がなくなります。

  • 変更されたすべてのファイルを一覧表示する->特定のブランチで保留中の単一の「変更リスト」の場合、gitにはインデックスまたはキャッシュの概念があります。変更をコミットするには、最初にこのインデックスにファイルを追加する必要があります。これにより、単一の変更を表すファイルのグループを手動で選択したり、無関係なファイルを無視したりできます。このインデックスに追加されているファイル、または追加されていないファイルのステータスを確認するには、次の手順を実行します。

    git status
    
  • 保留中のチェンジリストの差分を参照してください->これには2つの部分があります。最初に、作業ディレクトリとインデックスの違いを確認します。

    git diff
    

    しかし、現在入力している内容と最後のコミットの違いを知りたい場合は、実際には作業ディレクトリ+インデックスとHEADの違いを求めています。

    git diff HEAD
    
  • 特定のファイルについて、送信されたチェンジリストがどの行に影響したかを確認します->これは簡単です。

    git blame filename
    

    または、ウィンドウ環境にいる場合はさらに良いでしょう。

    git gui blame filename
    

    Git guiはファイルの解析に時間がかかります(Cではなくtclで記述されています)が、コミットIDをクリックして過去に「タイムトラベル」する機能など、多くの優れた機能があります。与えられたバグが最終的にどのように解決されるかを知ることができるように、彼らが将来への「タイムトラベル」機能を実装することを望むだけです;-)

  • 特定のファイルについては、ファイルに影響を与えたチェンジリストの説明のリストを参照してください->これも簡単です。

    git log filename
    

    しかし、git logは、これよりもはるかに強力なツールです。実際、私の個人的なスクリプトのほとんどは、リポジトリを読み取るためにgitログから便乗します。manページを読んでください。

  • 保留中の変更リストを送信する->これも簡単です。

    git commit
    

前の質問に対する私の回答を参照して、私の典型的なgitワークフローであるLearningGitを確認してください。私が正しい方向に進んでいるかどうかを知る必要があります

私が概説したワークフローに従うと、変更のグループを明確に確認できるため、gitkのようなツールの方がはるかに価値があることがわかります。


追加の回答:

Gitは非常に柔軟性があり、説明したことを実行する方法はいくつかあります。覚えておくべきことは、作業している機能ごとに常に新しいブランチを開始することです。これは、マスターブランチが変更されていないため、いつでもマスターブランチに戻ってバグ修正を行うことができることを意味します。gitでの作業は、ほとんどの場合、次のように開始する必要があります。

git checkout -b new-feature-a

これで、ファイルa.txtを編集できます。別の機能で同時に作業するには、次のようにします。

git checkout master
git checkout -b new-feature-z

これで、ファイルz.txtを編集できます。a.txtに戻すには:

git checkout new-feature-a

しかし、待ってください。new-feature-zに変更があり、gitではブランチを切り替えることができません。この時点で、2つの選択肢があります。1つ目は最も単純で、現在のブランチにすべての変更をコミットします。

git add .
git commit
git checkout new-feature-a

これが私がお勧めするものです。ただし、実際にコードをコミットする準備ができていない場合は、一時的にコードを隠しておくことができます。

git stash

これで、ブランチnew-feature-aに切り替えることができます。作業していたコードに戻るには、スタッシュをポップするだけです。

git checkout new-feature-z
git stash pop

すべてが完了したら、すべての変更をマスターにマージして戻します。

git merge --no-ff new-feature-a
git merge --no-ff new-feature-z

マージは非常に迅速かつ簡単であるため(競合は非常にまれであり、競合の解決は非常に困難ではないため、簡単です)、すべてにgitのブランチを使用します。

他のソース管理ツール(おそらくMercurialを除く)には見られない、gitでのブランチの一般的な使用法の別の例を次に示します。

開発環境を反映するように構成ファイルを変更し続ける必要がありますか?次に、ブランチを使用します。

git checkout -b dev-config

次に、お気に入りのエディターで構成ファイルを編集してから、変更をコミットします。

git add .
git commit

これで、すべての新しいブランチは、masterではなくdev-configブランチから開始できます。

git checkout dev-config
git checkout -b new-feature-branch

完了したら、インタラクティブなリベースを使用して、dev-configの編集をnew-feature-branchから削除します。

git rebase -i master

不要なコミットを削除して保存します。これで、カスタム構成を編集せずにクリーンなブランチができました。マスターにマージする時間:

git checkout master
git merge --no-ff new-feature-branch
# because master have changed, it's a good idea to rebase dev-config:
git checkout dev-config
git rebase master

git rebase -iすべての変更が同じファイルで発生した場合でも、編集の削除は機能することに注意してください。Gitはファイルの内容ではなく、変更を記憶します*。

*注:実際には、技術的には完全に真実ではありませんが、ユーザーとしてはそのように感じます


より多くの追加の答え:

したがって、あなたのコメントから、結合されたコードがどのように機能するかをテストできるように、2つのブランチを同時に存在させたいように見えます。さて、これはブランチのパワーと柔軟性を説明する良い方法です。

まず、ワークフローにおける安価な分岐と変更可能な履歴の影響について説明します。私がCVSとSVNを使用していたとき、私は常にコミットすることに少し消極的でした。これは、不安定なコードをコミットすると、必然的に他の人の作業コードが台無しになるためです。しかし、gitで私はその恐怖を失いました。これは、Gitでは、マスターにマージするまで他の人が私の変更を取得できないためです。だから今、私は自分が書く5行ごとにコードをコミットしていることに気づきました。コミットするのに完全な先見性は必要ありません。考え方を変える必要があるだけです:commit-to-branch == add-to-changeset、merge-to-master == commit-changeset。

では、例に戻りましょう。これが私がそれをする方法です。ブランチがnew-feature-zあり、でテストしたいとしますnew-feature-a。テストするために新しいブランチを作成するだけです。

# assume we are currently in branch new-feature-z
# branch off this branch for testing
git checkout -b feature-z-and-feature-a
# now temporarily merge new-feature-a
git merge --no-ff new-feature-a

これで、テストできます。feature-zをfeature-aと連携させるために何かを変更する必要がある場合は、そうしてください。その場合、変更を関連するブランチにマージして戻すことができます。git rebase -iマージから無関係な変更を削除するために使用します。

または、git rebaseを使用して、new-feature-zのベースを一時的に変更してnew-feature-aを指すようにすることもできます。

# assume we are currently in branch new-feature-z
git rebase new-feature-a

これで、ブランチ履歴が変更され、new-feature-zがmasterではなくnew-feature-aに基づくようになりました。これで、テストできます。このブランチでコミットされた変更はすべて、ブランチnew-feature-zに属します。new-feature-aを変更する必要がある場合は、それに切り替えてリベースし、新しい変更を取得します。

git checkout new-feature-a
# edit code, add, commit etc..
git checkout new-feature-z
git rebase new-feature-a
# now new-feature-z will contain new changes from new-feature-a

完了したら、マスターにリベースして、new-feature-aから変更を削除します。

# assume we are currently in branch new-feature-z
git rebase master

新しいブランチを開始することを恐れないでください。使い捨てのブランチを開始することを恐れないでください。枝を捨てることを恐れないでください。そして、merge == submitとcommit == add-to-changesetなので、頻繁にコミットすることを恐れないでください。コミットは開発者の究極の元に戻すツールであることを忘れないでください。

ああ、そして別のことですが、gitでは削除されたブランチがまだリポジトリに存在しています。したがって、後で誤って削除したことが役立つことに気付いた場合は、履歴を検索することでいつでも元に戻すことができます。だから、枝を捨てることを恐れないでください。


1
各ブランチには独自の「インデックス」がありますか、それともブランチ間で共有される単一のインデックスがありますか?私の実験は後者を示唆しているようですが、あなたは前者を示唆する「特定のブランチgitにはインデックスまたはキャッシュの概念がある」と言います。
ローレンスゴンサルベス2010

4
それは別のツールです。別のワークフローが必要であり、それには別の考え方と習慣が必要です。gitはあなたが説明したようには機能しません。それは枝であり、他には何もありません。しかし、非常に強力なブランチ操作ツールがあります。ソース管理について何も知らない初心者であり、基本的なチュートリアルを読むことをお勧めします。git-landで再教育しなければならない現在の考え方の「悪い習慣」を考えてみてください。申し訳ありません...
slebetman

1
では、同時に作業したい2つのことがある(そして同じ場所で、コミットされていない変更を相互にテストできる)が、それらを別々にコミットしたい場合、gitで何をしますか?また、コミットを実行する前にコミットメッセージを編集するにはどうすればよいですか?ワークフローが異なることは認めますが、gitと同等のワークフローが何であるかについてはまだおっしゃっていません。これらが悪い習慣であると言うことは、バグを機能として見送ろうとするようなものです。
ローレンスゴンサルベス2010

2
私の更新された答えを読んでください。マージされていないブランチについて考える必要があるときに、コミットされていない変更に関してまだ考えています。
slebetman 2010

2
非常に広範な答え。これはどの時点で無効化する必要がありますか?
Tim Clemons

1

実際のチートシートを作成するのに十分なp4の経験はありませんが、少なくともいくつかの類似点があります。p4の「チェンジセット」はgitの「コミット」です。

ローカルワークスペースへの変更は、で「インデックス」に追加されgit add、インデックスは後ででコミットされgit commitます。したがって、インデックスは、すべての意図と目的のために、保留中の変更リストです。

git diffとで変更を確認しますgit statusgit diff通常、ワークスペースとインデックスのgit diff --cached間の変更が表示されますが、インデックスとリポジトリ(=保留中の変更リスト)の間の変更が表示されます。

詳細については、http://progit.org/book/をお勧めします。あなたは一般的にバージョン管理を知っているので、おそらくそれの多くをざっと読み、git固有の情報を抽出することができます...


1
「p4チェンジセットはgitcommitである」ということに同意しません。それらは最も近いものです、本当ですが、p4チェンジセットは一連のgitコミットにはるかに近いです。p4チェンジセットは機能を表し、gitブランチは機能を表します。
RJFalconer 2012

@RJFalconer Erm 「ブランチ」はPERFORCEのブランチでもありますね。そして、「チェンジセット」は、コミットのように、1つ以上のファイルへの変更のアトミックコレクションです。そうでない場合、コミットに相当するp4は何だと思いますか?
Jakob Borg

原子性の程度が同じではないという理由だけで、p4には同等のものがないと言えます。gitでは、特定のファイルにいくつかの変更を加えてから、それらを異なるコミット(git add -p)でコミットできるため、履歴のリファクタリング/クリーンアップを機能/バグ修正から分離できます。p4でこれを行うとしたら、2つを別々に開発する必要があります。それでも、他の開発者がそれらの間に送信できるため、私のコミットは継続的ではない可能性があります(ディスク上で頻繁に非現実的な複製を伴うプライベートブランチを除く)。
RJFalconer 2012年

免責事項:私はp4を数か月しか使用していませんが、これを実現するいくつかの機能があり、まだ遭遇していない可能性があります。
RJFalconer 2012年

p4チェンジリストとp4ブランチは、論理的にはgitcommitsとgitブランチと同じです。p4シェルフはgitstashに相当します。それらが異なるのは実装(つまり、分散型とクライアントサーバー)であり、その違いにより、複数のステップとかなりの時間がかかるgitチェックアウトと同等のp4が発生します。オーバーヘッドは、通常、git checkoutと同等の処理を行う代わりに、複数のブランチがディスク上にローカルに保存されるようなものです。p4シェルフは、ローカルリポジトリではなくサーバーに保存されます。
Josh Heitzman 2012年

1

私はあなたのように、gitブランチとまったく同じではない「チェンジリスト」の概念がないことに苦しんでいます。

そのチェンジリスト内のファイルのリストを使用してチェンジリストファイルを作成する小さなスクリプトを作成します。

git commit -a @ change_list_contents.txtを呼び出してから「gitcommit」を呼び出すだけで、特定のチェンジリストのみを送信する別のコマンド

お役に立てば幸い、エリアス


はい、私は実際にこのようなことを検討しましたが、この質問をしたとき、私はgitを初めて使用したので、「ネイティブ」ソリューションを知りたいと思いました。今、私が見逃している主なことは、実際にコミットせずにコミットメッセージを処理する機能であることがわかりました。したがって、「保留中のコミットメッセージ」を保持するファイルと、コミットメッセージを書き込むときに自動的に読み取るための魔法を用意することで解決できます。
ローレンスゴンサルベス2012

@LaurenceGonsalves、私が使用するワークフローは、作業に集中している間に不完全なコミットメッセージ(または単に「WIP」)をコミットし、後でリベース中に修正することです。コミットは純粋にローカルであるため、ブランチを使用可能にするまで(リモートなどにプッシュすることにより)、最終的なものである必要はありません。
RJFalconer 2012

1

ワークフローの一部を形成できる、より軽量なgitの代替手段があります。gitステージング領域を使用します。

私はしばしば変更を加えてから、いくつかのコミットとして送信します(たとえば、デバッグステートメントの追加、リファクタリング、実際のバグの修正)。PERFORCEチェンジリストを設定してから変更を加えてから送信するのではなく、変更を加えて送信方法を選択するだけです(オプションでgitステージング領域を使用)。

次のコマンドラインから特定のファイルをコミットできます。

git commit a.txt
git commit z.txt

または、最初にファイルを明示的にステージングします。

git add a.txt
git commit
git add z.txt
git commit

git guiを使用すると、ファイル内から行またはハンクを選択して、ステージング領域でコミットを構築できます。これは、1つのファイルに変更を加えて、別のコミットに入れたい場合に非常に便利です。gitからperforceに移行しましたが、これは私が本当に見逃していることの1つです。

このワークフローで覚えておくべき小さな注意点があります。AとBをファイルに変更し、ファイルをテストしてからAをコミットする場合、そのコミットは(Bとは関係なく)テストされていません。


確かに、gitを使用すると、PERFORCEよりもきめ細かいコミット(つまり、行やハンク)を実行できます。私が(まだ)PERFORCEから見逃しているのは、現在取り組んでいるものの変更の説明(別名コミットメッセージ)を追跡する機能です。たとえば、バグ#12345を修正する場合は、変更リストを作成して、それを実行していることを示します(ただし、送信しないでください)。次に、作業中に、変更の説明を更新して、何をしたかを示します。最後に、完了したら、チェンジリストをコミットします。
ローレンスゴンサルベス2013

gitでは、大まかに同等なのは、これらの小さな(多くの場合機能しない)ビットをdevブランチにコミットし、すべてが正常になったら変更をマージすることです。これはまだ私にははるかに退屈で不格好な感じがします。また、コンパイルすらしないコードをコミットするという考えにはまだ慣れていません。
ローレンスゴンサルベス2013

@LaurenceGonsalvesその間に慣れたら、興味があります。GitからPERFORCEに来ていますが、15分ごとにコミットできず、準備ができたらプッシュできません。
ダミアン2015

0

これはあなたの質問に具体的に答えるものではありませんが、PERFORCEの2ユーザー、5ワークスペースバージョンがPERFORCEのWebサイトから無料でダウンロードして使用できることを知っているかどうかはわかりません。

このようにして、必要に応じて、自宅で個人的なプロジェクトにPERFORCEを使用できます。厄介なのは5つのワークスペースで、少し制限がありますが、PERFORCEを家庭で使用できるのは非常に素晴らしいことです。


2
それは私がやっていたことですが、オープンソースであり、オープンソースプロジェクトでも使用されているものに切り替えたいと思います。
ローレンスゴンサルベス2010

0

Perforceとgitの両方をかなり広範囲に使用してきたので、gitを使用してPerforceチェンジリストの近くに到達する方法は1つしかありません。

最初に理解する必要があるのは、この機能をgitで正しく実装して、完全なクルージではないようにすることです。たとえば、ブランチに靴べらを付けようとすると、次の変更が必要になります。gitでは、1つのブランチに複数のステージング領域が必要になります。 。

PERFORCEチェンジリストは、gitに同等のものがないワークフローを許可します。次のワークフローを検討してください。

Check out a branch
Modify file A and add it to changelist 1
Modify file B and add it to changelist 2

Gitの中で、この使用して枝を実行しようとした場合、あなたは二つのブランチ、ファイルへの変更を持っているのいずれかで羽目になるだろうA、他のファイルに変更があるB、しかし、あなたは両方のファイルへの変更を見ることができる場所がないABでの同時に。

私が見ることができる最も近い近似は、ファイル全体を選択または拒否するgit add . -pために、'a'および'd'サブコマンドを使用してから使用することです。ただし、これはまったく同じではありません。ここでの違いは、2つのシステムの一般的な手口の根本的な違いに起因します。

Git(およびSubversion、この議論では重要ではありません)を使用すると、事前にこれについて誰にも知らせずにファイルを変更できます。ファイルを変更するだけで、変更をコミットするときにgitにすべてを整理させることができます。PERFORCEでは、変更を許可する前にファイルをアクティブにチェックアウトする必要があります。そのため、チェンジリストが存在する必要があります。本質的に、PERFORCEでは、ファイルを変更する前に、インデックスにファイルを追加する必要があります。したがって、PERFORCEで複数のチェンジリストが必要であり、gitに同等のものがない理由もあります。 それは単にそれらを必要としません。


0

Git 2.27(2020年第2四半期)では、 " git p4"は4つの新しいフックと、--no-verifyそれらをバイパスする" "オプション(および既存の " p4-pre-submit"フック)を学習しました。

参照1ec4a0aコミット38ecf75コミットcd1e0dcコミット(2020年2月14日に)、そして4935c45コミットaa8b766コミット9f59ca4コミット6b602a2コミットにより(2020年2月11日)をベンキーン(seraphire
(合併によりJunio C浜野- gitster-5f2ec21コミット、2020年4月22日)を

git-p4:p4送信フックを追加します

サインオフ:ベンキーン

gitコマンド " commit"は、commitコマンドの動作の変更をサポートするいくつかのフックをサポートしています。

git-p4.pyプログラムは、「1つの既存のフックを持っていますp4-pre-submit」。

このコマンドは、プロセスの早い段階で発生します。

P4チェンジリストテキストをプログラムで変更するためのプロセスフローにはフックはありません。

git-p4.py送信オプションに3つの新しいフックを追加します。

新しいフックは次のとおりです。

  • p4-prepare-changelist-チェンジリストファイルが作成された後、このフックを実行します。オプションが設定
    されていてもフックは実行され--prepare-p4-onlyます。
    このフックは、--no-verifyの既存の動作に合わせてオプションを無視しますgit commit

  • p4-changelist-ユーザーが変更リストを編集した後で、このフックを実行します。
    ユーザーが--prepare-p4-onlyオプションを選択した場合は、このフックを実行しないでください。
    このフックは--no-verify、の規則に従って、を尊重しますgit commit

  • p4-post-changelist-P4送信プロセスが正常に完了した後、このフックを実行します。
    このフックはパラメーターを受け取らず、--no-verifyオプションに関係なく実行されます。

戻り値はチェックされません。

新しいフックの呼び出し:p4-prepare-changelistp4-changelist、およびp4-post-changelistすべてのtry-finallyブロック内で呼び出す必要があります。


Git 2.28(2020年第3四半期)より前は、「--prepare-p4-only」オプションは1つのチェンジセットを再生した後に停止するはずでしたが、(誤って?)続行しました。

Ben Keene()によるcommit 2dfdd70(2020年5月12日)を参照してください。(合併によりJunio C浜野- -7a8fec9コミット2020年6月2日)seraphire
gitster

git-p4.py--prepare-p4-only複数のコミットでエラーを修正

サインオフ:ベンキーン

このオプションを使用git p4 submitする--prepare-p4-only場合、プログラムは単一のp4チェンジリストを準備し、さらにコミットが保留中であることをユーザーに通知してから、処理を停止する必要があります。

p4-changelistフック機能によってバグが導入され、プログラムは保留中のすべてのチェンジリストを同時に処理しようとし続けます。

コミットの適用が成功すると関数applyCommitが戻りTrue、プログラムは続行されます。
ただし、オプションのフラグ--prepare-p4-onlyが設定されている場合、プログラムは最初のアプリケーションの後で停止する必要があります。

P4Submitのrunメソッドのロジックを変更して--prepare-p4-onlyapplyCommitメソッドが正常に完了した後にフラグを確認します。

複数のコミットがP4への送信を保留している場合、メソッドはP4チェンジリストを適切に準備しますが、それでも終了コード1でアプリケーションを終了します。

現在のドキュメントには、終了コードがこの状態でどうあるべきかを定義していません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.