Fishから.gitディレクトリを使用して最も近い親ディレクトリにCDを移動するには?

Fishから.gitディレクトリを使用して最も近い親ディレクトリにCDを移動するには?

私は魚の皮を使用しました。場合によっては、複数のレベルの下にあるサブディレクトリのサブディレクトリにいる場合は、ディレクトリを使用して最も近い親ディレクトリに戻りたい場合があります。.gitなぜなら、このディレクトリは言えばルートプロジェクトディレクトリを表すからです。

たとえば、次のようなレイアウトがあるとします。

./
└── countries/
    ├── .git/
    └── regions/
        └── cities/

私がいる場所に関係なく、countries/このcountries/regions/コマンドcountries/regions/cities/を使用してディレクトリをに変更したいと思いますcountries/。なぜならが含まれているからです.git

Fishでこれをどのように実行しますか?

答え1

git rev-parseCDに引数を印刷する "--show-cdup"オプションがあります。

set -l cd (git rev-parse --show-cdup 2>/dev/null); and cd $cd

これは2>/dev/null「gitリポジトリではありません」というエラーを排除し、この場合はfalseを返すため、git rev-parse --show-cdupgitリポジトリの外部で使用すると何もしません。cd

またはを使用することもできますgit rev-parse --show-toplevel。私はこれが--show-cdup起こると合理的に確信しています。物理したがって、シンボリックリンクを介してgitリポジトリに入ると、誤った答えが印刷される可能性があります。

答え2

これを行う関数は次のとおりです。


function cdroot
  set directory_x (pwd)

  while test -n "$directory_x" -a ! -e "$directory_x/.git"
    set parts (string split '/' $directory_x)
    set --erase parts[(count $parts)]
    set directory_x (string join '/' $parts)
  end

  if test -n "$directory_x"
    cd "$directory_x"
  else
    echo "Could not find closest root directory with .git child" >&2
    return 1
  end

end

インストールするには入れてください。~/.config/fish/functions/cdroot.fish

答え3

git rev-parseこれはマイナーかもしれませんが、非ユースケースに適用できる単純な一般的なソリューションは次のとおりです.git

set start "$PWD"
while test ! -e .git
  if ! cd .. ; or test "$PWD" = /
    break
  end
end
if test ! -e .git
  cd "$start"
end

関連情報