StackOverflowで他のMercurialの大文字と小文字を区別する回答を見たことがあります。UNIXのような大文字と小文字を区別するファイルシステムにアクセスできる場合は、そこをチェックして修正する必要があると言われています。問題は、UNIXボックスにアクセスできないことです。私はWindowsアプリケーションを開発しているWindows開発者です。
Unixボックスなしでこれを修正するにはどうすればよいですか?
StackOverflowで他のMercurialの大文字と小文字を区別する回答を見たことがあります。UNIXのような大文字と小文字を区別するファイルシステムにアクセスできる場合は、そこをチェックして修正する必要があると言われています。問題は、UNIXボックスにアクセスできないことです。私はWindowsアプリケーションを開発しているWindows開発者です。
Unixボックスなしでこれを修正するにはどうすればよいですか?
filesystem
Mercurialの次のバージョンに含まれる予定のヘルプトピックがあります。
https://www.mercurial-scm.org/pipermail/mercurial-devel/2012-April/039522.html
衝突するファイルの名前を変更する
大文字と小文字を区別しないファイルシステムでは、大文字と小文字が一致するファイルを含むリビジョンへの更新は、
--check
またはを使用しても中止され--clean
ます。このようなリビジョンを修復するには、大文字と小文字を区別するファイルシステム上の衝突するファイルの一方または両方に新しい名前を付け、それらをコミットして新しい衝突防止リビジョンを作成する必要があります。
..注::大文字と小文字を区別しないファイルシステムでこのようなリビジョンを参照または修復する(または修復する必要がある)場合は、「手動で更新する」セクションを参照してください。
:hg:
merge
が中止されたが、:hg:update --check
が各リビジョンに対して成功した場合、マージされるリビジョン間で衝突が発生します。この場合、マージする前に衝突を避けるために、一方または両方のファイルの名前を変更する必要があります。
最近のMercurialでは、大文字と小文字を区別しないファイルシステムでも、以下の手順でファイル名の大文字と小文字を安全に変更できます。
$ hg rename a.txt tmp $ hg rename tmp A.TXT
手動で更新する
大文字と小文字を区別しないファイルシステムで大文字と小文字を区別しないファイルシステムで大文字と小文字を区別しないファイルシステムで大文字と小文字を区別する衝突を引き起こすリビジョンで作業ディレクトリを更新する(または更新する必要がある)場合、たとえば、そのようなリビジョンで衝突するファイルの名前を変更したり、コンテンツを参照したりする場合は、以下のWikiページを参照してください。
https://www.mercurial-scm.org/wiki/ManualCheckout
これは、専門家でないMercurialユーザーにはお勧めしません。
別の同様の手動の方法をここで説明します。
https://www.mercurial-scm.org/wiki/FixingCaseCollisions
ただし、これはMercurialの内部にもかなり深く入り込んでいるため、最後の手段でない限り、これは避ける必要があります。
HGの名前変更コマンドを発行することにより、大文字と小文字を区別するファイルシステムに頼ることなくこれを解決しました。「Foo.txt」を「foo.txt」と呼ぶ必要があるため、問題が発生しているとします。
hg rename Foo.txt Foo.txt.renamed
hg rename Foo.txt.renamed foo.txt
この問題は、ファイルが削除された後、同じ名前で大文字と小文字が異なるメインリポジトリに再作成されたときに発生しました。これらの変更の前に作成されたブランチリポジトリは、メインリポジトリからの変更セットがプルされているにもかかわらず、マージできませんでした。
Windowsでのケースフォールディングの問題を取得するには、リポジトリ内のさまざまなブランチまたはヘッドでさまざまなケースがあると思いますが、マージするときに問題になります。(Windowsでは)UNIXボックスを経由せずに、同じリビジョンで2つの異なるケースを実際に取得する方法がわかりません。
したがって、それらが異なるリビジョンにある場合は、次のようなことを行うことができます。
hg update <some rev>
hg remove -A -f "Some File"
その後、マージは正常に成功します。-Aは「後」を表し、-fは「強制」します。
大文字と小文字を区別するファイルシステムを使用しない場合のWindowsでの通常の問題。インストール済みで実行する場合はTortoiseHg Workbench
、ファイルを検索して名前を変更します。
右クリック/TortoiseHg/ファイル名の変更
ファイルの名前が大文字と小文字を区別する適切な名前に変更されます。次の写真は私がどのように変わっXMLConverter
たかを示していますXmlConverter
次に、Workbenchで、ファイルの変更をコミットできます。
これは1週間後に更新されました
提示された解決策により、後で別のPCからリポジトリ全体を更新する際に問題が発生する可能性があります。したがって、それを解決するための究極の方法は、2つのコミットを行うことかもしれません。
だからそれはこのようになりました:
これは実際には、Windowsで競合を起こさない方法です。見た目は醜いですが効果的です。
Bitbucket.orgを使用している場合は、問題のあるブランチのソースを参照し、ファイルに移動し、編集してドロップダウンをクリックし、ファイルの名前を変更して(この場合はディレクトリの名前を変更して)、変更をコミットしてプルします。
Bitbucketチームに感謝します!
私はもっと簡単な方法で解決しました:
それが実際に問題を引き起こしているのは、機密性の低いシステムの場合に同じである可能性のあるファイル/フォルダーを同時に作成および削除しようとしていることです。
この問題が発生しましたが、*nixシステムを使用することはできませんでした。私はこれらの指示に従ってそれを解決することができました。
Windowsでは、現在(Mercurial 1.1より前)、リポジトリにケースの衝突を導入して、リポジトリをチェックアウトできないようにすることができます。
このようなリポジトリを修復する1つの方法は、大文字と小文字を区別するUnixシステムでリポジトリをチェックアウトし、問題のあるファイルを削除して、再度コミットすることです。
それが不可能な場合は、次のようにすることができます。
hg clone --noupdate repo repair
cd repair
hg debugsetparents <bad revision>
hg debugrebuildstate
この時点で、Mercurialは、不正なリビジョンがチェックアウトされており、すべてのファイルが欠落していると見なします(ステータス'!')。リポジトリを修正するには、次のことを行う必要があります。
hg remove --after <file causing the collision>
これで、hg statusは、状態「R」の厄介なファイルと状態「!」の他のすべてのファイルを表示するはずです。これで、修正をチェックインできます。
hg commit --message "fix case collision"
すべてのファイルを元に戻すには、もう一度チェックアウトします。
hg update tip
参照:https ://www.mercurial-scm.org/pipermail/mercurial/2008-June/019921.html
私はこれが古い質問であることを知っていますが、これは私にとってうまくいったことであり、誰かに役立つことを願っています。私の場合、閉じる必要のある古いブランチを持つレガシーリポジトリがありました。
私はこれを解決するためにWindows10のWindowsbashシェルに使用しましlxrun /install
たが、それがセットアップされたときにmercurialをインストールしsudo apt-get install mercurial
ました。これにより、mntフォルダーを介してファイルシステムにアクセスでき、コマンドラインからmercurialを使用できます。
私の場合、問題のあるブランチに簡単に更新して閉じることができました。
Laurens Holstが言ったように、一時ファイルシステムを通過するフォルダ/ファイルの名前を変更することは私にとってはうまくいきました。
$ hg rename a.txt tmp
$ hg rename tmp A.TXT
しかし、それを機能させ、マージ中のファイルの衝突エラーを回避するために、名前を変更した後にパージする必要がありました