git-p4
これを書いている時点では、Perforce clientspec から追加のパスを直接インポートする方法を見つけることができませんでした。しかし、私は手動でそれを行う方法を考案し、それをgit-p4
尊重していると信じています.
免責事項:以下の手順によって発生する可能性のある損害について、私は一切の責任を負いません。.git
最初にツリーをバックアップすることをお勧めします。
アイデア
おっしゃるとおり、Perforce clientspec にパスを追加してgit p4 rebase
最初に実行するだけでは何も起こりません。git p4 rebase
ただし、 Perforceで変更された後、新しいパスがgit-p4
のdepot-paths
リスト内にある場合、そのパスからファイルが追加されることに気付きました。(depot-paths
は に提供されるデポ パスの初期リストですgit p4 clone
。) したがって、次のものが必要です。
- 新しいパスの最初のコピーを Git リポジトリに取得します。
- その
git-p4
最初のコピー自体を追加したと信じ込ませるため。
- リスト
git-p4
に新しいパスを含めるには。depot-paths
したがって、Perforce からファイルのコピーを同期し、Perforce から既にインポートされているファイルと整合性があることを確認してから、Git リポジトリに明示的に追加できます。
git-p4
明らかに、そのdepot-paths
リストや最後にインポートされた Perforce の変更番号は、Git コミット メッセージ以外の場所には保存されないためgit-p4
、独自のコミット メッセージでメタデータを複製することでだますことができます。
最後に、新しいコミットを指すようにp4/master
(およびp4/HEAD
のエイリアスである) を移動して、今後のコマンドがそのコミットを Perforce からインポートされたものとして扱うようにすることができます。p4/master
git p4 rebase
一歩一歩
に対応するコミットを確認してくださいp4/master
。ステージングまたはステージングされていない変更がないことを確認してください。もしそうなら、それらを隠してください。
で使用される Perforce clientspec に新しいパスを追加しgit-p4
ます。以下の手順では、これを と呼びます//depot/new/path/
。
実行git log
して、最後にインポートした Perforce の変更からのコミット メッセージを確認します。次のような行があります。
[git-p4: depot-paths = "//depot/tree/": change = 12345]
Perforce 変更番号をメモします。
Perforce クライアントで、追加したパスをその変更番号に同期します。例えば:p4 sync //depot/new/path/...@12345
新しく同期されたファイルを Perforce クライアントから Git リポジトリの対応する場所に再帰的にコピーします。(シンボリックリンクがある場合は、ここで注意が必要かもしれません。)
git add
Git リポジトリの新しいパスで実行します。
実行しますgit commit
。ほとんどの場合、コミット メッセージで必要なことを何でも言えます (例: "CLN 12345 からの //depot/new/path/ の初期インポート")。ただし、メッセージの最後に、git-p4
前に確認したメタデータ行をコピーする必要があります。
[git-p4: depot-paths = "//depot/tree/": change = 12345]
//depot/new/path/
が のサブディレクトリでない場合は//depot/tree
、修正depot-paths
して新しいパスを追加する必要があります。
[git-p4: depot-paths = "//depot/new/path/,//depot/tree/": change = 12345]
depot-paths
リストはASCII 値でソートする必要があり//depot/foo-bar/
ます (つまり、 の前に置く必要があります//depot/foo/bar/
)。
もう一度実行git log
します。コミット メッセージの行が、インポートされた Perforce の変更の行のようになっていることを確認しgit-p4
ます。コミットの SHA1 ハッシュを書き留めます。
Git リポジトリのルートに移動します。編集し.git/refs/remotes/p4/master
ます。リストされている古い SHA1 ハッシュを削除し、コミットの SHA1 ハッシュに置き換えます。(.git/refs/remotes/p4/master
存在しない場合は.git/packed-refs
、該当する行を確認して更新してください。)
これで、変更 12345 からのファイルのコピーが Git リポジトリに含まれるよう//depot/new/path/
になり、今後の Perforce の変更からそれらのファイルへの変更が反映されるはずです。
その他の注意事項
明らかに、新しいパスは、それらのファイルをインポートしたコミット後にのみ Git リポジトリに存在するため、git bisect
その境界にまたがってそれらのファイルが含まれる場合は役に立ちません。
変更されたファイルが Perforce clientspec に含まれている (およびgit-p4
の内に含まれているdepot-paths
) 場合、変更されたファイルは自動的に追加されるため、場合によっては、この作業をすべて回避できる可能性があります。たとえば、誰かが Perforce デポに新しいディレクトリを追加しようとしていて、そのディレクトリがdepot-paths
clientspec ではなく自分のディレクトリに既に含まれていることが事前にわかっている場合は、それを先制的に Perforce clientspec に追加することができます。実際にPerforceに追加された後、その新しいパスを自動的に取得できるはずです。
または、新しいパスを Perforce clientspec に追加してから、そのパス内のすべてのファイルに触れる Perforce の変更を送信することもできます。ただし、他の人に迷惑をかける可能性があるため、これを行うことはお勧めしません(そして、他の人がそれを行ったとしたら想像してみてください)。完全を期すためにのみ言及します。