本記事の内容
fish shellが重いため原因を特定して解決しました
fishが重くなった原因
ホームディレクトリに.git
ファイルができてしまっていた事が原因
fishのプロファイルにはcommand git ls-files --others --exclude-standard | wc -l | string trim
があり、Gitにおける非追跡ファイルのパス文字列の改行数を数える(?)という処理が行われているようです。
ホームディレクトリに.git
ができてしまうと、ホームディレクトリ配下の全てのファイルを対象に、過去に一度もステージングエリアに追加していないファイルを検索します。膨大な数のため処理に時間がかかります。
つまりホームディレクトリに.git
ファイルができてしまったことで、fish profile(/Users/ユーザ名/.config/fish/profile.txt
にあった)の、gitの非追跡ファイルのパスの文字数カウント処理に時間がかかってしまったのが原因でした
原因を突き止めた過程
- fishの起動時プロファイルを取得する
- 明らかに時間がかかっているプロファイルを特定(目視)
- 2.の処理の意味を調べる
-
command git ls-files --others --exclude-standard
をホームディレクトリで実行 - ホームディレクトリに.gitが生成されていた
- gitを削除
- 解決
原因を突き止めるために取った行動
1.fishの起動時プロファイルを取得する
こちらの記事を参考にさせていただきました。
fish shellの起動時間が遅いのでプロファイルを取得する
$ fish --profile profile.txt
$ exit
$ sort -k 2 -nr profile.txt
2.明らかに時間がかかっているプロファイルを特定(目視)
:以下の処理で10秒以上かかっていた
command git ls-files --others --exclude-standard | wc -l | string trim
# 約50000
3. 2.の処理の意味を調べる
(git公式)[https://git-scm.com/docs/git-ls-files]
ls-files
git-ls-files - Show information about files in the index and the working tree
ワークツリーとインデックスに関する情報を表示
ls-files --others
現在管理していないファイルを表示
--exclude-standard
Add the standard Git exclusions: .git/info/exclude, .gitignore in each directory, and the user’s global exclusion file.
対象のリポジトリで指定している[.gitignore, .git/info/exclude]にあるパターンに一致するファイルを表示。
wc -c
テキストの文字列を数えたりするコマンド。-lを付けることで改行の数を数える。
string trim
fish
fishにおける、文字列操作のコマンド。trimは各文字列の前後の空白を削除するそうです。
4. command git ls-files --others --exclude-standard
をホームディレクトリで実行
多くのファイルパスが表示されました
5.ホームディレクトリに.gitが生成されていた
.git
を削除しました。
(参考にさせて頂いた記事)
6. gitを削除
おしまい