Различные методы настройки инструмента git diff приводят к ошибке «fatal: cannot exec [...] : Bad address»

Различные методы настройки инструмента git diff приводят к ошибке «fatal: cannot exec [...] : Bad address»

У меня 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

как в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 mainter для обновления, как описаноЗДЕСЬ.

Связанный контент