
どういうわけか、リモートリポジトリ内のファイルのリストを表示する必要がありました。 どういうわけか、同時にクローンを作りたくなかったのです。 インターネットでの検索は、予想どおり、「不可能です、クローンを作成します」などの多くの答えを与えました。 そして、リンクにソースコード付きのアーカイブに対応するリポジトリが含まれていることを確認する必要があります。 「何らかのリンク」がこのアーカイブの内容の説明(より正確には、このアーカイブへの追加)を含むページにあるため、ファイルのリストのみを比較するだけで十分であるように思えました。 になる方法
もちろん、Mercurialは実質的にリモートリポジトリ機能を提供しません。 より正確には、プッシュとプルを行うことができます(後者の特殊なケースとしてクローンを作成します)。 しかし、ファイルシステムに影響を与えずにプルすることは可能ですか? 回答:それは可能です、
hg incoming
はここで助けてくれます。 実際には、操作アルゴリズムは次のとおりです。
- 新しい空のリポジトリをどこかに作成します。 空のリポジトリでは、任意のリポジトリから
pull
できます。 hg incoming
を使用して変更のリストを取得します。 hg incoming
はhg log
と同じ関数を使用するため、出力を変更する可能性に制限はありません。 特に、各リビジョンで変更されたすべてのファイルのリストを取得したり、 unified diff
形式(バイナリファイル用のgit
拡張付き)で変更自体を取得することもできます。 Diffは必要ありませんが、変更されたすべてのファイルのリストは役立ちます。- 途中ですべてのリビジョンを取得するので、ロディリーのリストに加えて、各変更に子のリストを追加できます。 監査の先祖ではない子供、私たちが興味を持っているファイルのリストがないことは、私たちを悩ませません。
- Mercurialには1つのリビジョンがありますが、これはすべてのリポジトリに必ず存在し、同時に、実際には単一の親を持たない唯一のリビジョンです:
-1:0000000000000000000000000000000000000000
。 これは良い出発点です。
このリビジョン以降、他のすべてのリビジョンのファイルのリストが見つかります(最初のリビジョンのファイルのリストは既知です:空です)。 このために
- 最初のリビジョンを除く各リビジョンについて、最初の親からファイルのリストを取得します。 親から子への改訂費用。
- 追加したファイルのリストをこのリストに追加します(
paths
タグでhg incoming --style xml --verbose
:を使用すると取得されます)。 - 削除されたファイルのリストをこのリストから削除します(同じ場所で判明します)。
- これで、子孫が1つもないリビジョンが見つかりました。 これは、
hg incoming --rev revspec
によって要求されるリビジョンになります。 このリビジョンを見つけたら、その中のファイルをリストします。
デフォルトのフォーマットで
hg incoming
する出力
hg incoming
は、このような操作には使用できないことに注意してください。 テンプレートを
{file_adds}
、
{file_mods}
および
{file_dels}
で記述するか、
{file_adds}
テンプレート
--style xml
ます。
--template
はここでは役に立ちません。 独自の形式を作成すると、XMLのsaxパーサーを使用する場合に比べてコードが大幅に削減されますが、--
--style xml
を
--style xml
ます。
使用法:
python -O list_hg_files.py bitbucket.org/ZyX_I/aurum tip
python -O list_hg_files.py bitbucket.org/ZyX_I/aurum tip
。 両方の引数(リモートリポジトリURLとリビジョン指定子)が必要です。