Comment trouver des fichiers non suivis dans une arborescence Perforce? (analogue du statut svn)

87

Quelqu'un a-t-il un script ou un alias pour trouver des fichiers non suivis (vraiment: non ajoutés) dans une arborescence Perforce?

EDIT: J'ai mis à jour la réponse acceptée sur celle-ci car il semble que P4V ait ajouté le support pour cela dans la version de janvier 2009.

David Joyner
la source
11
Je ne peux pas imaginer comment il se fait que l'outil SCM d'entreprise le plus utilisé n'ait pas cette fonctionnalité. Probablement tous leurs développeurs n'utilisent que l'interface graphique.
sorin le
3
Oh pour pleurer fort!!!! L'accepté p4 statusne se contente pas de TROUVER les fichiers non suivis, il COMMENCE également à les suivre. Ie p4 statusn'est pas une requête en lecture seule, comme on pourrait le soupçonner d'après le nom, mais c'est en fait une commande qui change des choses - pas les fichiers de l'espace de travail. Ce n'est PAS ce qu'une commande d'état devrait faire, et NON ce que svn statusfait. La chose la plus proche que je puisse trouver svn statusest p4 reconcile -na- -a pour dire «fichiers qui devraient être ajoutés», -n pour dire «ne changez rien». /// J'ai dit au départ quelque chose de beaucoup plus fort.
Krazy Glew
Les deux p4 reconcileet p4 statussont lents comme l'enfer, tout en git statusfinissant de s'exécuter en 1-3 secondes.
zwcloud

Réponses:

81

EDIT: Veuillez utiliser p4 statusmaintenant. Il n'est plus nécessaire de sauter à travers des cerceaux. Voir la réponse de @ ColonelPanic .

Dans la version de janvier 2009 de P4V, vous pouvez cliquer avec le bouton droit de la souris sur n'importe quel dossier de l'arborescence de votre espace de travail et cliquer sur "réconcilier le travail hors ligne ..."

Cela fera un peu de traitement puis affichera une vue en arborescence fractionnée des fichiers qui ne sont pas extraits mais qui ont des différences par rapport à la version du dépôt, ou qui ne sont pas du tout archivés. Il peut même y avoir quelques autres catégories qu'il évoque.

Vous pouvez cliquer avec le bouton droit sur les fichiers dans cette vue et les extraire, les ajouter ou même les rétablir.

C'est un outil très pratique qui m'a sauvé le cul plusieurs fois.

EDIT: ah la question posée sur les scripts spécifiquement, mais je vais laisser cette réponse ici au cas où.

tenpn
la source
Ajout d'une solution PowerShell à cette question: stackoverflow.com/questions/3217152/…
tenpn
Cela diffère-t-il chaque fichier par rapport à la version du référentiel? J'ai un grand repo et une connexion lente (lorsque je travaille à domicile). Cela pourrait prendre une éternité!
gdw2
Je ne pense pas que ce soit une différence complète, mais ce n'est pas rapide.
tenpn
10
Oh pour pleurer fort!!!! p4 statusne se contente pas de TROUVER les fichiers non suivis, il COMMENCE en fait à les suivre. Ie p4 statusn'est pas une requête en lecture seule, comme on pourrait le soupçonner d'après le nom, mais c'est en fait une commande qui change des choses - pas les fichiers de l'espace de travail. Ce n'est PAS ce qu'une commande de statut devrait faire, ni ce que svn statusfait. La chose la plus proche que je puisse trouver svn statusest p4 reconcile -na- -a pour dire «fichiers qui devraient être ajoutés», -n pour dire «ne changez rien». /// J'ai dit à l'origine quelque chose de beaucoup plus fort.
Krazy Glew
1
p4 statusest fondamentalement un synonyme de p4 reconcile -n. Peut-être avez-vous couru p4 status -Ace qui est synonyme de p4 reconcile?
Samwise
50

Sous Linux, ou si gnu-tools est installé sur Windows:

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

