尝试设置 git diff 工具的各种方法都导致“致命:无法执行 [...]:错误地址”

尝试设置 git diff 工具的各种方法都导致“致命:无法执行 [...]:错误地址”

我使用的是 Linux Mint 17 64 位。刚刚清除git并重新安装apt。删除了~/.gitconfig。在全新安装后我唯一要做的配置是(在 repo 中)

git config diff.tool vimdiff

然后我跑

git difftool HEAD:switch-monitor.sh master:switch-monitor.sh

并得到

fatal: cannot exec 'git-difftool--helper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.

因此我删除了相关行.git/config并再次尝试该命令,果然内置的基本git diff功能可以正常工作。

我也尝试过本教程中的说明:http://technotales.wordpress.com/2009/05/17/git-diff-with-vimdiff/

这会导致略有不同但类似的错误。我将以下内容放在新的~/.gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

git_diff_wrapper并在我的上放置并执行文件PATH,然后运行

git diff HEAD:switch-monitor.sh master:switch-monitor.sh 

并得到

fatal: cannot exec 'git_diff_wrapper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.

然而,这似乎与 的内容无关git_diff_wrapper。我把

#!/bin/bash
echo hello

进入它,这不会改变任何事情。但是,如果我消除文件或重命名它,然后我得到这个

error: cannot run git_diff_wrapper: No such file or directory
external diff died, stopping at HEAD:switch-monitor.sh.

请注意,在这种情况下,它显示的是“没有这样的文件或目录”,而不是“错误的地址”。

我搜索过并且在网上找不到类似问题的例子。

更新

我在虚拟机上全新安装 Ubuntu 14.04 时遇到了同样的问题

更新

我花了一些时间查看 git 的源代码,并且我很确定在执行此功能的过程中errno它被设置为(“错误地址”):EFAULT

static int execv_shell_cmd(const char **argv)
{
    const char **nargv = prepare_shell_cmd(argv);
    trace_argv_printf(nargv, "trace: exec:");
    sane_execvp(nargv[0], (char **)nargv);
    free(nargv);
    return -1;
}

这就叫:

int sane_execvp(const char *file, char * const argv[])
{
    if (!execvp(file, argv))
        return 0; /* cannot happen ;-) */

    /*
     * When a command can't be found because one of the directories
     * listed in $PATH is unsearchable, execvp reports EACCES, but
     * careful usability testing (read: analysis of occasional bug
     * reports) reveals that "No such file or directory" is more
     * intuitive.
     *
     * We avoid commands with "/", because execvp will not do $PATH
     * lookups in that case.
     *
     * The reassignment of EACCES to errno looks like a no-op below,
     * but we need to protect against exists_in_PATH overwriting errno.
     */
    if (errno == EACCES && !strchr(file, '/'))
        errno = exists_in_PATH(file) ? EACCES : ENOENT;
    else if (errno == ENOTDIR && !strchr(file, '/'))
        errno = ENOENT;
    return -1;
}

有任何想法吗?

谢谢

答案1

我知道这是一个老话题,但它似乎还没有关闭......

我遇到过类似的错误(我也想使用 vimdiff 检查两次提交之间的差异)。对我有用的方法:git difftool HEAD..HEAD~1 --path-to-file/file

如同https://stackoverflow.com/questions/3338126/git-how-to-diff-the-same-file-between-two-different-commits-on-the-same-branch

干杯

答案2

对我来说,解决方案是升级到 git 2.x。使用 git 2.3.4,我不再遇到此问题。

答案3

我在 Ubuntu14 上遇到了同样的问题,通过将 git 从 v1.9.1 升级到 v2.11.0 解决了。

我必须使用 git 维护者仓库进行升级,如所述这里

相关内容