少し前に、ブランチ間で更新するときに、hg がリポジトリ内のファイルのバージョン管理されていないコピーを一見ランダムな時間に作成し始めたことに気付きました。これが起こり始めるために自分が何を変えたのか、一生考えることができません。詳細出力またはトレース出力には、これらのファイルが作成されていることを示すものは何もありません。
バージョン管理されていない新しいファイル名はすべて、拡張子の末尾に追加されたランダムな文字列のように見えるもので終わります。
file1.txt-23121dd1
someotherfile.sql-bc769bd2
bizarrofile.cs-40a93ed0
hgisinvadingurhead.ppt-f8e9015a
この出来事のパターンを特定しようとすると、次のことに気付きました。
- ファイル名に追加された文字は、リポジトリ内の変更セット ID と一致しません。
grep -i
の出力を実行しhg history
ましたが、ファイル名の文字列が出力のどこにも表示されません。 - すべての場合において、ファイルは私が作業していたブランチに存在していましたが、更新先のブランチには存在しませんでした。
- 1 つまたは 2 つのファイルだけの場合もあれば、複数の場合もあります。
- これらのファイルがすべて 1 つのブランチに存在し、他のブランチには存在しないということは決してありません。
- 更新間で同じバージョン管理されていないファイルのセットになることは決してありません。
- 同じリポジトリを複製している私のチームの他の人は、これを経験していないようです
おそらくリポジトリ内の何かだと思いましたが、他の既存のリポジトリや新しいリポジトリでも発生します。
たとえば、私はこれを行いました(最後に hg ステータス出力を除いて hg 出力は省略されましたが、出力からエラーは発生しません):
c:\> mkdir repo
c:\> cd repo
c:\repo\> hg init
c:\repo\> echo default > default.txt
c:\repo\> hg add
c:\repo\> hg commit -m "Commit default"
c:\repo\> hg branch branch1
c:\repo\> echo branch1 > branch1.txt
c:\repo\> hg add
c:\repo\> hg commit -m "Commit branch1"
c:\repo\> hg update default
c:\repo\> hg status
? branch1.txt-23121dd1
これは毎回繰り返されるわけではありません。これらの手順を繰り返すと、バージョン管理されていないファイルが最後にある場合とない場合があります。とても散発的です。ただし、大規模なリポジトリでは、ほとんどの場合、ブランチの更新の間に少なくとも 1 つのバージョン管理されていないファイルが表示されます。
次の完全な出力hg update default
。バージョン管理されていないファイルが作成されているかどうかにかかわらず、出力は常にそのように表示されます。
resolving manifests
calling hook preupdate.eol: <function preupdate at 0x0000000002571668>
removing branch1.txt
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
最初に気付いたときは古いバージョンの hg を使用していましたが、2.3.2 にアップデートした後も問題は解決していません。TortoiseHG 2.5.1 x64 で Windows 7 Pro x64 を使用しています。ただし、コマンドラインから hg を使用するだけで問題を再現できるため、Tortoise とは関係ないと思います。
私の mercurial.ini ファイルの内容は次のとおりです。
[ui]
username=myname <myname@mydomain.com>
ignore=C:\users\myusername\.hgignore
verbose=true
trace=true
[eol]
native = CRLF
only-consistent = False
[extensions]
purge =
eol =
私はそれを受け入れることができますが、これらのファイルを他の新しいファイルと一緒に変更セットのリポジトリに誤って追加しないようにするのは面倒です。
誰かがこれを見て、犯人を教えてくれたら、とても感謝しています!