我的Git存储库经常出现问题。我在Windows中开发,我的生产站点在Linux下。有好几次,git显示所有被跟踪为修改过的文件。我认为这是因为Windows和Linux之间的混淆问题或冲突,但今天早上,当我检查Linux repo时,它显示所有文件都已修改。
为了增加对伤害的侮辱,我使用的两个Linux repos(1个用于prod,1个用于测试)显示相同。我别无选择,只能提交所有文件,因为硬重置或结账都没有对工作目录进行任何更改(是的,我非常喜欢这个)。这是提交的结果:
Created commit #######: Git, you are so mean...
1521 files changed, 302856 insertions(+), 302856 deletions(-)
关于如何在下次发生时对此进行排序的任何想法?
答案 0 :(得分:9)
正如Bombe所说,这听起来像是一个终结问题。我在Github上看到的最简单的讨论是this guide。
您希望在Windows系统上设置core.autocrlf
,以便当您从repo签出到工作目录时Git会自动将行结尾更改为CRLF,并在将文件提交到工作目录时相反地将所有CRLF更改为LF回购:
$ git config --global core.autocrlf true
然后,您可以通过克隆Linux repo或git reset
来确保您的repo具有一致的行结尾,$ git reset --hard HEAD
检出新的工作副本,将新的autocrlf设置应用于所有LF:
autocrlf
编辑 - 如果Git无法将文件识别为二进制文件,.gitattributes
可能会通过更改其认为的CRLF或LF来破坏文件。如果您的repo包含不常见的二进制格式文件类型,请在{{1}}中明确声明其转换类型,如manpage中所述。
答案 1 :(得分:6)
听起来像一个行结束的问题。点击man git-config查看core.autocrlf
。
答案 2 :(得分:0)
我认为你需要解决的真正问题是,文件是如何不同的,是你期望看到的差异?
传统的默认设置是git不会将git add
上的文件内容完全更改为存储库。更新的Windows git
安装程序启用core.autocrlf
,它将结帐时的unix转换为Windows行结尾,反之添加到存储库。
出于这个原因,如果您有更多未经跟踪的更改,那么git add
所有待处理文件通常是个好主意(例如,通过git add -u
)。
在此阶段,将应用任何清洁/涂抹过滤器,git diff --cached
应该给出合理的差异。
如果您有git认为不同的暂存文件,但差异不可见,您可能需要查看原始字节以查看不可见字符是否存在任何差异。
您可以使用hexdump
之类的工具。
假设myfile.txt
存在不可见的差异,您可能需要尝试这样的事情。
# Extract raw versions of the differing files and hexdump to some temporary files
git cat-file blob :myfile.txt | hexdump -C >myfile-stagetmp.bytes
git cat-file blob HEAD:myfile.txt | hexdump -C >myfile-headtmp.bytes
# Diff them. (Yes, you don't have to use git diff!)
git diff --no-index myfile-stagetmp.bytes myfile-headtmp.bytes