Gibt es eine Möglichkeit, die Geschichte für eine einzelne Datei in Mercurial zu entfernen?

StackOverflow https://stackoverflow.com/questions/1029480

  •  06-07-2019
  •  | 
  •  

Frage

Ich glaube, ich schon die Antwort auf diese weiß, aber dachte, ich würde fragen sowieso:

Wir haben eine Datei, die auf eine Mercurial-Repository mit sensiblen Informationen hinzugefügt wurde. Gibt es eine Möglichkeit, die Datei zu entfernen, zusammen mit seiner Änderungshistorie, ohne den gesamten Repo entfernen?

War es hilfreich?

Lösung

Nein, kann man nicht. Lesen Sie die Änderungen, die haben sollte nie das Quecksilber-roten Buch darüber; und vor allem die was über sensible Veränderungen, die entkommen Unterabschnitt, die diesen Absatz enthält:

  

Mercurial bietet auch keine einen Weg   zu machen, vollständig auf eine Datei oder ChangeSet   verschwindet aus der Geschichte, weil es   es keine Möglichkeit, ihre Durchsetzung   Verschwinden; jemand könnte leicht   ändern ihre Kopie von Mercurial   ignorieren diese Richtlinien. In Ergänzung,   selbst wenn Mercurial sofern ein derartiger   Fähigkeit, jemand, der einfach nicht hatte   gezogen „diese Datei verschwinden“ ein   changeset würde nicht davon betroffen sein,   noch würde Besuch Web-Crawler auf dem   Unzeit, Disk-Backups oder andere   Mechanismen. Tatsächlich nicht verteilt   Revisionskontrollsystem kann Daten machen   zuverlässig verschwinden. die Bereitstellung der   Illusion einer solchen Steuerung könnte leicht   gibt ein falsches Gefühl der Sicherheit, und seine   schlimmer als es überhaupt nicht bereitgestellt wird.

Die übliche Art und Weise verpflichten Änderungen rückgängig machen wird von Mercurial durch den backout Befehl unterstützt (wiederum Quecksilber-Buch: mit engagierten Änderungen zu tun ), aber die Informationen aus dem Repository nicht verschwindet: da man nie, wer genau geklonte Repository weiß, dass würde ein falsches Gefühl der Sicherheit, wie oben erläutert.

Andere Tipps

Es ist richtig, dass man nicht einfach eine bestimmte Datei von Mercurial im Sinne entfernen kann, dass so in Ihrem Repository all changeset IDs stören tun. Wenn Sie die changeset IDs ändern, muss jeder neu Klon des Repository. Sehen Sie sich die Wiki-Seite zum Bearbeiten von Geschichte für Informationen über die Folgen der Geschichte in Mercurial zu modifizieren.

Wenn das ist in Ordnung für Sie (interne Repository in einem Unternehmen), dann nehmen Sie einen Blick auf die konvertieren Erweiterung . Es kann do hg → hg Conversions und hat ein -. FileMap Argument, das zu verwendet werden kann ausschließen Dateien, unter anderem

Es ist möglich, lokal, aber nicht global, und es ändert sich die ID von jedem Commit nach dem Punkt, an dem die Datei hinzugefügt wurde. Um die Änderung zu kleben, haben Sie Zugriff auf jede einzelne Kopie des Repository benötigen, vor allem diejenigen, die aus bekommen gezogen oder geschoben.

Wie gesagt, habe ich die Bearbeiten Geschichte Sequenz auf dem Mercurial Wiki beschrieben eine Datei von einem meines Repositories zu entfernen. Diese Sequenz geht davon aus, dass Revision 1301: 5200a5a10d8b die Datei path/to/badfile.cfg hinzugefügt, die nicht in einer späteren Revision geändert wurde:

  1. Aktivieren Sie die MQ-Erweiterung in Ihrem .hgrc:

    [extensions]
    mq =
    
  2. Ziehen Sie den letzten Änderungen von Upstream.

    hg pull
    
  3. alles aus der Datei zusätzlich importiert weiter in MQ:

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. Entfernen Sie die Datei aus dem Commit, dass hinzugefügt es.

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. Konvertieren Sie die Patches in neue Mercurial Revisionen.

    hg qpush -a
    hg qfinish -a
    
  6. Drücken Sie die neuen Versionen im Upstream.

    hg push -f
    
  7. Auf der Upstream-Repository und jede einzelne andere Kopie, entfernen Sie die alten Versionen.

    hg strip 5200a5a10d8b
    

Warnung : Dieser Schritt Arbeit zerstören kann, es sei denn, Sie vorsichtig sind. Wenn jemand etwas seit dem letzten Mal begangen hat man von stromaufwärts gezogen, dann werden Sie diese Arbeit vor dem Strippen rebase müssen. Leider ist die rebase Verlängerung nicht hilfreich hier; Sie werden wieder MQ verwenden müssen, um die neuen Commits in Patches Umwandlung, die Sie auf die neue Spitze anwenden.

Viel Glück.

Es kann in weniger als 10 Minuten durchgeführt werden. in einem einzigen Repository, obwohl es Konsequenzen.

Wie: Verwenden Sie hg in diese hervorragende Anleitung, wie konvertieren . Grundsätzlich Sie „convert“ eine Hg-Repo in ein neues Hg Repo, aber Sie erhalten eine Liste von Dateien angeben, bei der Konvertierung auszuschließen. Dies ist ein Auszug der wichtigsten Schritte:

Make sure all your teammates have pushed their local changes to the central repo (if any)
Backup your repository
Create a "map.txt" file:

# this filemap is used to exclude specific files
exclude "subdir/filename1.ext"
exclude "subdir/filename2.ext"
exclude "subdir2"

Run this command:
hg convert --filemap map.txt c:/oldrepo c:/newrepo
NOTE: You have to use "forward-slash" in paths, even on windows.
Wait and be patient
Now you have a new repo at c:\newrepo but without the files

Wie für die Folgen ...

  • alle changeset IDs nach den Dateien, die Sie wurden hinzugefügt ausschließen wollen anders sein
  • die neue „saubere“ Haupt-Repository müssen manuell anstelle der vorhandenen
  • gesetzt werden
  • alle Teammitglieder müssen neue Klone des Haupt Repo machen
  • alle anderen Dienste, die mit Hg integrieren kann Aufmerksamkeit erfordern (zum Beispiel die issue tracker, ein Code-Review-System usw.).

hg Transplantation, dann hg Streifen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top