2015-12-29 7 views
5

Ubuntu 14.04 linuxのgit repoにバイナリファイルを追加してGitHubリモートにプッシュし、 OS XおよびWindows 10のgit statusでは、タッチされていなくても変更されたファイルの一部が表示されます。それはgit reset --hardgit checkoutの後でも変更されたものとして表示し続けます。'git status'は、バイナリファイルが変更されていないときとファイルモードが同じであるときに変更したものを表示する理由

注:私はこれらのファイルでGit LFS(Large File Storage)を使用しています。ここで

が変更とのみ1ファイルが示しOS X上のgit diffからの出力は次のとおりです。

Marks-MacBook:KTX mark$ git diff other_lib/linux/Release-x64/libSDL2main.a 
diff --git a/other_lib/linux/Release-x64/libSDL2main.a b/other_lib/linux/Release-x64/libSDL2main.a 
index 4202f6f..2797199 100644 
Binary files a/other_lib/linux/Release-x64/libSDL2main.a and b/other_lib/linux/Release-x64/libSDL2main.a differ 

Marks-MacBook:KTX mark$ git diff --raw other_lib/linux/Release-x64/libSDL2main.a 
:100644 100644 4202f6f... 0000000... M other_lib/linux/Release-x64/libSDL2main.a 

ファイルが.gitattributes-textをマークされているので、すべての問題があってはなりませんEOLマーカーで。何が別のsha1結果とgit diffがバイナリファイルを違うと報告する原因になるのでしょうか?

私はbintextconv = hexdump -v -Cを使用しています*.aファイルに対して.gitattributesdiff=binを追加しました。この後、git diffは差異は報告されていませんが、git statusは修正されたファイルをまだ示しています。

追加のテストとして、元の.aファイルをlinuxからOS Xにコピーし、diffを使用してgit作業ツリーのコピーと比較しました。彼らは同じです。 linux repoクローンのgit statusは、コピーした作業ツリーファイルが変更されていないことを報告します。

提案がありますか?

以下は、もはや真実ではありません。私の答えに記載されているようにレポが修正されました。

自分で試すことができます。レポ&ブランチはGitHubのhttps://github.com/KhronosGroup/KTX/tree/incomingにあります。 OS Xの問題を示すファイルはother_lib/linux/Release-x64/libSDL2main.aです。他の.aファイルには、other_lib/linuxのファイルに問題はありません。

Windowsでは、Linux上のシンボリックリンクを含むいくつかのファイルが変更されて表示されます。私はOS Xのケースに集中したいと思っています。

+0

MacとWindowsホストで正しくgit-lfsを設定しましたか? –

+0

これはアクセスリグに関係するかもしれません: http://stackoverflow.com/questions/1580596/how-do-i-make-git-ignore-file-mode-chmod-changes –

答えて

4

問題を見つけました。これは、Linuxホストの設定で行われました。 git-lfsの設定を確認するためのEdward Thomsonのおかげです。

git lfs initをLinuxホストで実行している場合、&を削除してそこにリポジトリにバイナリファイルを追加し直し、リモートにプッシュすると問題が解決しました。アップデートをOS XとWindowsホストにプルするには、git reset --hardを実行して、問題のないファイルなしでコミットにリセットする必要がありました。

私はこのステップがapt-get installによって実行されるスクリプトの一部であると考えてgit lfs initを実行していませんでした。これは、Linuxホスト上の汚れやきれいなフィルタがno-opsだったのでファイルが実際にLFSに保存されていないことを意味していましたが、.gitattributesファイルが原因でOS XとWindowsホストがチェックアウト時にLFS汚れフィルタを実行していました。

+0

これについて少し詳しく説明できますか?私は同じ問題を抱えています。 OS Xではすべてうまく動作します(私は 'git lfs pull'を実行する必要はありません。単純に' git checkout'は自動的に大きなファイルをダウンロードします)。しかし、私がLinuxでクローンしたとき、 'git checkout'はファイルを自動的にダウンロードせず、' git lfs pull'すれば 'git status'で修正されましたが、ステージングされませんでした。 – cjbottaro

+0

GitのLFSのinitがLinux上で実行されていなかったので、何のGitのLFSフィルタはありませんでした私は新しい大.Aファイルを追加したときに、それらはすなわち、ファイル全体ではなく、リンク、標準的な方法でGitのレポに格納されていました。私はそれらをリモートにプッシュし、OS Xに引き出しました。GIT LFSフィルタが設定されているOS Xでは、git diffがLFSクリーンフィルタを実行しました。ファイルをLFSストレージへのリンクへの参照に変更しました。つまり、リポジトリに格納されている全ファイルとLFSストレージへのリンクを比較していたため、diffは失敗しました。お役に立てれば。 – msc

関連する問題