私は魚の皮を使用しました。場合によっては、複数のレベルの下にあるサブディレクトリのサブディレクトリにいる場合は、ディレクトリを使用して最も近い親ディレクトリに戻りたい場合があります。.git
なぜなら、このディレクトリは言えばルートプロジェクトディレクトリを表すからです。
たとえば、次のようなレイアウトがあるとします。
./
└── countries/
├── .git/
└── regions/
└── cities/
私がいる場所に関係なく、countries/
このcountries/regions/
コマンドcountries/regions/cities/
を使用してディレクトリをに変更したいと思いますcountries/
。なぜならが含まれているからです.git
。
Fishでこれをどのように実行しますか?
答え1
git rev-parse
CDに引数を印刷する "--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-cdup
gitリポジトリの外部で使用すると何もしません。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