Wie finde ich nicht verfolgte Dateien in einem Perforce-Baum? (analog zum svn status)

87

Hat jemand ein Skript oder einen Alias, um nicht verfolgte (wirklich: nicht hinzugefügte) Dateien in einem Perforce-Baum zu finden?

BEARBEITEN: Ich habe die akzeptierte Antwort auf diese Frage aktualisiert, da P4V in der Version vom Januar 2009 anscheinend Unterstützung dafür hinzugefügt hat.

David Joyner
quelle
11
Ich kann mir nicht vorstellen, wie es dazu kommt, dass dem am häufigsten verwendeten SCM-Tool für Unternehmen diese Funktionalität fehlt. Wahrscheinlich verwenden alle ihre Entwickler nur die GUI.
Sorin
3
Oh, weil du laut geschrien hast !!!! Das Akzeptierte p4 statusFINDET nicht nur nicht verfolgte Dateien, sondern BEGINNT tatsächlich, sie zu verfolgen. Das heißt, es p4 statushandelt sich nicht um eine schreibgeschützte Abfrage, wie man anhand des Namens vermuten würde, sondern um einen Befehl, der Änderungen vornimmt - nicht die Arbeitsbereichsdateien. Dies ist NICHT das, was ein Statusbefehl tun sollte, und NICHT das, was er svn statustut. Das nächste, was ich finden kann, svn statusist p4 reconcile -na- -a, um "Dateien, die hinzugefügt werden sollten" zu sagen, -n, um zu sagen, "ändere eigentlich nichts". /// Ich habe ursprünglich etwas viel Stärkeres gesagt.
Krazy Glew
1
Ich habe stackoverflow.com/questions/9642531/… wiederbelebt , das fälschlicherweise als Duplikat von stackoverflow.com/questions/9272/… markiert wurde , als neue Frage (Was entspricht dem Befehl p4 etwas wie git / hg / bzr / svn? Status? (Hinweis: nicht p4 status) , und antwortete es selbst. Besser begrüßt
Krazy Glew
Beide p4 reconcileund p4 statussind höllisch langsam, während git statusdie Ausführung in 1-3 Sekunden beendet ist.
Zwcloud

Antworten:

81

EDIT: Bitte p4 statusjetzt verwenden. Es ist nicht mehr nötig, durch Reifen zu springen. Siehe die Antwort von @ ColonelPanic .

In der P4V-Version vom Januar 2009 können Sie mit der rechten Maustaste auf einen beliebigen Ordner in Ihrem Arbeitsbereichsbaum klicken und auf "Offline-Arbeit abgleichen ..." klicken.

Dies führt eine kleine Verarbeitung durch und zeigt dann eine Split-Tree-Ansicht von Dateien an, die nicht ausgecheckt sind, aber Unterschiede zur Depotversion aufweisen oder überhaupt nicht eingecheckt sind. Es kann sogar einige andere Kategorien geben, die angesprochen werden.

Sie können in dieser Ansicht mit der rechten Maustaste auf Dateien klicken und diese auschecken, hinzufügen oder sogar zurücksetzen.

Es ist ein sehr praktisches Werkzeug, das mir ein paar Mal den Arsch gerettet hat.

EDIT: ah die Frage speziell zu Skripten gestellt, aber ich werde diese Antwort hier für alle Fälle belassen.

Tenpn
quelle
In dieser Frage wurde eine Powershell-Lösung hinzugefügt: stackoverflow.com/questions/3217152/…
Tenpn
Unterscheidet dies jede einzelne Datei von der Version im Repo? Ich habe ein großes Repo und eine langsame Verbindung (wenn ich von zu Hause aus arbeite). Das könnte ewig dauern!
GDW2
Ich denke nicht, dass es ein voller Unterschied ist, aber es ist nicht schnell.
Tenpn
10
Oh, weil du laut geschrien hast !!!! p4 statusFINDET nicht nur nicht verfolgte Dateien, sondern beginnt tatsächlich damit, sie zu verfolgen. Das heißt, es p4 statushandelt sich nicht um eine schreibgeschützte Abfrage, wie man anhand des Namens vermuten würde, sondern um einen Befehl, der Änderungen vornimmt - nicht die Arbeitsbereichsdateien. Dies ist NICHT das, was ein Statusbefehl tun sollte, und NICHT das, was er svn statustut. Das nächste, was ich finden kann, svn statusist p4 reconcile -na- -a, um "Dateien, die hinzugefügt werden sollten" zu sagen, -n, um zu sagen, "ändere eigentlich nichts". /// Ich habe ursprünglich etwas viel Stärkeres gesagt.
Krazy Glew
1
p4 statusist im Grunde ein Synonym für p4 reconcile -n. Vielleicht bist du gelaufen, p4 status -Awas ein Synonym für ist p4 reconcile?
Samwise
50

Unter Linux oder wenn Sie Gnu-Tools unter Windows installiert haben:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null

Dies zeigt eine Fehlermeldung für jede nicht berücksichtigte Datei an. Wenn Sie diese Ausgabe erfassen möchten:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
Mark Harrison
quelle
1
Wenn Sie stderr nach stdout umleiten, können Sie zusätzliche Filter- oder andere Vorgänge ausführen. So zeigen Sie beispielsweise eine scrollbare Liste von Java-Dateien an: find. -Typ f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | weniger
Jon Nadal
2
Dies dauert auf meinem 60K-Dateien-Arbeitsbereich wahnsinnig lange. Ich habe ein Python-Skript geschrieben, das den gleichen Job in weniger als 10 Sekunden erledigt: p5 . Es unterstützt .p4ignoreund kann auch nicht verfolgte / geänderte / gelöschte Dateien in der Vorschau anzeigen und automatisch bearbeiten.
Hamstergen
@hamstergene, sehr schön!
Mark Harrison
Schrieb ein kleines Skript , das genau das tut, wenn jemand interessiert ist (einschließlich dir-Argument, max-Tiefenargument und Ausgabe an stdout).
Arnon Zilca
Vielen Dank; Ich fand das nützlich! Beachten Sie, dass dies keine symlinks ( find . -type l) behandelt und eine irreführende Ausgabe für P4-Dateien liefert, die zwangsweise hinzugefügt wurden, weil sie die Zeichen @oder enthalten %. Solche Dateien sind jedoch in der Minderheit, sodass eine manuelle Überprüfung dieser Randfälle in den meisten Fällen funktioniert.
CJBS
19

Unter Unix:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'

Dadurch wird eine Liste der Dateien ausgedruckt, die nicht in Ihrem Client oder im Perforce-Depot hinzugefügt wurden. Ich habe ! -name '*~'Dateien ausgeschlossen, die mit ~ enden.

ahu
quelle
12

Ahh, einer der Perforce-Klassiker :) Ja, es ist wirklich schade, dass es NOCH keinen einfachen Weg gibt, dies in die Standardbefehle zu integrieren.

