![尝试设置 git diff 工具的各种方法都导致“致命:无法执行 [...]:错误地址”](https://linux22.com/image/1419028/%E5%B0%9D%E8%AF%95%E8%AE%BE%E7%BD%AE%20git%20diff%20%E5%B7%A5%E5%85%B7%E7%9A%84%E5%90%84%E7%A7%8D%E6%96%B9%E6%B3%95%E9%83%BD%E5%AF%BC%E8%87%B4%E2%80%9C%E8%87%B4%E5%91%BD%EF%BC%9A%E6%97%A0%E6%B3%95%E6%89%A7%E8%A1%8C%20%5B...%5D%EF%BC%9A%E9%94%99%E8%AF%AF%E5%9C%B0%E5%9D%80%E2%80%9D.png)
我使用的是 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
干杯
答案2
对我来说,解决方案是升级到 git 2.x。使用 git 2.3.4,我不再遇到此问题。
答案3
我在 Ubuntu14 上遇到了同样的问题,通过将 git 从 v1.9.1 升级到 v2.11.0 解决了。
我必须使用 git 维护者仓库进行升级,如所述这里。