Vários métodos de tentar configurar uma ferramenta de comparação de git levam a “fatal: cannot exec […]: Bad address”

4

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

    
por user354932 12.08.2014 / 07:49

3 respostas

1

Eu sei que este é um tópico antigo, mas não parece estar fechado ...

Eu encontrei um erro similar (eu 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 - caminho para o arquivo / arquivo

como em link

Felicidades

    
por 27.03.2015 / 20:50
0

A solução para mim foi atualizar para o git 2.x. Com o git 2.3.4, eu não tenho mais esse problema.

    
por 29.03.2015 / 19:37
-1

Eu tive o mesmo problema no Ubuntu14, corrigido pelo upgrade do git da v1.9.1 para a v2.11.0.

Eu tive que usar o repositório do git maintainer para a atualização, como descrito AQUI .

    
por 31.03.2017 / 23:36