Cela affichera un message d'erreur pour chaque fichier non comptabilisé. Si vous souhaitez capturer cette sortie:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
Mark Harrison
la source
1
La redirection de stderr vers stdout vous permettra d'effectuer un filtrage supplémentaire ou d'autres opérations. Par exemple, pour afficher une liste déroulante de fichiers Java: recherchez. -type f -print0 | xargs -0 p4 fstat 2> & 1> / dev / null | grep '\ .java' | moins
Jon Nadal
2
Cela prend énormément de temps sur mon espace de travail de 60K fichiers. J'ai écrit un script python qui fait le même travail en moins de 10 secondes: p5 . Il prend également en charge .p4ignoreet peut prévisualiser et modifier automatiquement les fichiers non suivis / modifiés / supprimés.
hamstergene
@hamstergene, très gentil!
Mark Harrison
Écrit un petit script qui fait exactement cela si quelqu'un est intéressé (y compris l'argument dir, l'argument de profondeur maximale et la sortie vers stdout).
Arnon Zilca
Merci; J'ai trouvé cela utile! Notez que cela ne gère pas les liens symboliques ( find . -type l), et donne une sortie trompeuse pour les fichiers P4 ajoutés de force car ils contiennent les caractères @ou %. Cependant, ces fichiers sont minoritaires, donc un examen manuel de ces cas extrêmes fonctionnera dans la plupart des cas.
CJBS
19

Sous Unix:

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

Cela imprimera une liste de fichiers qui ne sont pas ajoutés dans votre client ou dans le dépôt Perforce. J'avais l'habitude ! -name '*~'d'exclure les fichiers se terminant par ~.

ahu
la source
12

Ahh, l'un des classiques de Perforce :) Oui, ça craint vraiment qu'il n'y ait TOUJOURS pas de moyen facile pour cela intégré aux commandes par défaut.

Le moyen le plus simple est d'exécuter une commande pour rechercher tous les fichiers sous la racine de vos clients, puis d'essayer de les ajouter au dépôt. Vous vous retrouverez avec une liste de modifications de tous les nouveaux fichiers et les fichiers existants sont ignorés.

Par exemple, dir / s / b / AD | p4 -x - ajouter

