【问题标题】:Git not working with Ubuntu → Windows Samba shared directoryGit 不适用于 Ubuntu → Windows Samba 共享目录
【发布时间】:2018-01-30 02:51:05
【问题描述】:

我正在运行一个 Virtual Box Ubuntu VM,我在其中设置了我的 git 存储库。然后我使用 Samba 创建了一个共享文件夹,并在 smb.conf 中有以下配置

path = /home/allan/git_repo
valid users = allan
read only = no
hide dot files = no

当我导航到适当的网络位置 (\\192.168.65.101\git_repo) 时,我会在那里看到我的所有文件和文件夹,包括我的 .git 文件夹,它似乎包含我需要的所有内容。

如果我导航到 bash 终端 (MINGW64) 中的网络位置,我发现它未被识别为 git 存储库。像git rev-parse HEAD 这样的简单命令返回fatal: Not a git repository (or any of the parent directories): .git 另一方面,向下导航子目录会导致某种识别(例如,我可以运行 git rev-parse HEAD 并获得有效响应)。虽然有很多功能我需要在上层目录中,所以我很困惑发生了什么以及如何解决这个问题。

【问题讨论】:

标签: git python-3.x ubuntu samba


【解决方案1】:

确保不要在 .git 文件夹本身中执行您的 git 命令。

如果应该在.git/的父文件夹中执行。

另外,请务必使用latest version of Git for Windows,因为它更好地支持\\... 路径。
另见“git tries to stat //HEAD when searching for a repo, leading to huge delays on Cygwin”。


Git 2.24(2019 年第四季度)将认识到,在 Windows 上,UNC 共享的根级别现在可以像任何其他目录一样使用。

参见Johannes Schindelin (dscho)commit 5cf7b3bcommit e2683d5commit d17f212(2019 年 8 月 24 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit b57a88a,2019 年 9 月 30 日)

setup_git_directory(): 正确处理 UNC 根路径

在文件共享的根目录中工作时(这仅在 Git Bash 和 Powershell 中可行,但在 CMD 中不可行),报告当前目录时不带斜杠。

这与 Unix 和标准 Windows 目录不同:/C:\ 以斜杠作为当前目录报告。

如果 Git 工作树位于那里,Git 并没有为此做好充分准备:
虽然它确实设法找到了.git 目录/文件,但它返回的顶级目录路径的长度比当前目录的长度长一个,然后setup_git_directory_gently() 会 返回一个未定义的字符串作为前缀。

实际上,这个未定义的字符串通常指向NUL字节,不会造成太大的危害。不过,在极少数情况下确实涉及到重现(并且不可靠),报告的前缀可能是 Git 执行路径的后缀字符串。

更具体地说,git-for-windows/git issue 1320 报告 git status 在 Windows 共享根目录的 UNC 路径中失败。

fatal: Not a git repository (or any of the parent directories): .git

修复 .git/ 在 UNC 共享根目录中的发现

Git 源代码库中的一个非常常见的假设是,offset_1st_component() 对于相对路径返回 0,对于相对路径返回 1 以斜杠开头的绝对路径。
换句话说,返回值要么是 0,要么是 dir 分隔符之后的点。

调用offset_1st_component() 时不满足此假设,例如在 Windows 上的 UNC 路径上,例如“//my-server/my-share”。
在这种情况下,offset_1st_component() 返回整个字符串的长度(这是正确的,因为剥离最后一个“组件”不会导致 有效目录),但返回值仍然不指向 dir 分隔符。

这种假设在setup_git_directory_gently_1() 函数中最为突出,我们希望在其中附加一个“.git”组件并简单地假设已经有一个目录分隔符。
在上面给出的 UNC 示例中,这种假设是不正确的。

因此,Git 将无法处理位于 UNC 顶部的工作树 正确分享。

让我们专门为这种情况添加一个目录分隔符来解决这个问题:我们 发现路径中没有第一个组件并且没有结束 在目录分隔符中?然后添加它。

【讨论】:

  • 最新版本的 Git 做到了!
  • @aoh 干得好!我知道 UNC 路径支持有一些改进。
  • 我仍然无法实际发出某些 git 请求(例如 git status),但会发布一个单独的问题
  • @aoh 好的。我去看看。
猜你喜欢
  • 2010-12-26
  • 2012-11-17
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2011-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多