Am einfachsten ist es, einen Befehl auszuführen, um alle Dateien unter dem Stammverzeichnis Ihres Clients zu finden, und dann zu versuchen, sie dem Depot hinzuzufügen. Am Ende erhalten Sie eine Änderungsliste aller neuen Dateien, und vorhandene Dateien werden ignoriert.

ZB dir / s / b / AD | p4 -x - hinzufügen

(Verwenden Sie 'find. -type f -print' in einer nix-Befehlszeile.)

Wenn Sie eine physische Liste (in der Konsole oder Datei) möchten, können Sie die Ergebnisse eines Diff weiterleiten (oder hinzufügen, wenn Sie sie auch in einer Änderungsliste haben möchten).

Wenn Sie dies in P4Win ausführen, können Sie $ r verwenden, um das Client-Stammverzeichnis des aktuellen Arbeitsbereichs zu ersetzen.

Andrew Grant
quelle
11

Gibt es ein Analogon von svn statusoder git status?

Ja, ABER .

Ab Perforce Version 2012.1 gibt es den Befehl p4 statusund in P4V 'Offline-Arbeit abgleichen'. Sie sind jedoch beide sehr langsam. Um irrelevante Dateien auszuschließen, müssen Sie eine p4ignore.txtDatei unter https://stackoverflow.com/a/13126496/284795 schreiben

Oberst Panik
quelle
p4 statusSeit der Veröffentlichung von 2012.1 wurden mehrere Leistungsverbesserungen vorgenommen . Wenn Sie sich aus p4 statusLeistungsgründen ferngehalten haben , lohnt es sich möglicherweise, es erneut zu testen, um zu sehen, wie es sich jetzt verhält.
Bryan Pendleton
7

Ich fühle mich gezwungen, eine Antwort hinzuzufügen, da die akzeptierte Antwort und einige der anderen meiner Meinung nach ein erhebliches Problem darstellen: Sie verstehen den Unterschied zwischen einem schreibgeschützten Abfragebefehl und einem Befehl, der Änderungen vornimmt, nicht.

