Estou no Linux Mint 17 de 64 bits. Apenas purgado git
e reinstalado com apt
. Excluído ~/.gitconfig
. A única configuração que faço após uma instalação supostamente nova é (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 pegue
fatal: cannot exec 'git-difftool--helper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.
Então, removo a linha pertinente .git/config
e tento o comando novamente, e com certeza o básico integrado git diff
funciona.
Eu também tentei as instruções neste tutorial:http://technotales.wordpress.com/2009/05/17/git-diff-with-vimdiff/
Isso leva a um erro ligeiramente 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 git_diff_wrapper
arquivo no meu PATH
e execute
git diff HEAD:switch-monitor.sh master:switch-monitor.sh
E pegue
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
Entre nisso e isso não muda nada. No entanto, se euremovero arquivo ou renomeá-lo, então eu entendo isso
error: cannot run git_diff_wrapper: No such file or directory
external diff died, stopping at HEAD:switch-monitor.sh.
Observe que diz "Esse arquivo ou diretório não existe" em vez de "Endereço incorreto" neste caso.
Pesquisei e não consigo encontrar uma instância de problema semelhante online.
Atualizar
Estou tendo o mesmo problema em uma nova instalação do Ubuntu 14.04 em uma máquina virtual
Atualizar
Passei algum tempo olhando a fonte do git e tenho certeza errno
que está sendo definido como 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 ideia?
Obrigado
Responder1
Eu sei que este é um tópico antigo, mas não parece estar fechado...
Encontrei um erro semelhante (também queria usar o vimdiff para verificar a diferença entre os dois commits). O que funcionou para mim: git difftool HEAD..HEAD~1 --path-to-file/file
Saúde
Responder2
A solução para mim foi atualizar para o git 2.x. Com o git 2.3.4, não tenho mais esse problema.
Responder3
Eu tive o mesmo problema no Ubuntu14, corrigido atualizando o git da v1.9.1 para a v2.11.0.
Eu tive que usar o repositório git mantenedor para a atualização, conforme descritoAQUI.