![Различные методы настройки инструмента git diff приводят к ошибке «fatal: cannot exec [...] : Bad address»](https://rvso.com/image/1419028/%D0%A0%D0%B0%D0%B7%D0%BB%D0%B8%D1%87%D0%BD%D1%8B%D0%B5%20%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B8%20%D0%B8%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%20git%20diff%20%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D1%8F%D1%82%20%D0%BA%20%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B5%20%C2%ABfatal%3A%20cannot%20exec%20%5B...%5D%20%3A%20Bad%20address%C2%BB.png)
У меня 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
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 mainter для обновления, как описаноЗДЕСЬ.