Я на Linux Mint 17 64-битной. Просто удалил git
и переустановил с помощью apt
. Удалено ~/.gitconfig
. Единственная конфигурация, которую я делаю после якобы свежей установки (в репо)
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
("Bad address") в ходе выполнения этой функции:
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;
}
Есть идеи?
Спасибо