我有以下设置:
core.symlinks=true
(由于上述原因)core.autocrlf=false
(我不希望git做任何聪明事,我要在Windows和WSL之间共享存储库)此几乎完美运行(印象深刻)。当我克隆一个存储库时,在Windows和WSL中都可以,除了双方之一的符号链接都说它们已修改,但不是。两侧的符号链接均正常工作,我可以正常浏览它们。
最初的克隆(在Windows端)后,Windows PowerShell提供:
PS C:\Users\Matthew\Projects\...> git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
但是在WSL方面,它说两个符号链接已修改:
/mnt/c/Users/Matthew/Projects/...$ git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: t/browser
modified: web/jslib
no changes added to commit
但是git diff没有输出:
/mnt/c/Users/Matthew/Projects/...$ git diff
/mnt/c/Users/Matthew/Projects/...$
如果我然后在WSL侧重置结帐,所有按钮都会轮换:
/mnt/c/Users/Matthew/Projects/...$ git reset --hard HEAD
HEAD is now at ......... Commit message here
/mnt/c/Users/Matthew/Projects/...$ git status
On branch master
Your branch is up to date with 'origin/master'.
nothing to commit, working tree clean
然后回到Windows Powershell:
PS C:\Users\Matthew\Projects\...> git status
On branch master
Your branch is up to date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: t/browser
modified: web/jslib
no changes added to commit (use "git add" and/or "git commit -a")
PS C:\Users\Matthew\Projects\...> git diff
PS C:\Users\Matthew\Projects\...>
好像git正在设置一个内部标志,然后它认为在另一个系统中已更改;有什么办法可以解决或解决此问题?
答案 0 :(得分:2)
找到了解决方法。我在wsl中为Windows的Git创建了别名:别名git =“ / mnt / c / Program \ Files / Git / bin / git.exe”。完美的作品!
答案 1 :(得分:0)
之所以会发生此问题,是因为Windows和Linux(或至少是仿真版本)不同意符号链接的大小。在Windows上,符号链接的大小以块为单位,因此6个字符的符号链接的大小为4096字节。在Linux上,符号链接的大小是其包含的字节数(在此示例中为6)。
Git写入索引以跟踪文件是否已更改的一件事是大小。当您执行任何类型的索引更新时,例如使用git reset --hard
,Git会将所有这些元数据(包括大小)写入索引。当您运行git status
时,git会检查此元数据以确定是否匹配,如果不匹配,则将文件标记为已修改。
可以控制是否在索引中检查某些信息,因为某些工具会产生伪造的信息(例如,JGit不会写设备和索引节点号),但是总会检查大小,因为它被视为很好地指示文件是否已更改。
由于这是Windows和WSL如何看待符号链接之间的根本分歧,因此确实无法解决。您可以尝试询问Windows版Git项目是否愿意解决Windows版Git问题,但是我怀疑答案可能不是,因为更改它可能会对所有Windows用户产生性能影响。