Различные способы установки инструмента git diff приводят к «фатальному: невозможно выполнить [...]: неправильный адрес»

2157
user354932

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

Есть идеи?

Спасибо

4
У меня та же проблема с переименованными файлами с помощью git difftool -C --tool = meld -Y master Без флага -C не происходит сбой (но он не видит ни переименования, ни ...) user3819503 9 лет назад 0

3 ответа на вопрос

1
uros

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

Я столкнулся с подобной ошибкой (я также хотел использовать 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

ура

0
Stephen

The solution for me was to upgrade to git 2.x. With git 2.3.4, I no longer have this issue.

-1
sam

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

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

Ответы только по ссылке не очень полезны. Ваш ответ сам по себе должен содержать всю необходимую информацию. Ramhound 7 лет назад 0

Похожие вопросы