2013-03-13 5 views
6

Annotate bringt Sie so weit wie die letzte Änderung an dieser Zeile zu sehen, wenn diese Änderung eine Zusammenführung ist, dann habe ich keine andere Wahl, als durch die Revisionshistorie zu suchen und zu finden das nächste Mal wurde es geändert.Mercurial - Alle Changesets, die bestimmte Zeile in Datei ändern

Ich habe auch versucht hg grep -l '[contents of line]' aber:

  • a) Ich kann nicht herausfinden, wie bestimmte Dateien zielen (so dauert es ewig in einem mäßig großen Repo)
  • b) Es scheint nur Rückkehr die letzte Revisionsnummer

Der folgende Link ist vage ähnlich - How to find all changsets where a reference to a function was modified?

Antwort

8

Verwenden TortoiseHg zu unterstützen:

  1. Ansicht -> Manifest
  2. Recht auf Datei interessiert klicken und klicken
  3. Klick "History File" "Anmerkungen versehen mit Revisionsnummern"

Das obere Feld ermöglicht es Ihnen, schnell die Geschichte zu sehen der Datei in Form von Commits zeigt das untere Feld die mit Anmerkungen versehene Datei basierend auf der ausgewählten Version im oberen Bereich an.

+1

Vielleicht liegt es daran, dass ich auf einer späteren Version von TortoiseHg (3.2.3) bin, aber ich sehe nicht, wie dies hilft, die Änderungen einer einzelnen Zeile zu isolieren? (Ich kann die Manifest-Option nicht mehr finden, aber das Verhalten der Dateien im Kontextmenü des Explorers/Plugins kommentieren anscheinend das, was diese Antwort vorschlägt. So sieht eine Datei verschiedene Revisionen aus; Sie müssen die Linie dennoch finden Frage in jeder Revision.) – downwitch

+1

für fehlende Manifest - http://stackoverflow.com/questions/23457746/manifest-button-missing-in-tortoise-hg – Tom

1

ich denke, das requ Ies ein bisschen (zweistufige) Programmierung.

Das folgende Shell-Skript funktioniert ziemlich gut für mich. Es druckt sowohl die Revisionen als auch die übereinstimmenden Zeilen. Wenn Sie nur die Revisionen Liste möchten, können Sie einen Schritt fügen Sie den passenden Text zu entfernen und nur die Revision Präfix und möglicherweise Rohr durch ‚sort -u‘ verlassen:

#!/bin/bash 
# 
# script to grep for a pattern in all revisions of a file 
# Usage: scriptname 'pattern' filepath 
# 
function fatal() { 
    echo "[email protected]" 1>&2 
    exit 1 
} 

function usage() { 
    echo "[email protected]" 1>&2 
    fatal Usage: $0 pattern file 
} 

case "$1" in 
    '') usage 'missing pattern to search for' ;; 
    *) Pat="$1" ;; 
esac 

if [ "$2" != '' ]; then 
    File="$2" 
else 
    usage 'must pass file as 2nd argument' 
fi 

# -- generate list of revisions (change-sets) involving $File 
for rev in `hg log --template '{rev}\n' $File`; do 
    # -- grep the wanted pattern in that particular revision 
    hg grep "$Pat" -r $rev $File 
done 

Hinweise:

  • nicht vollständig narrensicher (zB Zitate im Muster)
  • ich für Datei Existenz nicht überprüfen umbenannten/gelöschten Dateien sowie
+0

Ich wünschte, es gäbe einen Weg, dies einfacher zu machen. Ich verwende TortoiseHg nicht – ganeshran

2

die Reaktion des arielf ohne ein zusätzliches Skript:

UNIX:

  • Kommando:

    hg log --template '{rev}\n' <FILE> | 
        xargs -I @ hg grep <PATTERN> -r @ <FILE> 
    
  • Sie diese verwenden können, einen Alias ​​zu der Konfigurationsdatei hinzuzufügen (.hgrc):

    [alias] 
    _grep_line_in_history = ! $HG log --template '{rev}\n' $2 | 
        xargs -I @ hg grep '$1' -r @ $2 
    

WINDOWS:

  • Befehl:

    FOR /F "usebackq" %i IN (`hg log --template "{rev}\n" <FILE>`) DO 
    @(echo %i & hg grep <PATTERN> -r %i <FILE>) 
    
  • alias:

    [alias] 
    _grep_line_in_history = ! FOR /F "usebackq" %i IN 
        (`%HG% log --template "{rev}\n" "$2"`) DO @(echo %i & %HG% grep "$1" -r %i "$2") 
    
Verwandte Themen