Une question qui se pose parfois est de savoir quel est le meilleur moyen de déterminer la liste des modifications avec laquelle vous vous êtes synchronisé pour la dernière fois dans Perforce. Ceci est souvent nécessaire pour des choses comme l'injection du numéro de la liste de modifications dans les informations de révision par le système de construction automatique.
117
p4 changes | head -1
semble plus facile que la plupart de ces solutions.Réponses:
Je recommande le contraire pour les systèmes de construction automatique: vous devez d'abord obtenir la dernière liste de modifications du serveur en utilisant:
puis synchronisez cette modification et enregistrez-la dans les informations de révision. La raison en est la suivante. Bien que Perforce recommande ce qui suit pour déterminer la liste des modifications avec laquelle l'espace de travail est synchronisé:
ils notent quelques pièges:
et il y a un autre piège qu'ils ne mentionnent pas:
Si vous devez d'abord synchroniser et enregistrer plus tard, Perforce recommande d'exécuter la commande suivante pour déterminer si vous avez été mordu par les pièges ci-dessus; il doit indiquer que rien n'a été synchronisé ou supprimé:
la source
#have
place de@clientname
, ce qui vous évite d'avoir à rechercher le nom de votre espace de travail client.Juste pour y répondre moi-même, conformément à la suggestion de Jeff d'utiliser Stackoverflow comme un endroit pour conserver des extraits techniques ...
Depuis la ligne de commande, utilisez:
Et remplacez simplement par le nom de votre spécification client. Cela produira la sortie du formulaire:
Ce qui est facilement analysé pour extraire le numéro de la liste de modifications.
la source
Vous pouvez essayer de trouver le nombre maximum de modifications dans la sortie de la commande "p4 files". Le répertoire de travail ne doit pas contenir de commits post-sync. C'est juste un peu mieux que
car ce dernier semble fonctionner sur le serveur et peut échouer sur de grandes arborescences sources en raison des limites de "MaxResults".
où p4lastchange.py est basé sur le code de la présentation Using P4G.py From the Command Line par JTGoldstone, Kodak Information Network / Ofoto, 15 avril 2005.
la source
Si vous utilisez P4V, vous pouvez le faire graphiquement:
la source
p4 changes -m1 @clientname
ce qui est la manière «recommandée» de le faire pour mon client prend environ 10 minutesc'est ce que j'utilise:
pour le même client prend 2,1 secondes
la source
p4 changes -m1 @clientname
courir sans fin ...p4 cstat ...#have | grep change | awk '$3 > x { x = $3 };END { print x }'
fonctionne vraiment! Merci!Vous pouvez également utiliser la commande cstat:
p4 aide cstat
la source
Pour une construction sérieuse (qui est en cours de préparation pour les tests), spécifiez explicitement le numéro d'étiquette ou de liste de modifications souhaité, synchronisez-la avec l'étiquette et insérez-la dans les artefacts de construction.
Si aucune liste de
p4 counter change
modifications (ou étiquette) n'est fournie, utilisez pour obtenir le numéro de modification actuel et enregistrez-le. Mais vous devez toujours tout synchroniser à l'aide de ce numéro de modification.Je ne pense pas que vous puissiez réaliser exactement ce que vous voulez, car en général, un espace de travail entier n'est pas synchronisé avec un numéro de liste de modifications particulier. On peut explicitement synchroniser certains fichiers avec des révisions plus anciennes, puis un seul numéro de liste de modifications n'a pas de sens. C'est pourquoi une nouvelle version
sync
est nécessaire pour garantir qu'un seul numéro de liste de modifications représente avec précision la version du code.Concernant les commentaires: Oui, ma réponse est destinée à être utilisée par les gestionnaires de configuration préparant une build à donner au QA. Nos développeurs ne se synchronisent normalement pas dans le cadre d'une construction; ils font une compilation avant de soumettre - afin de s'assurer que leurs modifications n'interrompent pas la compilation ou les tests. Dans ce contexte, nous ne prenons pas la peine d'intégrer une étiquette de référentiel.
Avec votre approche, vous supposez que tout votre espace de travail a été synchronisé à la tête au moment de votre dernière soumission de liste de modifications, et que cette liste de modifications comprenait tous vos fichiers ouverts. Il est trop facile de se tromper dans ces hypothèses, difficile à détecter et horriblement coûteux en termes de temps perdu. D'un autre côté, résoudre le problème est facile, sans inconvénient. Et comme un numéro de liste de modifications peut être spécifié explicitement, peu importe la révision dont vous avez besoin ou la rapidité avec laquelle la base de code change.
la source
Pour tout le dépôt (pas seulement votre espace de travail / client)
fait le travail, il suffit de dire la dernière liste de modifications.
la source
Le mieux que j'ai trouvé jusqu'à présent est de faire votre synchronisation avec la liste de modifications que vous souhaitez créer, puis d'utiliser changes -m1 //...#have pour obtenir la liste de modifications locale actuelle (révision).
p4 sync @CHANGELIST_NUM p4 change -m1 //...#have | awk '{print $ 2}'
Vous donne le numéro de la liste des modifications que vous pouvez utiliser où vous le souhaitez. Je recherche actuellement un moyen plus simple que p4 change -m1 //...#have.
la source
Je ne sais pas si vous avez obtenu la réponse dont vous aviez besoin, mais j'ai eu un problème similaire. Le but était d'écrire dans notre logger la version spécifique du projet. Le problème était que pendant que nous créions notre propre makefile, le système de construction global est contrôlé par notre gestion de la configuration. Cela signifie que toutes les solutions qui disent "synchroniser avec quelque chose puis faire quelque chose" ne fonctionnent pas vraiment et je ne voulais pas changer manuellement la version chaque fois que nous nous engageons (une source sûre pour les erreurs). La solution (qui est en fait suggérée dans certaines des réponses ci-dessus) est la suivante: dans notre makefile, je fais des changements p4 -m1 "./...#have" Le résultat est Change change_number on date by user @ client ' msg ' Je crée simplement le message dans une chaîne qui est imprimée par l'enregistreur (le numéro de modification est l'élément important mais l'autre est également utile pour décider rapidement si une certaine version contient des modifications que vous savez que vous avez faites vous-même sans aller forcément vérifier). J'espère que cela t'aides.
la source