Ich erwarte keine Anerkennung für diese Antwort, aber ich hoffe, dass sie anderen hilft, Zeitverschwendung und Fehler zu vermeiden, indem sie der akzeptierten, aber meiner Meinung nach falschen Antwort folgt.

--- + KURZ

Der wahrscheinlich bequemste Weg, alle nicht verfolgten Dateien in einem Perforce-Arbeitsbereich zu finden, ist p4 reconcile -na.

-a sagt "gib mir Dateien, die nicht im Repository sind, dh die hinzugefügt werden sollten".

-nsagt "keine Änderungen vornehmen" - dh ein Trockenlauf. (Obwohl in den Nachrichten möglicherweise "Zum Hinzufügen geöffnet" steht, müssen Sie dies mental als "Zum Hinzufügen geöffnet, wenn nicht -n" interpretieren.)

Wahrscheinlich der bequemste Weg , alle lokalen Änderungen zu finden , während offline - nicht nur Dateien , die müssen möglicherweise hinzugefügt werden, sondern auch Dateien dass Möglicherweise müssen gelöscht werden, oder die geändert wurden , ohne den Umweg über zur Bearbeitung geöffnet wird p4 edit, istp4 reconcile -n .

Mehrere Antworten lieferten Skripte, oft mit p4 fstat. Obwohl ich nicht alle diese Skripte überprüft habe, verwende ich häufig ähnliche Skripte, um die Mängel von Perforce-Befehlen auszugleichen, z p4 reconcile -n.

--- + WARNUNG

p4 status ist NICHT das Gegenstück zu den Statusbefehlen auf anderen Versionskontrollsystemen.

p4 statusist KEINE schreibgeschützte Abfrage. p4 statusfindet tatsächlich die gleichen Änderungen wie p4 reconcilediese und fügt sie dem Repository hinzu. p4 statusscheint keine -nTrockenlaufoption wie p4 reconcilediese zu haben.

Wenn Sie dies tun p4 status, schauen Sie sich die Dateien an und denken Sie "Oh, ich brauche diese nicht". Dann müssen Sie p4 revertsie verwenden, wenn Sie die Bearbeitung im selben Arbeitsbereich fortsetzen möchten. p4 statusAndernfalls werden die Änderungen, die Ihrem Änderungssatz hinzugefügt wurden, beim nächsten Mal überprüft.

Es scheint wenig oder keinen Grund zu geben, p4 statusanstatt p4 reconcile -n, außer einigen Details des lokalen Arbeitsbereichs gegenüber dem Depot-Pfadnamen.

Ich kann mir nur vorstellen, dass jeder, der 'Status' für einen nicht schreibgeschützten Befehl gewählt hat, die englische Sprache und andere Tools zur Versionskontrolle nur eingeschränkt beherrscht.

--- + P4V GUI

In der GUI p4vfindet der Befehl "Reconcile" lokale Änderungen, die möglicherweise hinzugefügt, gelöscht oder zum Bearbeiten geöffnet werden müssen. Glücklicherweise werden sie standardmäßig nicht zu einer Änderungsliste hinzugefügt. Möglicherweise möchten Sie jedoch trotzdem darauf achten, das Abstimmungsfenster nach der Überprüfung zu schließen, wenn Sie die Änderungen nicht festschreiben möchten.

Krazy Glew
quelle
Der p4-Status scheint keine Dateien hinzuzufügen. es scheint wie zu funktionieren und ist als 'synchronisieren -n' dokumentiert. Bist du sicher, dass es die Dinge ändert?
kdubs
4

In meinem Tool verwende ich Folgendes, um alle Dateien im Arbeitsbereich zu sichern, die sich vom Repository unterscheiden (für Windows). Es behandelt einige seltsame Fälle, die Perforce nicht besonders mag, wie eingebettete Leerzeichen, Sterne, Prozente und Hashmarken:

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:

" dir / S / B / AD " listet alle Dateien in oder unter diesem Ordner ( / S ) im "nackten" Format ( / B ) mit Ausnahme der Verzeichnisse (/ AD ) auf. Das " sed " ändert gefährliche Zeichen in ihre " % xx " -Form (a la HTML), und der Befehl " p4 have " überprüft diese Liste (" -x- ") anhand des Servers und verwirft alles, was sich tatsächlich im Repository befindet (" 1> NUL: "). Das Ergebnis ist eine Reihe von Zeilen wie:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.

Et voilà!

Ross Patterson
quelle
Dies ist eine großartige Lösung und funktioniert immer noch mit P4 Version 2015.1
Rian Sanderson
sehr schnell! find / xargs hat nicht genügend Speicher und ist langsam. Beim Hinzufügen zur .bat-Datei auf% verdoppeln.
Kevinf
4

Alternativ können Sie in P4Win die Option "Lokale Dateien nicht im Depot" im linken Ansichtsfenster verwenden.

Ich verwende P4V nicht viel, aber ich denke, das Äquivalent ist, "Lokale Arbeitsbereichsdateien ausblenden" in der Filter-Dropdown-Liste der Registerkarte "Arbeitsbereichsansicht" auszuwählen

In P4V 2015.1 finden Sie diese Optionen unter der Filterschaltfläche wie folgt: Geben Sie hier die Bildbeschreibung ein

Greg Whitfield
quelle
Dies zeigt nur Dateien unter dem aktuellen Verzeichnis, leider :(
JP P.
2

Quick 'n Dirty: Klicken Sie in p4v mit der rechten Maustaste auf den betreffenden Ordner und fügen Sie alle Dateien darunter einer neuen Änderungsliste hinzu. Die Änderungsliste enthält jetzt alle Dateien, die derzeit nicht Teil des Depots sind.

gdw2
quelle
1

Die folgenden Befehle erzeugen eine statusähnliche Ausgabe, aber keine entspricht svn statusoder git statusgibt eine einzeilige Zusammenfassung des Status jeder Datei:

  • p4 status
  • p4 opened
  • p4 diff -ds
Rhubbarb
quelle
0

Ich habe nicht genügend Reputationspunkte, um Kommentare abzugeben, aber die Lösung von Ross listet auch Dateien auf, die zum Hinzufügen geöffnet sind. Sie wahrscheinlich nicht möchten seine Antwort verwenden, um Ihren Arbeitsbereich zu bereinigen.

Im Folgenden werden p4 fstatanstelle von (danke Mark Harrison) p4 havedie Dateien verwendet und aufgelistet, die sich nicht im Depot befinden und nicht zum Hinzufügen geöffnet sind.

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"

=== Jac

Jac Goudsmit
quelle
0

Schnelle Methode, aber wenig orthodox. Wenn die Codebasis nicht zu oft neue Dateien hinzufügt / die Ansicht ändert, können Sie aus Ihrer Kasse ein lokales 'Git'-Repository erstellen. Bei einer sauberen Perforce-Synchronisierung können Sie git init alle Dateien lokal hinzufügen und festschreiben. Der Git-Status ist schnell und zeigt Dateien an, die zuvor nicht festgeschrieben wurden.

Kevinf
quelle
0

Mit dem p4 fstatBefehl können Sie testen, ob eine Datei im Arbeitsbereich vorhanden ist, und findwie im folgenden Perl-Beispiel nach zu überprüfenden Dateien suchen:

// 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;

Oder Sie können verwenden p4 reconcile -n -m ...

Wenn es zum Löschen geöffnet ist, wurde es aus dem Arbeitsbereich entfernt. Beachten Sie, dass der obige Befehl im Vorschaumodus ( -n) ausgeführt wird.

war ein
quelle
1
Bitte werfen Sie nicht nur Code ohne Erklärung als Antwort, sondern fügen Sie eine Erklärung hinzu, damit das OP den Code besser versteht und etwas lernt. :)
Markus
0

Ich brauchte etwas, das entweder unter Linux, Mac oder Windows funktioniert. Also habe ich ein Python-Skript dafür geschrieben. Die Grundidee besteht darin, Dateien zu durchlaufen und auszuführenp4 fstat . (natürlich Abhängigkeiten und tmp-Ordner ignorieren)

Sie finden es hier: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

givanse
quelle
-1

Wählen Sie in P4V unter dem Menüpunkt "Ansicht" die Option "Dateien im Ordner". Daraufhin wird im rechten Bereich eine neue Registerkarte angezeigt. Ganz rechts auf den Registerkarten befindet sich ein kleines Symbol, das ein Fenster mit dem Namen "Dateien im Ordner" mit zwei Symbolen öffnet. Wählen Sie das linke Symbol, das wie ein Trichter aussieht, und Sie sehen mehrere Optionen. Wählen Sie "Elemente anzeigen, die nicht im Depot vorhanden sind". Alle Dateien im Ordner werden angezeigt. Klicken Sie dann einfach mit der rechten Maustaste auf die Datei, die Sie hinzufügen möchten, und wählen Sie "Zum Hinzufügen markieren ...". Sie können überprüfen, ob es dort auf der Registerkarte "Ausstehend" vorhanden ist. Einfach wie gewohnt einreichen (Strg + S).

Ingenieur
quelle