Linux Mint 17 64ビットを使用しています。で削除git
して再インストールしましたapt
。削除しました~/.gitconfig
。おそらく新規インストール後に行う設定のみが(レポ内で)
git config diff.tool vimdiff
それから私は走る
git difftool HEAD:switch-monitor.sh master:switch-monitor.sh
そして得る
fatal: cannot exec 'git-difftool--helper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.
そこで、関連する行を削除し.git/config
てコマンドを再試行し、組み込みの基本的なgit diff
作業を十分に確認します。
このチュートリアルの手順も試しました:http : //technotales.wordpress.com/2009/05/17/git-diff-with-vimdiff/
それはわずかに異なるが同様のエラーにつながります。以下に新しいものを置きます~/.gitconfig
[diff]
external = git_diff_wrapper
[pager]
diff =
そして、実行可能git_diff_wrapper
ファイルをmy PATH
に配置して作成し、実行します
git diff HEAD:switch-monitor.sh master:switch-monitor.sh
そして得る
fatal: cannot exec 'git_diff_wrapper': Bad address
external diff died, stopping at HEAD:switch-monitor.sh.
ただし、のコンテンツとは関係がないようですgit_diff_wrapper
。置いた
#!/bin/bash
echo hello
それに、それは何も変えません。ただし、ファイルを削除するか名前を変更すると、これが取得されます
error: cannot run git_diff_wrapper: No such file or directory
external diff died, stopping at HEAD:switch-monitor.sh.
この場合、「悪いアドレス」の代わりに「No such file or directory」と表示されていることに注意してください。
私は検索しましたが、オンラインで同様の問題のインスタンスを見つけることができません。
更新
仮想マシンにUbuntu 14.04を新規インストールしても同じ問題が発生します
更新
私はgitのソースを見るのに少し時間を費やしましたが、この関数の過程で( "Bad address")にerrno
設定されていると確信し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;
}
これはこれを呼び出します:
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;
}
何か案は?
ありがとう