Help us understand the problem. What is going on with this article?

Cygwinでgit-prompt.shが遅い

More than 1 year has passed since last update.

git-prompt.shを使うとシェルのプロンプトに今作業しているブランチを表示できて便利なのだが、Cygwinで使うとプロンプトの表示がときどき遅くなることに気付いた。続けてコマンドを入力していると平気だが、少し間隔があくとプロンプトの表示が遅くなる。

原因を調べたところ、git-prompt.shが以下のようにgit rev-parseを読んでるところで遅くなっていた。このようにgit rev-parseを呼ぶと、カレントディレクトリから上にさかのぼって.gitを探したり、カレントディレクトリが.gitの下ではないかを調べたりする。

        repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
                --is-bare-repository --is-inside-work-tree \
                --short HEAD 2>/dev/null)"

git rev-parseが呼んでいるシステムコールをstraceで調べたところ、カレントディレクトリ以上に.gitが存在しないときに//HEADを読んでしまうことがわかった。Windowsでは//HEADを読むとHEADというホストを探してしまう。結果がキャッシュされるので、続けてコマンドを入力しているうちは平気だが、少し間隔があくとここで詰まる。

git rev-parseはディレクトリを調べるときに、最初にそこが.gitの直下ではないかを確認するためにHEADファイルの存在を確認する。そのパスを生成するときに、以下のようにディレクトリに/HEADを付けてしまうため、対象がルートディレクトリだと//HEADになってしまう。

    /* Check worktree-related signatures */
    strbuf_addf(&path, "%s/HEAD", suspect);
    if (validate_headref(path.buf))
        goto done;

この問題を回避するのは簡単である。gitは環境変数GIT_CEILING_DIRECTORIESに設定されたディレクトリの手前でさかのぼるのをやめる。この環境変数に/を設定すれば、ルートディレクトリまでさかのぼらないので//HEADが読まれるのを防げる。ただし、ルートディレクトリにある.gitは無視されるので注意されたい。

いや、gitが//HEADを読むのを直した方がいいとは思うのだが…

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away