bugfix> git > 投稿

githubに、Macbookおよびライブサーバー(unix)と同期するリモートリポジトリがあります。 現在、次のエラーが発生して、Macbookからリモートにプルまたはプッシュできません。

error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

ローカルの作業コピーに4つのファイルがあります。

modified:   app/webroot/files/uploads/ABC.png
Untracked files:
(use "git add <file>..." to include in what will be committed)
app/webroot/files/get/Ä Ö ü.pdf
app/webroot/files/uploads/xyz Übc.png
app/webroot/files/uploads/def äbc.png

4つの関連ファイルはすべて、サーバー上のユーザーアップロードから取得されます(gitignoreによっておそらく無視されるはずでしたが、ここにいます...)

最初の/変更されたファイル(ABC.png)は、おそらくリポジトリにabc.pngとABC.pngの両方があるため、私のMacbookで大文字と小文字が区別されないためです。ただし、これらは顧客サーバーへのアップロードなので、どちらも削除することはできません。だから、これは私が今のところ回避できない最初の問題です。

他のファイルについては、それらを取り除く方法がまったくわかりません。他の場合と重複しないため、特殊文字が疑われます。ローカルリポジトリ全体を削除して再度クローンを作成しましたが、これらの4つのファイルがすぐに付属しており、今まで試したものはすべて機能しませんでした(git clean -ndx、git reset --hard、git fetch with all kind of parameters)。

通常、プルやプッシュは、ローカルの追跡されていないファイルや変更されたファイルがあっても、それらのファイルがコミットの影響を受けない限り、正常に機能します。でも今回は何もできないし、なぜか分からない...

gitの専門家がここで私を助けてくれることを願っています!

回答 1 件
  • この状況に対処することは非常に困難です。そうではありません不可能な、しかし利用可能なツールは本当に十分ではありません。

    問題は、あなたが疑うことだけです。ホストOSは、Gitではなく、Gitを使用している誰かが違反したファイル名(パス名)の特定の要求を行います。ギット 誰かが両方 ABC.png を作ったことを気にしません  および abc.png ;ギット これらの両方のパス名を別々に保存できます。しかし、あなたのワークツリー、あなたがあなた自身の仕事をする場所、きみの コンピューターする 両方のファイルを保持することを許可し、拒否します。ウムラウト付きのファイル名は似ていますが、多少異なります。UTF-8では、そのような名前を構成文字のシーケンスとして、またはウムラウトが「組み込まれた」コードポイントを使用して表現できます。 Gitはどちらも許可しますが、MacOSはMacOSが好む名前を使用することを強制します。

    つまり、このリポジトリを使用するには、ワークツリーを使用せずに、または少なくともGitの通常のワークツリーメカニズムを使用せずに作業する必要があります。 git update-index を使用してこれを行うことは可能ですが、一般的には非常に苦痛です 、未加工のバイト文字列と git cat-file -p で作業できるようにします 、ハッシュIDで基になるGitオブジェクトを抽出できます。

    Macでこれを処理する最も簡単な方法は、例えばvagrantを使用してLinuxをVMにインストールすることです。その後、Linuxシステムがあります。する 両方の名前の大文字と小文字のファイルを使用できるようにします。これにより、UTF-8名にUnicode正規化を適用しようとしません。

あなたの答え