【问题标题】:Sharing git repo symlinks between Windows and WSL在 Windows 和 WSL 之间共享 git repo 符号链接
【发布时间】:2019-10-23 13:56:35
【问题描述】:

我有以下设置:

  • WSL 随 Ubuntu 一起安装,那里已经安装了 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 之间共享 repo)

几乎完美运行(印象深刻)。当我克隆存储库时,在 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 正在设置一个内部标志,然后它认为在另一个系统中已更改;有什么办法可以解决或解决这个问题?

【问题讨论】:

    标签: git windows-subsystem-for-linux


    【解决方案1】:

    找到了解决方法。我在 wsl 中为 Windows 的 Git 创建了别名:别名 git="/mnt/c/Program\ Files/Git/bin/git.exe"。完美运行!

    【讨论】:

    • 对于那些不熟悉 bash(我)的人,只需将该别名放入 ~(主文件夹)中的 .bash_aliases 文件中,它就会在每个新会话中创建该别名,而不必每次都这样做时间。
    【解决方案2】:

    出现此问题是因为 Windows 和 Linux(或至少是模拟版本)在符号链接的大小上存在分歧。在 Windows 上,符号链接的大小以块为单位,因此 6 个字符的符号链接大小为 4096 字节。在 Linux 上,符号链接的大小是它包含的字节数(在本例中为 6)。

    Git 写入索引以跟踪文件是否已更改的其中一项内容是大小。当您对索引执行任何类型的更新时,例如使用git reset --hard,Git 会将所有这些元数据写入索引,包括大小。当你运行git status 时,git 会检查这个元数据以确定它是否匹配,如果不匹配,它会将文件标记为已修改。

    可以控制是否在索引中检查某些信息,因为某些工具会产生虚假信息(例如,JGit 不写入设备和 inode 编号),但始终检查大小,因为它被视为文件是否已更改的良好指标。

    由于这是 Windows 如何与 WSL 如何查看符号链接之间的根本分歧,因此这确实无法解决。您可以尝试询问 Git for Windows 项目是否愿意在 Git for Windows 中解决此问题,但我怀疑答案可能是否定的,因为更改它可能会对所有 Windows 用户产生性能影响。

    【讨论】:

    • 啊哈,谢谢你的解释!没关系,符号链接不会经常更改,我将它们标记为assume-unchanged :)
    • 能否增强 Linux 版本的 Git 以检查它是否在 WSL 中运行?我假设这是一个 Windows 系统调用,它表示符号链接的大小为 4096 字节。如果在 WSL 中运行,则 git 可以存储符号链接指向的路径的长度,而不是向操作系统询问符号链接文件的长度。我希望大多数 Windows 用户喜欢 Git for Windows 的行为,它创建了一个正确的 Windows 符号链接,可以与其他 Windows 工具一起使用。
    • 尝试使用assume-unchanged 不支持上游,并且会以多种方式中断。文档将很快更新以反映这一点。
    • 我认为人们不太可能为这种情况在主流 Git 中添加可移植性 goop,尤其是因为每个 Unix 程序都必须携带补丁。人们会希望微软修复他们的系统。但是你可以询问列表或者发送补丁,也许它会发生。
    猜你喜欢
    • 2019-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    • 2015-02-19
    • 1970-01-01
    • 2019-12-26
    • 2013-02-07
    相关资源
    最近更新 更多