4

Я на 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;
}

Есть идеи?

Спасибо

3 ответа3

1

Я знаю, что это старая ветка, но она не закрыта ...

Я столкнулся с похожей ошибкой (я также хотел использовать vimdiff, чтобы проверить разницу между двумя коммитами). Что сработало для меня: git difftool HEAD ..HEAD ~ 1 - путь к файлу / файлу

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

ура

0

Решением для меня было обновление до git 2.x. С git 2.3.4 у меня больше нет этой проблемы.

-1

У меня была та же проблема на Ubuntu14, исправленная путем обновления git с v1.9.1 до v2.11.0.

Для обновления мне пришлось использовать репозиторий git keeper, как описано ЗДЕСЬ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .