Come trovare file non tracciati in un albero Perforce? (analogo dello stato svn)


87

Qualcuno ha uno script o un alias per trovare file non tracciati (in realtà: non aggiunti) in un albero Perforce?

EDIT: Ho aggiornato la risposta accettata su questo dato che sembra che P4V abbia aggiunto il supporto per questo nella versione di gennaio 2009.


11
Non riesco a immaginare come sia possibile che allo strumento SCM aziendale più utilizzato manchi questa funzionalità. Probabilmente tutti i loro sviluppatori utilizzano solo la GUI.
sorin

3
Oh per aver gridato forte !!!! L'accettato p4 statusnon si limita a TROVARE i file non tracciati, in realtà INIZIA A TROVARLI. Cioè p4 statusnon è una query di sola lettura, come si potrebbe sospettare dal nome, ma in realtà è un comando che cambia cose, non i file dell'area di lavoro. Questo NON è ciò che dovrebbe fare un comando di stato e NON ciò che svn statusfa. La cosa più vicina che riesco a trovare svn statusè p4 reconcile -na- -a per dire "file che dovrebbero essere aggiunti", -n per dire "in realtà non cambiare nulla". /// All'inizio ho detto qualcosa di molto più forte.
Krazy Glew

1
Ho rianimato stackoverflow.com/questions/9642531/… , che era stato erroneamente contrassegnato come duplicato di stackoverflow.com/questions/9272/… , come nuova domanda (Qual è l'equivalente del comando p4 a qualcosa come git / hg / bzr / svn stato? (Suggerimento: no p4 status) , e ho risposto io stesso. Accolto meglio
Krazy Glew

Entrambi p4 reconcilee p4 statussono lenti come l'inferno, mentre git statusterminano l'esecuzione in 1-3 secondi.
zwcloud

Risposte:


81

EDIT: si prega di utilizzare p4 statusora. Non è più necessario saltare i cerchi. Vedi la risposta di @ ColonelPanic .

Nella versione gennaio 2009 di P4V, puoi fare clic con il pulsante destro del mouse su qualsiasi cartella nella struttura dell'area di lavoro e fare clic su "riconcilia lavoro offline ..."

Questo eseguirà un po 'di elaborazione, quindi visualizzerà una visualizzazione ad albero diviso dei file che non sono stati estratti ma presentano differenze dalla versione del depot o non sono stati archiviati affatto. Potrebbero esserci anche alcune altre categorie che vengono visualizzate.

Puoi fare clic con il pulsante destro del mouse sui file in questa vista e controllarli, aggiungerli o persino ripristinarli.

È uno strumento molto utile che mi ha salvato il culo un paio di volte.

EDIT: ah la domanda posta sugli script in particolare, ma lascio questa risposta qui per ogni evenienza.


Aggiunta una soluzione PowerShell in questa domanda: stackoverflow.com/questions/3217152/...
tenpn

Questo differisce ogni singolo file dalla versione nel repository? Ho un grande repository e una connessione lenta (quando lavoro da casa). Potrebbe volerci un'eternità!
gdw2

Non penso che sia un diff completo, ma non è veloce.
tenpn

10
Oh per aver gridato forte !!!! p4 statusnon si limita a TROVARE i file non tracciati, ma INIZIA effettivamente a rintracciarli. Cioè p4 statusnon è una query di sola lettura, come si potrebbe sospettare dal nome, ma in realtà è un comando che cambia cose, non i file dell'area di lavoro. Questo NON è ciò che dovrebbe fare un comando di stato e NON ciò che svn statusfa. La cosa più vicina che riesco a trovare svn statusè p4 reconcile -na- -a per dire "file che dovrebbero essere aggiunti", -n per dire "in realtà non cambiare nulla". /// All'inizio ho detto qualcosa di molto più forte.
Krazy Glew

1
p4 statusè fondamentalmente un sinonimo di p4 reconcile -n. Forse hai eseguito p4 status -Ache è un sinonimo di p4 reconcile?
Samwise

50

Su linux o se hai gnu-tools installato su Windows:

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

Questo mostrerà un messaggio di errore per ogni file non contabilizzato. Se vuoi catturare quell'output:

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

1
Reindirizzare stderr a stdout ti consentirà di eseguire filtri aggiuntivi o altre operazioni. Ad esempio, per visualizzare un elenco scorrevole di file Java: trova. -type f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | meno
Jon Nadal

2
Questo richiede follemente a lungo sul mio spazio di lavoro di file 60K. Ho scritto uno script Python che fa lo stesso lavoro in meno di 10 secondi: p5 . Supporta anche .p4ignoree può visualizzare in anteprima e modificare automaticamente i file non tracciati / modificati / cancellati.
hamstergene

@hamstergene, molto gentile!
Mark Harrison

Ho scritto un piccolo script che fa esattamente questo se qualcuno è interessato (incluso l'argomento dir, l'argomento max depth e l'output su stdout).
Arnon Zilca

Grazie; L'ho trovato utile! Nota che questo non gestisce collegamenti simbolici ( find . -type l) e fornisce un output fuorviante per i file P4 aggiunti forzatamente perché contengono i caratteri @o %. Tuttavia, tali file sono in minoranza, quindi una revisione manuale di questi casi limite funzionerà nella maggior parte dei casi.
CJBS

19

Sotto Unix:

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

Verrà stampato un elenco di file che non vengono aggiunti nel client o nel depot di Perforce. Ho usato ! -name '*~'per escludere i file che finiscono con ~.


12

Ahh, uno dei classici di Perforce :) Sì, fa davvero schifo che non ci sia ANCORA un modo semplice per questo integrato nei comandi predefiniti.

Il modo più semplice è eseguire un comando per trovare tutti i file nella root dei client e quindi tentare di aggiungerli al depot. Ti ritroverai con un elenco delle modifiche di tutti i nuovi file ei file esistenti verranno ignorati.

Ad esempio dir / s / b / AD | p4 -x - aggiungi

(usa 'find. -type f -print' da una riga di comando nix).

Se si desidera un elenco fisico (nella console o nel file), è possibile eseguire il pipe sui risultati di un diff (o aggiungerlo se lo si desidera anche in un elenco delle modifiche).

Se lo stai eseguendo all'interno di P4Win puoi usare $ r per sostituire la radice del client dell'area di lavoro corrente.


11

C'è un analogo di svn statuso git status?

Sì, MA .

A partire dalla versione 2012.1 di Perforce, c'è il comando p4 statuse in P4V "riconciliare il lavoro offline". Tuttavia, sono entrambi molto lenti. Per escludere file irrilevanti dovrai scrivere un p4ignore.txtfile per https://stackoverflow.com/a/13126496/284795


1
Sono stati apportati numerosi miglioramenti alle prestazioni p4 statusdalla versione 2012.1. Se ti sei allontanato a p4 statuscausa di problemi di prestazioni, potrebbe valere la pena provarlo di nuovo per vedere come si comporta ora.
Bryan Pendleton

7

Mi sento spinto ad aggiungere una risposta, poiché la risposta accettata, e alcune delle altre, hanno quello che penso sia un problema significativo: non capiscono la differenza tra un comando di query di sola lettura e un comando che apporta modifiche.

Non mi aspetto alcun merito per questa risposta, ma spero che aiuti gli altri a evitare di perdere tempo e commettere errori seguendo la risposta accettata ma IMHO errata.

--- + BREVE

Probabilmente il modo più conveniente per trovare tutti i file non tracciati in un'area di lavoro forzata è p4 reconcile -na.

-a dice "dammi i file che non sono nel repository, cioè che dovrebbero essere aggiunti".

-ndice "non apportare modifiche" - vale a dire un funzionamento a secco. (Sebbene i messaggi possano dire "aperto per aggiungere", mentalmente devi interpretarlo come "sarebbe aperto per aggiungere se non -n")

Probabilmente il modo più conveniente per trovare tutte le modifiche locali apportate offline: non solo i file che potrebbero dover essere aggiunti, ma anche i file che potrebbero dover essere eliminati o che sono stati modificati senza essere aperti per la modifica tramite p4 edit, è p4 reconcile -n.

Diverse risposte fornivano script, spesso coinvolgenti p4 fstat. Anche se non ho verificato tutti questi script, utilizzo spesso script simili per compensare le carenze di comandi di perforce come p4 reconcile -n- ad esempio, spesso trovo che desidero percorsi locali piuttosto che percorsi del depot di Perforce o percorsi dell'area di lavoro.

--- + ATTENZIONE

p4 status NON è la controparte dei comandi di stato su altri sistemi di controllo della versione.

p4 statusNON è una query di sola lettura. p4 statustrova effettivamente lo stesso tipo di modifiche che p4 reconcilefa e le aggiunge al repository. p4 statusnon sembra avere -nun'opzione di funzionamento a secco come p4 reconcilefa.

Se lo fai p4 status, guarda i file e pensa "Oh, non ho bisogno di quelli", allora p4 revertli dovrai se vuoi continuare a modificare nello stesso spazio di lavoro. Altrimenti le modifiche che sono state p4 statusaggiunte al tuo changeset verranno controllate la volta successiva.

Sembra che ci siano poche o nessuna ragione per usare p4 statuspiuttosto che p4 reconcile -n, eccetto per alcuni dettagli dello spazio di lavoro locale rispetto al percorso del depot.

Posso solo immaginare che chiunque abbia scelto lo 'stato' per un comando non di sola lettura avesse un controllo limitato della lingua inglese e di altri strumenti di controllo della versione.

--- + P4VGUI

Nella GUI p4v, il comando reconcile trova le modifiche locali che potrebbero dover essere aggiunte, eliminate o aperte per la modifica. Fortunatamente non li aggiunge a un elenco modifiche per impostazione predefinita; ma potresti comunque voler fare attenzione a chiudere la finestra di riconciliazione dopo averla ispezionata, se non vuoi eseguire il commit delle modifiche.


Lo stato p4 non sembra aggiungere file. sembra funzionare come ed è documentato come "reconcile -n". sei sicuro che cambi le cose?
kdubs

4

Uso quanto segue nel mio strumento che esegue il backup di tutti i file nell'area di lavoro che differiscono dal repository (per Windows). Gestisce alcuni casi strani che a Perforce non amano molto, come spazi vuoti incorporati, stelle, percentuali e hashmark:

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 " elenca tutti i file in o sotto questa cartella ( / S ) in formato "semplice" ( / B ) escluse le directory (/ AD ). Il " sed " cambia i caratteri pericolosi nella loro forma " % xx " (a la HTML), e il comando " p4 have " controlla questo elenco (" -x- ") contro il server scartando qualsiasi cosa sui file che effettivamente individua nel repository (" 1> NUL: "). Il risultato è un mucchio di righe come:

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

Et voilà!


Questa è un'ottima soluzione e funziona ancora con la versione P4 2015.1
Rian Sanderson

molto veloce! find / xargs esaurisce la memoria e rallenta. Ricorda di raddoppiare% quando aggiungi al file .bat.
kevinf

4

In alternativa da P4Win, usa l'opzione "" File locali non in deposito "nel pannello di visualizzazione a sinistra.

Non uso molto P4V, ma penso che l'equivalente sia selezionare "Nascondi file area di lavoro locali" nel menu a discesa dei filtri della scheda della vista Area di lavoro. P4 help fstat

In P4V 2015.1 troverai queste opzioni sotto il pulsante del filtro in questo modo: inserisci qui la descrizione dell'immagine


Questo mostra solo i file nella directory corrente, purtroppo :(
JP P.

2

Quick 'n Dirty: in p4v fai clic con il pulsante destro del mouse sulla cartella in questione e aggiungi tutti i file sottostanti a una nuova lista delle modifiche. L'elenco delle modifiche ora conterrà tutti i file che non fanno attualmente parte del depot.


1

I seguenti comandi producono un output simile allo stato, ma nessuno è del tutto equivalente a svn statuso git status, fornendo un riepilogo di una riga dello stato di ciascun file:

  • p4 status
  • p4 opened
  • p4 diff -ds

0

Non ho abbastanza punti reputazione per commentare, ma la soluzione di Ross elenca anche i file aperti per l'aggiunta. Probabilmente non vuoi usare la sua risposta per pulire il tuo spazio di lavoro.

Il seguente utilizza p4 fstat(grazie Mark Harrison) invece di p4 haveed elenca i file che non sono nel depot e non sono aperti per l'aggiunta.

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


0

Metodo veloce, ma poco ortodosso. Se la codebase non aggiunge nuovi file / cambia visualizzazione troppo spesso, potresti creare un repository "git" locale dal tuo checkout. Da una sincronizzazione pulita, git init, aggiungi e salva tutti i file localmente. Lo stato di Git è veloce e mostrerà i file non salvati in precedenza.


0

Il p4 fstatcomando ti consente di verificare se un file esiste nell'area di lavoro, combinarlo con findper individuare i file da controllare come nel seguente esempio 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;

Oppure puoi usare p4 reconcile -n -m ...

Se è "aperto per l'eliminazione", è stato rimosso dall'area di lavoro. Notare che il comando precedente è in esecuzione in modalità anteprima ( -n).


1
Per favore, non lanciare solo del codice senza alcuna spiegazione come risposta, ma aggiungi qualche spiegazione per aiutare l'OP a capire il codice e imparare qualcosa. :)
Markus


0

Questo comando può darti un elenco di file che devono essere aggiunti, modificati o rimossi:
p4 status -aed ...
puoi anche usarli separatamente
p4 status -a ...
p4 status -e ...
p4 status -d ...


-1

In P4V, sotto la voce di menu "Visualizza" scegli "File nella cartella" che fa apparire una nuova scheda nel riquadro di destra. All'estrema destra delle schede c'è una piccola icona che fa apparire una finestra chiamata "File nella cartella" con 2 icone. Seleziona l'icona di sinistra che sembra un imbuto e vedrai diverse opzioni. Scegli "Mostra elementi non in deposito" e verranno visualizzati tutti i file nella cartella. Quindi fai clic con il pulsante destro del mouse sul file che desideri aggiungere e scegli "Contrassegna per Aggiungi ...". Puoi verificare che sia presente nella scheda "In attesa". Invia come di consueto (Ctrl + S).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.