5

以前は、mercurialでlargefiles拡張機能を使用して、作業中のコードと一緒にデータを保存してきました。これは間違いだったと思います。「largefiles」ディレクトリ(8GB)を削除したいと思います。ネットワークユーザーディレクトリは10GBに制限されており、スペースが必要です。私は長い間大きなファイルを使用していません。彼らが永遠に去ったとき、私は彼らを見逃すことはありません。

だから私の質問は

  1. リポジトリに損傷を与えることなく、.hgの下のlargefilesディレクトリを削除できますか?
  2. そうすると、大きなデータファイルが欠落している場合でも、古いコードをチェックアウトできますか?
  3. 別のクローンのラージファイルですべてのリポジトリが再び汚染されないように、そのリポジトリのすべてのクローンからこれらのファイルを削除する必要がありますか?
4

2 に答える 2

5

あなたの最初の質問のために、私は実験をしました:

  1. 大きなファイルでレポを作成しました。
  2. hg update null
  3. 削除しました.hg\largefiles
  4. hg update

大容量ファイルが帰ってきた!少なくとも Windows では、大きなファイルも にキャッシュされていることがわかりました%UserProfile%\AppData\Local\largefiles。これは私の唯一の大きなファイル データベースだったので、大きなファイルが 1 つしか含まれていなかったので、それも削除しました。このキャッシュには、複数のローカルのラージファイル対応データベースからの大きなファイルが含まれているため、これには注意する必要があります。2 つのコピーを持つのが無駄だと思われる場合は、ローカル データベースが と同じドライブにある%UserProfile%場合、それらがハードリンクされていることがわかります。システムに 2 つのドライブがあり、データベースが別のドライブにある場合、データベースはそのAppData場所にコピーされますが、ハードリンクされず、ディスク使用量が 2 倍になります。

大きなファイルのすべてのコピーが削除されると、hg update次のようになりました。

1 files updated, 0 files merged, 0 files removed, 0 files unresolved
getting changed largefiles
largefile.dat: can't get file locally
(no default or default-push path set in hgrc)
0 largefiles updated, 0 removed

次に、拡張機能を無効にするために削除[extensions], largefiles=しました。.hg\hgrcこの時点で、リポジトリは正常に機能していましたが、以前.hglfは大きなファイルが含まれていた変更セット内のハッシュを含むディレクトリがまだありました。2 番目の質問に対する答えは「はい」です。古いコードをチェックアウトできます。

3 番目の質問については、大きなファイルとハッシュの痕跡をすべて排除するために、次のファイルを作成します。

exclude .hglf

そして実行します:

hg convert --filemap <file> <srcrepo> <destrepo>

convert は変更セットを変更し、新しいデータベースは古いデータベースと無関係になるため、ユーザーはこの新しい変更されたリポジトリを複製する必要があります。

于 2013-01-22T07:22:06.653 に答える
2

プレーン リポジトリを大きなファイルに変換する同じコマンドlfconvertは、逆方向にも使用できます。

$ hg --config extensions.largefiles= help lfconvert
hg lfconvert SOURCE DEST [FILE ...]

convert a normal repository to a largefiles repository

Convert repository SOURCE to a new repository DEST, identical to SOURCE
except that certain files will be converted as largefiles [...]

Use --to-normal to convert largefiles back to normal files; after this,
the DEST repository can be used without largefiles at all.

したがって、次のコマンドでうまくいきます。

$ hg --config extensions.largefiles= lfconvert --to-normal <LARGEFILE_REPO> <PLAIN_REPO>

次のように、チームと調整する必要があります。

  1. 誰もが最新の変更を大きなファイルのマスター リポジトリにプッシュします。
  2. マスター リポジトリへのアクセスは永久に無効になります (偶発的なプッシュを避けるため)
  3. 誰もがlargefiles拡張子を削除します$HOME/.hgrc
  4. マスター リポジトリへのアクセスを提供しているユーザーのlargefiles拡張子を削除します (の場所は、マスター リポジトリがサーバー、SSH、または HTTP であるかによって異なります)。これにより、誰かが誤って大きなファイルを新しいリポジトリのクローンに追加してプッシュすることができなくなります!hgrchgrc
  5. マスター リポジトリをプレーン リポジトリに変換する
  6. 新しいマスター リポジトリの名前/パスの変更 (ある場合) を決定する
  7. 新しいプレーン マスター リポジトリへのアクセスを有効にする
  8. 誰もが新しいプレーンレポをクローンします

拡張機能が有効になっlfconvertている場合にのみ使用できることに注意してください。largefiles私が提案するのは、ポイント 3 に従って、上記の例に示すように、オプションを$HOME/.hgrc使用して 1 つのコマンドでそれを削除して有効にすることです。--config extensions.largefiles=

また、プレーン リポジトリに変換すると、カーネルのinotifyメカニズム (またはfsmonitorMacOSXでは同等のもの) を使用して. たとえば、私が持っている巨大なリポジトリの場合、10秒から0.5秒になりました:-)hg statushg status

于 2016-06-20T09:57:27.323 に答える