Mercurialの単一ファイルの履歴を削除する方法はありますか?
-
06-07-2019 - |
質問
これに対する答えはすでに知っていると思いますが、とにかく尋ねると思いました:
機密情報を含むMercurialリポジトリに追加されたファイルがあります。リポジトリ全体を削除せずに、変更履歴とともにそのファイルを削除する方法はありますか?
解決
いいえ、できません。 必要な変更を読むそれに関する水銀のレッドブックのセクションではない 。特に 機密性の高い変更についてはどうですか サブセクションには、この段落が含まれています:
Mercurialも方法を提供しません ファイルまたはチェンジセットを完全に作成するには 歴史から消える その実施する方法はありません 失;;誰かが簡単にできる Mercurialのコピーを次のように変更します そのようなディレクティブを無視します。加えて、 Mercurialがそのような 能力、単に持っていなかった人 “このファイルを非表示にする” チェンジセットは影響を受けませんが、 また、ウェブクローラが 間違った時間、ディスクのバックアップ、またはその他 メカニズム。確かに、配布なし リビジョン管理システムはデータを作成できます 確実に消えます。提供する そのような制御の錯覚は簡単に 誤った安心感を与え、そして まったく提供しないよりも悪い。
コミットされた変更を元に戻す通常の方法は、 backout
コマンドを介してmercurialによってサポートされています(繰り返しますが、mercurial book: コミットされた変更への対処 )が、情報はリポジトリから消えません。上記で説明したように、リポジトリのクローンを作成します。これにより、誤ったセキュリティ感が生じます。
他のヒント
Mercurialから特定のファイルを簡単に削除できないことは正しいことです。削除すると、リポジトリ内のすべての変更セットIDが混乱するためです。チェンジセットIDを変更すると、誰もがリポジトリを再クローンする必要があります。 Mercurialで履歴を変更した場合の結果については、履歴の編集に関するウィキページをご覧ください。
それで問題ない場合(会社の内部リポジトリ)、をご覧ください。拡張機能を変換。 hg→ hg 変換。引数-filemap を使用して、除外ファイルなどに使用できます。
ローカルでは可能ですが、グローバルではなく、ファイルが追加されたポイントの後に各コミットのIDを変更します。変更を適用するには、リポジトリのすべてのコピー、特にプルまたはプッシュされるものにアクセスする必要があります。
そうは言っても、Mercurial wikiで説明されている編集履歴の手順に従っています。リポジトリからファイルを削除します。このシーケンスは、リビジョン1301:5200a5a10d8bがファイル path / to / badfile.cfg
を追加し、その後のリビジョンでは変更されなかったことを前提としています。
-
.hgrc
でMQ拡張機能を有効にします:[extensions] mq =
-
アップストリームから最近の変更をプルします。
hg pull
-
ファイル追加以降のすべてをMQにインポートします。
hg qimport -r 1301:tip hg qpop -a
-
ファイルを追加したコミットからファイルを削除します。
hg qpush 1301.diff hg forget path/to/badfile.cfg hg qrefresh
-
パッチを新しいMercurialリビジョンに変換します。
hg qpush -a hg qfinish -a
-
新しいリビジョンをアップストリームにプッシュします。
hg push -f
-
アップストリームリポジトリおよびその他すべてのコピーで、古いリビジョンを削除します。
hg strip 5200a5a10d8b
警告:注意しない限り、この手順は作業を破壊する場合があります。前回アップストリームからプルしてから誰かが何かをコミットした場合、ストリップする前にその作業をリベースする必要があります。残念ながら、ここでは rebase
拡張機能は役に立ちません。 MQを再度使用して、新しいコミットを新しいヒントに適用するパッチに変換する必要があります。
がんばって。
10分以内に完了します。結果がありますが、単一のリポジトリで。
方法:この優れたガイドで説明されているようにhg変換を使用する。基本的に、あなたは「変換」します; Hgリポジトリを新しいHgリポジトリに追加しますが、変換中に除外するファイルのリストを指定できます。これは重要な手順の抜粋です。
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
結果については...
- 除外するファイルが追加された後のすべての変更セットIDは異なります
- 新しい「クリーン」メインリポジトリを既存のリポジトリの代わりに手動で配置する必要があります
- すべてのチームメンバーは、メインリポジトリの新しいクローンを作成する必要があります
- Hgと統合する他のサービスには注意が必要な場合があります(例:問題追跡システム、コードレビューシステムなど)
hg移植、次にhg strip