在Windows和WSL之间共享git repo符号链接

时间:2019-06-08 08:36:19

标签: git windows-subsystem-for-linux

我有以下设置:

  • 在Ubuntu上安装了WSL,并且已经在其中安装了git
  • 从Windows的https://git-scm.com安装的
  • git
  • 通过打开开发人员模式并将我的用户添加到正确的策略组来启用符号链接的创建,如https://github.com/git-for-windows/git/wiki/Symbolic-Links
  • 所述
  • 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正在设置一个内部标志,然后它认为在另一个系统中已更改;有什么办法可以解决或解决此问题?

2 个答案:

答案 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用户产生性能影响。