Verschiedene Methoden zum Einrichten eines Git-Diff-Tools führen zu „fatal: cannot exec [...] : Ungültige Adresse“

Verschiedene Methoden zum Einrichten eines Git-Diff-Tools führen zu „fatal: cannot exec [...] : Ungültige Adresse“

Ich verwende Linux Mint 17 64-Bit. Habe es gerade bereinigt gitund mit neu installiert apt. Gelöscht ~/.gitconfig. Die einzige Konfiguration, die ich nach einer angeblichen Neuinstallation vornehme, ist (während ich mich in einem Repo befinde):

git config diff.tool vimdiff

Dann laufe ich

git difftool HEAD:switch-monitor.sh master:switch-monitor.sh

und bekomme

fatal: cannot exec 'git-difftool--helper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.

Also entferne ich die entsprechende Zeile .git/configund versuche den Befehl erneut, und tatsächlich funktioniert die integrierte Basisfunktion git diff.

Ich habe auch die Anweisungen in diesem Tutorial ausprobiert:http://technotales.wordpress.com/2009/05/17/git-diff-with-vimdiff/

Das führt zu einem etwas anderen, aber ähnlichen Fehler. Ich platziere das Folgende in einem neuen~/.gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

Und platzieren und ausführbar machen eine git_diff_wrapperDatei auf meinem PATH, und führen Sie

git diff HEAD:switch-monitor.sh master:switch-monitor.sh 

Und bekomme

fatal: cannot exec 'git_diff_wrapper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.

Es scheint jedoch nichts mit dem Inhalt von zu tun zu haben git_diff_wrapper. Ich habe

#!/bin/bash
echo hello

Da hinein und das ändert nichts. Wenn ich jedochentfernendie Datei oder benennen Sie sie um, dann bekomme ich diese

error: cannot run git_diff_wrapper: No such file or directory
external diff died, stopping at HEAD:switch-monitor.sh.

Beachten Sie, dass in diesem Fall „Keine solche Datei oder kein solches Verzeichnis“ statt „Ungültige Adresse“ angezeigt wird.

Ich habe gesucht und konnte online kein Beispiel für ein ähnliches Problem finden.

Aktualisieren

Ich habe das gleiche Problem bei einer Neuinstallation von Ubuntu 14.04 auf einer virtuellen Maschine

Aktualisieren

Ich habe mir einige Zeit den Quellcode von Git angesehen und bin ziemlich sicher, dass er im Verlauf dieser Funktion errnoauf („Ungültige Adresse“) gesetzt wird :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;
}

Das nennt man:

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;
}

Irgendwelche Ideen?

Danke

Antwort1

Ich weiß, dass dies ein alter Thread ist, aber er scheint nicht geschlossen zu sein ...

Ich bin auf einen ähnlichen Fehler gestoßen (ich wollte auch vimdiff verwenden, um den Unterschied zwischen den beiden Commits zu überprüfen). Was bei mir funktioniert hat: git difftool HEAD..HEAD~1 --path-to-file/file

wie inhttps://stackoverflow.com/questions/3338126/git-how-to-diff-the-same-file-between-two-different-commits-on-the-same-branch

Prost

Antwort2

Die Lösung für mich war ein Upgrade auf Git 2.x. Mit Git 2.3.4 habe ich dieses Problem nicht mehr.

Antwort3

Ich hatte das gleiche Problem unter Ubuntu 14, behoben durch ein Upgrade von Git von v1.9.1 auf v2.11.0.

Ich musste das Git-Maintainer-Repo für das Upgrade verwenden, wie beschriebenHIER.

verwandte Informationen