Ich verwende Linux Mint 17 64-Bit. Habe es gerade bereinigt git
und 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/config
und 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_wrapper
Datei 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 errno
auf („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
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.