Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';git状态';将二进制文件显示为修改后的文件';s和文件模式不相同_Git_Github - Fatal编程技术网

为什么';git状态';将二进制文件显示为修改后的文件';s和文件模式不相同

为什么';git状态';将二进制文件显示为修改后的文件';s和文件模式不相同,git,github,Git,Github,我在Ubuntu14.04Linux上的GitRepo中添加了一些二进制文件,将这些文件推送到GitHub远程设备,然后将它们拉到OS X El Capitan和Windows 10上的现有克隆中git状态显示这些文件中的一些已修改,即使它们尚未被触摸。即使在git重置--hard和git checkout之后,它仍会继续显示它们已更改 注意,我正在使用Git LFS(大文件存储)处理这些文件 以下是OS X上git diff的输出,其中只有1个文件显示为已修改: Marks-MacBook:K

我在Ubuntu14.04Linux上的GitRepo中添加了一些二进制文件,将这些文件推送到GitHub远程设备,然后将它们拉到OS X El Capitan和Windows 10上的现有克隆中git状态显示这些文件中的一些已修改,即使它们尚未被触摸。即使在
git重置--hard
git checkout
之后,它仍会继续显示它们已更改

注意,我正在使用Git LFS(大文件存储)处理这些文件

以下是OS X上git diff的输出,其中只有1个文件显示为已修改:

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

文件在
.gittributes
中标记为
-text
,因此EOL标记不会出现任何问题。还有什么会导致不同的sha1结果和git diff报告的二进制文件不同

我为
*.a
文件添加了
diff=bin
.gittributes
,其中
bin
使用
textconv=hextdump-v-C
。在此之后,
git diff
报告没有差异,但是
git status
仍然显示修改后的文件

作为附加测试,我将原始的.a文件从linux复制到OSX,并使用diff将其与git工作树中的副本进行比较。它们是相同的git status报告我复制的工作树文件未修改

有什么建议吗

以下内容不再正确;回购已按照我的回答中所述进行了修复。

你可以自己试试。回购和分行位于GitHub的。在OS X上显示问题的文件是
other_lib/linux/Release-x64/libSDL2main.a
其他库/linux
下的任何其他
.a
文件都没有问题


在Windows上,还有一些文件显示为已修改,包括Linux上的一些符号链接。现在我想集中讨论OS X案例,因为它更简单。

我解决了问题。它是在Linux主机上配置的。感谢您提醒我查看git lfs配置

在Linux主机上运行
git lfs init
,删除二进制文件并将其重新添加到repo,然后推送到远程,解决了这个问题。要将更新拉到OSX和Windows主机上,我必须在它们上运行
git reset--hard
,以便在没有违规文件的情况下重置回提交


我没有运行过
git lfs init
,我认为这一步将是
apt get install运行的脚本的一部分。这意味着这些文件实际上并没有存储在LFS中,因为Linux主机上的污迹和干净过滤器没有ops,但是
.gittributes
文件导致OS X和Windows主机在签出时运行LFS污迹过滤器。

您是否在Mac和Windows主机上正确配置了git LFS?可能这与访问权限有关:您能详细说明一下吗?我也有同样的问题。在OSX中一切都很好(我甚至不需要做
git-lfs-pull
,只需
git-checkout
就会自动下载大文件)。但是,当我在Linux中克隆时,
git checkout
不会自动下载文件,而且,如果我
git lfs pull
,它们都会显示为已修改,但没有在
git status
中暂存。因为git lfs init没有在Linux上运行,所以当我添加新的大.a文件时,它们以标准方式存储在git repo中,即整个文件而不是链接。然后,我将这些文件推送到远程,并将它们拉到OS X。在安装GIT LFS过滤器的OS X上,GIT diff运行LFS clean过滤器,我猜想,该过滤器将文件更改为指向LFS存储链接的引用。因此,diff失败,因为它正在将repo中存储的完整文件与LFS存储的链接进行比较。希望这有帮助。
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