【问题标题】:GIT can't pull: failed to symlink 'path/filename': File name too longGIT 无法提取:无法符号链接“路径/文件名”:文件名太长
【发布时间】:2012-09-17 13:27:23
【问题描述】:

感觉很傻,但我不知道在这里做什么。

我有一个存储在远程服务器上的存储库的本地副本。远程服务器有我需要的更改,我已经在本地副本上提交了更改。我无法推送,因为我需要合并服务器上存在的较新版本的更改。当我拉,我得到这个错误:

 git pull origin master
 From server.name:reponame
  * branch            master     -> FETCH_HEAD
 fatal: failed to symlink 'path/to/filename ': File name too long

不确定这里会发生什么。疯狂的是文件path/to/filename 是一个实际文件,而不是符号链接。此外,path/to/filename 甚至不是最长的路径。

真的很困惑从哪里开始调试这个问题。

【问题讨论】:

  • ls -la path/to?也许文件有些奇怪?
  • 尝试使用“git fetch origin”然​​后“git rebase origin/master”
  • 我认为 path.to/filenamepath/to/filename 不是实际路径。如果您向我们展示实际路径可能会有所帮助。路径符号链接中有 any 目录吗?
  • @nneonneo — 一切正常。 @Keith-Thompson — 你是对的,这不是实际路径。路径上的所有目录都不是符号链接,尽管to 部分实际上是一个点文件夹:.libs

标签: macos git pull


【解决方案1】:

我看到符号链接失败的唯一地方是merge-recursive.c file

if (S_ISLNK(mode)) {
  char *lnk = xmemdupz(buf, size);
  safe_create_leading_directories_const(path);
  unlink(path);
  if (symlink(lnk, path))
    die_errno(_("failed to symlink '%s'"), path);
  free(lnk);
} 

看起来您从中提取的远程仓库包含 filename 作为符号链接,而您的本地仓库包含相同的 filename 作为纯文件。
这可能是导致致命错误消息的原因。

【讨论】:

  • 这完全有可能,但我不确定如何调试问题,因为该文件在我的系统上作为文件启动。一位同事一直在从事同一个项目,我认为他的 repo 位于 FAT 驱动器上,但在他的机器上一切正常,他是最后一个推动的。
【解决方案2】:

我会从git fetch 开始调试,只有在调试成功后,才使用git merge。大概(正如@VonC 指出的那样)该错误只会发生在git merge 上(这是有道理的,因为这里的 pull 只是 fetch-then-merge)。由于fetch 将成功,您可以检查导致合并失败的提交,并可能在strace 或类似的情况下运行整个事情以观察失败的系统调用。

(不需要拆分成fetch+merge,可以strace一个pull,只是应该有助于减少不相关的crud数量。)

[编辑:而且,SO又一次复活了一个老问题……必须开始查看这些时间戳!并且,注意 OSX 标签,使用 dtruss 而不是 strace。]

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,但就我而言,我没有时间检查它会如何发生。我通过使用下面的命令解决了它 - 可能会对某人有所帮助:

    git config core.symlinks false
    

    但是,我不知道这对整个项目是如何工作的,因此您只能将其用于您的责任。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 2011-09-01
      • 1970-01-01
      • 2016-02-29
      • 2016-07-13
      • 1970-01-01
      • 2018-05-21
      • 1970-01-01
      • 2013-07-17
      相关资源
      最近更新 更多