(utilisez 'find. -type f -print' à partir d'une ligne de commande nix).

Si vous voulez une liste physique (dans la console ou le fichier), vous pouvez diriger les résultats d'un diff (ou les ajouter si vous les voulez également dans une liste de modifications).

Si vous l'exécutez dans P4Win, vous pouvez utiliser $ r pour remplacer la racine client de l'espace de travail actuel.

Andrew Grant
la source
11

Existe-t-il un analogue de svn statusou git status?

Oui, MAIS .

À partir de la version 2012.1 de Perforce, il y a la commande p4 statuset dans P4V «réconcilier le travail hors ligne». Cependant, ils sont tous les deux très lents. Pour exclure les fichiers non pertinents, vous devrez écrire un p4ignore.txtfichier par https://stackoverflow.com/a/13126496/284795

Colonel Panic
la source
1
Plusieurs améliorations de performances ont été apportées p4 statusdepuis la version 2012.1. Si vous êtes resté à l'écart en p4 statusraison de problèmes de performances, il peut être utile de le tester à nouveau pour voir comment il se comporte maintenant.
Bryan Pendleton
7

Je me sens obligé d'ajouter une réponse, car la réponse acceptée, et certaines des autres, ont ce que je pense être un problème important: ils ne comprennent pas la différence entre une commande de requête en lecture seule et une commande qui apporte des modifications.

Je ne m'attends à aucun crédit pour cette réponse, mais j'espère que cela aidera les autres à éviter de perdre du temps et de faire des erreurs en suivant la réponse acceptée mais incorrecte à mon humble avis.

--- + BREF

Le moyen le plus pratique de trouver tous les fichiers non suivis dans un espace de travail perforce est probablement p4 reconcile -na.

-a dit "donnez-moi les fichiers qui ne sont pas dans le référentiel, c'est-à-dire qui devraient être ajoutés".

-ndit "ne faites aucun changement" - c'est-à-dire un essai à sec. (Bien que les messages puissent dire "ouvert pour ajouter", vous devez mentalement interpréter cela comme "serait ouvert pour ajouter si ce n'est pas -n")

Le moyen le plus pratique de trouver toutes les modifications locales effectuées en mode hors connexion - pas seulement les fichiers qui pourraient avoir besoin d'être ajoutés, mais également les fichiers qui pourraient devoir être supprimés, ou qui ont été modifiés sans être ouverts pour modification via p4 edit, est p4 reconcile -n.

Plusieurs réponses ont fourni des scripts, impliquant souvent p4 fstat. Bien que je n'ai pas vérifié tous ces scripts, j'utilise souvent des scripts similaires pour compenser les lacunes des commandes perforce telles que p4 reconcile -n- par exemple, je trouve souvent que je veux des chemins locaux plutôt que des chemins de dépôt Perforce ou des chemins d'espace de travail.

--- + AVERTISSEMENT

p4 status n'est PAS l'équivalent des commandes d'état sur d'autres systèmes de contrôle de version.

p4 statusn'est PAS une requête en lecture seule. p4 statustrouve en fait le même genre de changements que celui qui le p4 reconcilefait et les ajoute au référentiel. p4 statusne semble pas avoir d' -noption d'exécution à sec comme le p4 reconcilefait.

Si vous le faites p4 status, regardez les fichiers et pensez "Oh, je n'en ai pas besoin", alors vous devrez les utiliser p4 revertsi vous voulez continuer à éditer dans le même espace de travail. Sinon, les modifications p4 statusajoutées à votre ensemble de modifications seront vérifiées la prochaine fois.

Il semble y avoir peu ou pas de raison d'utiliser p4 statusplutôt que p4 reconcile -n, à l'exception de quelques détails sur l'espace de travail local par rapport au chemin d'accès au dépôt.

Je ne peux qu'imaginer que quiconque a choisi «statut» pour une commande non en lecture seule avait une maîtrise limitée de la langue anglaise et d'autres outils de contrôle de version.

--- + P4VGUI

Dans l'interface graphique p4v, la commande de réconciliation trouve les modifications locales qui peuvent devoir être ajoutées, supprimées ou ouvertes pour modification. Heureusement, il ne les ajoute pas à une liste de modifications par défaut; mais vous voudrez peut-être quand même faire attention à fermer la fenêtre de réconciliation après l'avoir inspectée, si vous ne voulez pas valider les modifications.

Krazy Glew
la source
Le statut p4 ne semble pas ajouter de fichiers. il semble fonctionner comme et est documenté comme «réconcilier -n». êtes-vous sûr que cela change les choses?
kdubs
4

J'utilise ce qui suit dans mon outil qui sauvegarde tous les fichiers de l'espace de travail qui diffèrent du référentiel (pour Windows). Il gère certains cas étranges que Perforce n'aime pas beaucoup, comme les blancs intégrés, les étoiles, les pourcentages et les hachages:

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 " répertorie tous les fichiers de ce dossier ou en dessous ( / S ) au format "nu" ( / B ) à l'exclusion des répertoires (/ AD ). Le " sed " change les caractères dangereux en leur forme " % xx " (à la HTML), et la commande " p4 have " vérifie cette liste (" -x- ") contre le serveur en supprimant tout ce qui concerne les fichiers qu'il localise réellement dans le référentiel (" 1> NUL: "). Le résultat est un tas de lignes comme:

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
la source
C'est une excellente solution, et fonctionne toujours avec la version P4 2015.1
Rian Sanderson
très vite! find / xargs manque de mémoire et est lent. Rappelez-vous de doubler les% lors de l'ajout au fichier .bat.
kevinf
4

Alternativement à partir de P4Win, utilisez l'option «Fichiers locaux pas dans le dépôt» dans le panneau d'affichage de gauche.

Je n'utilise pas beaucoup P4V, mais je pense que l'équivalent est de sélectionner "Masquer les fichiers de l'espace de travail local" dans la liste déroulante des filtres de l'onglet de vue de l'espace de travail. P4 help fstat

Dans P4V 2015.1, vous trouverez ces options sous le bouton de filtrage comme ceci: entrez la description de l'image ici

Greg Whitfield
la source
Cela n'affiche que les fichiers dans le répertoire actuel, malheureusement :(
JP P.
2

Quick 'n Dirty: Dans p4v, cliquez avec le bouton droit sur le dossier en question et ajoutez tous les fichiers en dessous à une nouvelle liste de modifications. La liste des modifications contiendra désormais tous les fichiers qui ne font pas actuellement partie du dépôt.

gdw2
la source
1

Les commandes suivantes produisent une sortie de type état, mais aucune n'est tout à fait équivalente à svn statusou git status, fournissant un résumé en une ligne de l'état de chaque fichier:

  • p4 status
  • p4 opened
  • p4 diff -ds
Rhubbarbe
la source
0

Je n'ai pas assez de points de réputation à commenter, mais la solution de Ross répertorie également les fichiers ouverts à l'ajout. Vous ne souhaitez probablement pas utiliser sa réponse pour nettoyer votre espace de travail.

Ce qui suit utilise p4 fstat(merci Mark Harrison) au lieu de p4 have, et répertorie les fichiers qui ne sont pas dans le dépôt et qui ne sont pas ouverts à l'ajout.

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
la source
0

Méthode rapide, mais peu orthodoxe. Si la base de code n'ajoute pas de nouveaux fichiers / change de vue trop souvent, vous pouvez créer un référentiel local «git» à partir de votre extraction. À partir d'une synchronisation propre par force, git init, ajoutez et validez tous les fichiers localement. Le statut de Git est rapide et affichera les fichiers non validés précédemment.

kevinf
la source
0

La p4 fstatcommande vous permet de tester si un fichier existe dans l'espace de travail, combiner avec findpour localiser les fichiers à vérifier comme dans l'exemple Perl suivant:

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

Ou vous pouvez utiliser p4 reconcile -n -m ...

S'il est «ouvert pour suppression», il a été supprimé de l'espace de travail. Notez que la commande ci-dessus s'exécute en mode aperçu ( -n).

a été un
la source
1
Veuillez ne pas simplement lancer du code sans aucune explication en guise de réponse, mais ajouter des explications pour aider l'OP à comprendre le code et à apprendre quelque chose. :)
Markus
0

J'avais besoin de quelque chose qui fonctionnerait sous Linux, Mac ou Windows. J'ai donc écrit un script Python pour cela. L'idée de base est de parcourir les fichiers et d'exécuter p4 fstatsur chacun d'eux. (bien sûr en ignorant les dépendances et les dossiers tmp)

Vous pouvez le trouver ici: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

donner
la source
-1

Dans P4V, sous l'élément de menu "Affichage", choisissez "Fichiers dans le dossier" qui fait apparaître un nouvel onglet dans le volet droit. À l'extrême droite des onglets, il y a une petite icône qui fait apparaître une fenêtre appelée "Fichiers dans le dossier" avec 2 icônes. Sélectionnez l'icône de gauche qui ressemble à un entonnoir et vous verrez plusieurs options. Choisissez "Afficher les éléments non dans le dépôt" et tous les fichiers du dossier s'afficheront. Ensuite, faites un clic droit sur le fichier que vous souhaitez ajouter et choisissez "Marquer pour ajouter ...". Vous pouvez vérifier qu'il est là dans l'onglet "En attente". Soumettez simplement comme d'habitude (Ctrl + S).

Ingénieur
la source