J'ai un référentiel Git avec quelques branches et des commits suspendus. Je voudrais rechercher toutes ces validations dans le référentiel pour une chaîne spécifique.
Je sais comment obtenir un journal de toutes les validations de l'histoire, mais celles-ci n'incluent pas les branches ou les blobs pendants, juste l'histoire de HEAD. Je veux les obtenir tous, trouver un commit spécifique qui a été mal placé.
J'aimerais également savoir comment faire cela dans Mercurial, car je pense au changement.
Réponses:
Vous pouvez voir les commissions pendantes
git log -g
.Vous pouvez donc faire cela pour trouver une chaîne particulière dans un message de validation qui pend:
Alternativement, si vous souhaitez rechercher les modifications pour une chaîne particulière, vous pouvez utiliser l'option de recherche de pioche, "-S":
Git 1.7.4 sera ajoutera l'option -G , vous permettant de passer -G <regexp> pour trouver quand une ligne contenant <regexp> a été déplacée, ce que -S ne peut pas faire. -S ne vous indiquera que lorsque le nombre total de lignes contenant la chaîne a changé (c'est-à-dire l'ajout / la suppression de la chaîne).
Enfin, vous pouvez utiliser gitk pour visualiser les validations pendantes avec:
Et puis utilisez ses fonctions de recherche pour rechercher le fichier égaré. Tous ces travaux en supposant que la validation manquante n'a pas «expiré» et ont été récupérés, ce qui peut se produire si elle est suspendue pendant 30 jours et que vous expirez reflogs ou exécutez une commande qui les expire.
la source
!git fsck --unreachable | sed -ne 's/^unreachable commit //p' | xargs git log --no-walk
Dans Mercurial, vous utilisez
hg log --keyword
pour rechercher des mots clés dans les messages de validation ethg log --user
pour rechercher un utilisateur particulier. Voirhg help log
pour d'autres moyens de limiter le journal.la source
hg log -k
les recherches engagent également le nom d'utilisateur et les noms de fichiers dans les ensembles de modifications (je vois cela dans commands.py:log), ce qui est l'une des rares choses que je ne comprends pas dans hg. Il devrait y avoir des options distinctes pour rechercher dans les messages de validation et les noms de fichiers. On dirait quehg log --template '{desc}\n'|grep
c'est le moyen sûr.hg grep --all <term>
En plus de la réponse richq d'utiliser
git log -g --grep=<regexp>
ougit grep -e <regexp> $(git log -g --pretty=format:%h)
: jetez un œil aux articles de blog suivants de Junio C Hamano, actuel responsable de gitRésumé
Les deux grep git et log git --grep sont orientés en ligne dans la mesure où ils recherchent des lignes correspondant au critère spécifié.
Vous pouvez utiliser
git log --grep=<foo> --grep=<bar>
(ougit log --author=<foo> --grep=<bar>
cela se traduit en interne par deux--grep
) pour trouver des validations qui correspondent à l' un des modèles (implicite OU sémantique).En raison de son orientation linéaire, l' ET utile sémantique est d'utiliser
git log --all-match --grep=<foo> --grep=<bar>
pour trouver un commit qui a à la fois une correspondance de ligne en premier et une seconde correspondance de ligne quelque part.Avec
git grep
vous pouvez combiner plusieurs modèles (tous qui doivent utiliser le-e <regexp>
formulaire) avec--or
(qui est la valeur par défaut),--and
,--not
,(
et)
. Pour grep--all-match
signifie que le fichier doit avoir des lignes qui correspondent à chacune des alternatives.la source
Sur la base de la réponse de rq, j'ai trouvé que cette ligne fait ce que je veux:
Qui rapportera l'ID de validation, le nom de fichier et affichera la ligne correspondante, comme ceci:
... Quelqu'un convient-il que ce serait une bonne option à inclure dans la commande git grep standard?
la source
Toute commande qui prend des références comme arguments acceptera l'
--all
option décrite dans la page de manuelgit rev-list
comme suit:Ainsi, par exemple
git log -Sstring --all
, affichera toutes les validations qui mentionnentstring
et qui sont accessibles à partir d'une branche ou d'une balise (je suppose que vos validations pendantes sont au moins nommées avec une balise).la source
git grep
, où--all
semble être traduit / utilisé comme--all-match
. Cela ressemble à un bug pour moi .. en utilisant Git 1.7.2.3 (en utilisant des$(git rev-list --all)
œuvres).Avec Mercurial vous faites
Il existe d'autres options qui réduisent la gamme de révisions recherchées.
la source
hg grep --all
Je ne sais pas pour git, mais dans Mercurial, je dirigerais simplement la sortie de hg log vers un script sed / perl / quel que soit pour rechercher ce que vous recherchez. Vous pouvez personnaliser la sortie du journal hg à l'aide d'un modèle ou d'un style pour faciliter la recherche, si vous le souhaitez.
Cela inclura toutes les branches nommées dans le référentiel. Mercurial n'a pas quelque chose comme des blobs pendants afaik.
la source
si vous êtes un utilisateur de vim, vous pouvez installer tig (apt-get install tig), et utiliser /, même commande pour rechercher sur vim
https://blogs.atlassian.com/2013/05/git-tig/
la source
Pour ajouter une seule solution non encore mentionnée, je devais dire que l'utilisation de la boîte de recherche graphique de gitg était la solution la plus simple pour moi. Il sélectionnera la première occurrence et vous pourrez trouver la suivante avec Ctrl-G.
la source
Une commande dans git que je pense qu'il est beaucoup plus facile de trouver une chaîne:
fonctionne dans Git 2.0.4
la source