Perforce ツリーで追跡されていないファイルを見つけるにはどうすればよいですか?(svnステータスの類似物)
-
08-06-2019 - |
質問
追跡されていないスクリプトやエイリアスを持っている人は誰でも (実際には:追加されていない) ファイルが Perforce ツリーに含まれていますか?
編集:P4V が 2009 年 1 月のリリースでこれのサポートを追加したように見えるため、この回答について受け入れられた回答を更新しました。
解決
編集: 使ってください p4 status
今。もうフープを飛び越える必要はありません。@ColonelPanic を参照してください 答え.
2009 年 1 月バージョンの P4V では、ワークスペース ツリー内の任意のフォルダーを右クリックし、[オフライン作業の調整...] をクリックできます。
これにより、少し処理が行われ、チェックアウトされていないがデポのバージョンと異なるファイル、またはまったくチェックインされていないファイルの分割ツリー ビューが表示されます。他にもいくつかのカテゴリが表示される場合があります。
このビューでファイルを右クリックすると、ファイルをチェックアウトしたり、追加したり、元に戻したりすることができます。
これは非常に便利なツールで、何度か私のお尻を救ってくれました。
編集:ああ、この質問は特にスクリプトに関するものですが、念のためこの回答をここに残しておきます。
他のヒント
Linux の場合、または Windows に gnu-tools がインストールされている場合:
find . -type f -print0 | xargs -0 p4 fstat >/dev/null
これにより、不明なファイルごとにエラー メッセージが表示されます。その出力をキャプチャしたい場合は、次のようにします。
find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
Unix の場合:
find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'
これにより、クライアントまたは Perforce デポに追加されていないファイルのリストが出力されます。使ったことがある ! -name '*~'
~ で終わるファイルを除外します。
ああ、Perforce の古典の 1 つです :) はい、これをデフォルトのコマンドに組み込む簡単な方法がまだないのは本当に残念です。
最も簡単な方法は、コマンドを実行してクライアントのルートの下にあるすべてのファイルを検索し、それらをデポに追加してみることです。最終的にはすべての新しいファイルの変更リストが作成され、既存のファイルは無視されます。
例:dir /s /b /ad | P4 -X-追加
(「検索」を使用します。nix コマンドラインからの -type f -print')。
物理リスト (コンソールまたはファイル内) が必要な場合は、diff の結果をパイプすることができます (変更リストにも追加したい場合は追加します)。
これを P4Win 内で実行している場合は、$r を使用して現在のワークスペースのクライアント ルートを置き換えることができます。
の類似品はありますか
svn status
またはgit status
?
はい、でも.
Perforce バージョン 2012.1 の時点では、次のコマンドがあります。 p4 status
そしてP4Vでは「オフライン作業を調整する」。ただし、どちらも非常に遅いです。無関係なファイルを除外するには、 p4ignore.txt
ファイルごと https://stackoverflow.com/a/13126496/284795
受け入れられた回答と他の回答には重大な問題があると思われるため、回答を追加する必要があると感じています。彼らは、読み取り専用のクエリ コマンドと変更を加えるコマンドの違いを理解していません。
この回答が功績になるとは期待していませんが、他の人が、受け入れられているが私見では間違っている回答に従って時間の無駄をしたり間違いを犯したりするのを避けるのに役立つことを願っています。
---+ 概要
おそらく、perforce ワークスペース内のすべての追跡されていないファイルを見つける最も便利な方法は次のとおりです。 p4 reconcile -na
.
-a
「リポジトリにないファイルをください、つまりそれを追加する必要があります。」
-n
「何も変更しない」と言います - つまり予行演習。(メッセージには「追加用にオープンされました」と表示される場合がありますが、精神的には「-n でなければ追加用にオープンされる」と解釈する必要があります)
おそらく、オフライン中に行われたすべてのローカル変更を検索する最も便利な方法です。追加する必要があるファイルだけでなく、削除する必要があるファイルや、編集用に開かずに変更されたファイルも検索できます。 p4 edit
, 、 は p4 reconcile -n
.
いくつかの回答ではスクリプトが提供されており、多くの場合、 p4 fstat
. 。これらのスクリプトすべてを検証したわけではありませんが、私はよく似たようなスクリプトを使用して、次のような perforce コマンドの欠陥を補っています。 p4 reconcile -n
- 例:Perforce デポ パスやワークスペース パスではなく、ローカル パスが必要なことがよくあります。
---+ 警告
p4 status
他のバージョン管理システムのステータス コマンドに相当するものではありません。
p4 status
は読み取り専用クエリではありません。 p4 status
実際に同じ種類の変化が見つかります p4 reconcile
実行し、リポジトリに追加します。 p4 status
はないようです -n
のようなドライランオプション p4 reconcile
そうです。
もし、するなら p4 status
, ファイルを見て「ああ、それらは必要ない」と思ったら、次のことを行う必要があります。 p4 revert
同じワークスペースで編集を続けたい場合は、これらを使用します。あるいは、その変化は、 p4 status
変更セットに追加されたものは、次回チェックインされます。
使用する理由はほとんどまたはまったくないようです p4 status
それよりも p4 reconcile -n
, ただし、ローカル ワークスペースとデポのパス名の一部の詳細は除きます。
読み取り専用ではないコマンドに「status」を選択した人は、英語やその他のバージョン管理ツールの操作能力が限られていたとしか想像できません。
---+ P4V
GUI
GUIの場合 p4v
, 、 reconcile コマンドは、追加、削除、または編集のために開く必要がある可能性のあるローカルの変更を検索します。幸いなことに、デフォルトでは変更リストにそれらは追加されません。ただし、変更をコミットしたくない場合は、検査後に調整ウィンドウを閉じるように注意する必要があるかもしれません。
リポジトリ (Windows の場合) とは異なるワークスペース内のファイルをバックアップするツールで次のものを使用します。埋め込まれた空白、星、パーセント、ハッシュマークなど、Perforce があまり好まないいくつかの奇妙なケースを処理します。
dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL:
"ディレクトリ /S /B /A-D" は、このフォルダー以下のすべてのファイルをリストします (/S) 「ベア」形式 (/B) ディレクトリ (/広告)。」セド" 危険なキャラクターを危険なキャラクターに変更します "%xx" フォーム (HTML 形式)、および "p4は持っています" コマンドはこのリストをチェックします ("-バツ-") サーバーが実際にリポジトリ内にあるファイルに関するあらゆるものを破棄することに対して ("1>NUL:")。結果は次のような行の束になります。
Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.
さあ!
クイックアンドダーティ:p4v で、問題のフォルダーを右クリックし、そのフォルダーの下にあるすべてのファイルを新しい変更リストに追加します。変更リストには、現在デポの一部ではないすべてのファイルが含まれるようになります。
次のコマンドはステータスのような出力を生成しますが、どれも完全に同等ではありません。 svn status
または git status
, 、各ファイルのステータスの 1 行の概要が表示されます。
p4 status
p4 opened
p4 diff -ds
コメントできるほどの評判ポイントはありませんが、Ross のソリューションには追加可能なファイルもリストされています。おそらくそうだと思います ない 彼の答えを使ってワークスペースをきれいにしたいと考えています。
以下の用途 p4 fstat
(マーク・ハリソンに感謝)代わりに p4 have
, 、デポにないファイルをリストします。 そして 追加できる状態ではありません。
dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp"
===ジャック
迅速な方法ですが、あまり本格的ではありません。コードベースが新しいファイルを追加したり、ビューを頻繁に変更したりしない場合は、チェックアウトからローカルの「git」リポジトリを作成できます。クリーンな perforce sync、git init から、すべてのファイルをローカルに追加してコミットします。Git ステータスは高速で、以前にコミットされていないファイルが表示されます。
の p4 fstat
コマンドを使用すると、ワークスペースにファイルが存在するかどうかをテストできます。 find
次の Perl の例のように、チェックするファイルを見つけます。
// throw the output of p4 fstat to a 'output file'
// find:
// -type f :- only look at files,
// -print0 :- terminate strings with \0s to support filenames with spaces
// xargs:
// Groups its input into command lines,
// -0 :- read input strings terminated with \0s
// p4:
// fstat :- fetch workspace stat on files
my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";
// read output file
open F1, $outputFile or die "$!\n";
// iterate over all the lines in F1
while (<F1>) {
// remove trailing whitespace
chomp $_;
// grep lines which has 'no such file' or 'not in client'
if($_ =~ m/no such file/ || $_ =~ m/not in client/){
// Remove the content after '-'
$_=~ s/-\s.*//g;
// below line is optional. Check ur output file for more clarity.
$_=~ s/^.\///g;
print "$_\n";
}
}
close F1;
または、使用できます p4 reconcile -n -m ...
「削除のために開かれている」場合は、ワークスペースから削除されています。上記のコマンドはプレビュー モードで実行されていることに注意してください (-n
).
Linux、Mac、または Windows のいずれかで動作するものが必要でした。そこで、そのための Python スクリプトを書きました。基本的な考え方は、ファイルを反復処理して実行することです。 p4 fstat
それぞれの。(もちろん依存関係やtmpフォルダーは無視します)
ここで見つけることができます: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9
P4V では、[表示] メニュー項目で [フォルダ内のファイル] を選択すると、右側のペインに新しいタブが表示されます。タブの右端に小さなアイコンがあり、2 つのアイコンを持つ「フォルダー内のファイル」というウィンドウが表示されます。漏斗のように見える左側のアイコンを選択すると、いくつかのオプションが表示されます。「デポにないアイテムを表示」を選択すると、フォルダー内のすべてのファイルが表示されます。次に、追加したいファイルを右クリックし、「追加用にマーク」を選択します。「保留中」タブでそれが存在することを確認できます。通常どおり(Ctrl+S)送信してください。