Estou no Linux Mint 17 de 64 bits. Apenas purgou git
e reinstalou com apt
. ~/.gitconfig
eliminado. Somente a configuração que faço depois da suposta nova instalação é (enquanto dentro de um repositório)
git config diff.tool vimdiff
Então eu corro
git difftool HEAD:switch-monitor.sh master:switch-monitor.sh
e obtenha
fatal: cannot exec 'git-difftool--helper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.
Então eu removi a linha pertinente de .git/config
e tentei o comando novamente, e com certeza o built-in git diff
básico funciona.
Eu também tentei as instruções deste tutorial: link
Isso leva a um erro um pouco diferente, mas semelhante. Eu coloco o seguinte em um novo ~/.gitconfig
[diff]
external = git_diff_wrapper
[pager]
diff =
E coloque e torne executável um arquivo git_diff_wrapper
no meu PATH
e execute
git diff HEAD:switch-monitor.sh master:switch-monitor.sh
E obtenha
fatal: cannot exec 'git_diff_wrapper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.
No entanto, parece não ter nada a ver com o conteúdo de git_diff_wrapper
. Eu coloquei
#!/bin/bash
echo hello
Para isso e isso não muda nada. No entanto, se eu remover o arquivo ou renomeá-lo, então eu obtenho isso
error: cannot run git_diff_wrapper: No such file or directory
external diff died, stopping at HEAD:switch-monitor.sh.
Observe que "Nenhum arquivo ou diretório" em vez de "Endereço incorreto" neste caso.
Eu pesquisei e não consigo encontrar uma instância de um problema semelhante on-line.
Atualizar
Estou recebendo o mesmo problema em uma nova instalação do Ubuntu 14.04 em uma máquina virtual
Atualizar
Eu passei algum tempo olhando a fonte do git, e tenho certeza que errno
está sendo configurado para EFAULT
("Endereço incorreto"), no decorrer desta função:
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;
}
O que chama isso:
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;
}
Alguma idéia?
Obrigado