50

私はすでにこれに対する答えを知っていると思いますが、とにかく尋ねると思いました:

機密情報を含むファイルが Mercurial リポジトリに追加されました。リポジトリ全体を削除せずに、変更履歴とともにそのファイルを削除する方法はありますか?

4

5 に答える 5

24

いいえ、できません。それについての水銀の赤い本のセクションであってはならない変更を読んでください。特に、この段落を含むサブセクションをエスケープする機密性の高い変更についてはどうですか:

また、Mercurial は、ファイルや変更セットを履歴から完全に消去する方法も提供していません。強制的に消去する方法がないからです。誰かが自分の Mercurial のコピーを簡単に変更して、そのような指示を無視することができます。さらに、Mercurial がそのような機能を提供したとしても、単に「このファイルを消去する」変更セットをプルしなかった人は影響を受けず、Web クローラーが間違った時間にアクセスしたり、ディスク バックアップやその他のメカニズムにアクセスしたりすることもありません。 . 実際、データを確実に消去できる分散リビジョン管理システムはありません。そのようなコントロールの錯覚を提供すると、誤った安心感を簡単に与えることができ、まったく提供しないよりも悪いことになります。

コミットされた変更を元に戻す通常の方法は、mercurial によってbackoutコマンド (繰り返しますが、mercurial book:コミットされた変更の取り扱い) によってサポートされていますが、情報はリポジトリから消えません。安心感は前述の通り。

于 2009-06-23T03:07:47.857 に答える
7

ローカルでは可能ですが、グローバルではなく、ファイルが追加された時点の後に各コミットの ID を変更します。変更が定着するためには、リポジトリのすべてのコピー、特にプルまたはプッシュされたものにアクセスする必要があります。

そうは言っても、Mercurial wiki で説明されている編集履歴シーケンスに従って、リポジトリの 1 つからファイルを削除しました。このシーケンスは、リビジョン 1301:5200a5a10d8b がファイルを追加したことを前提としています。このファイルpath/to/badfile.cfgは、後続のリビジョンでは変更されていません。

  1. で MQ 拡張機能を有効にします.hgrc

    [extensions]
    mq =
    
  2. アップストリームから最近の変更をプルします。

    hg pull
    
  3. ファイルの追加以降のすべてを MQ にインポートします。

    hg qimport -r 1301:tip
    hg qpop -a
    
  4. ファイルを追加したコミットからファイルを削除します。

    hg qpush 1301.diff
    hg forget path/to/badfile.cfg
    hg qrefresh
    
  5. パッチを新しい Mercurial リビジョンに変換します。

    hg qpush -a
    hg qfinish -a
    
  6. 新しいリビジョンを上流にプッシュします。

    hg push -f
    
  7. アップストリーム リポジトリと他のすべてのコピーで、古いリビジョンを削除します。

    hg strip 5200a5a10d8b
    

警告: 注意しないと、このステップは作業を破壊する可能性があります。最後にアップストリームからプルしてから誰かがコミットした場合は、ストリップする前にその作業をリベースする必要があります。残念ながら、rebase拡張機能はここでは役に立ちません。MQ を再度使用して、新しいコミットを新しいヒントに適用するパッチに変換する必要があります。

幸運を。

于 2011-11-22T14:23:30.247 に答える