저는 생선껍질을 사용했어요. 때로는 여러 수준 아래에 있는 하위 디렉터리의 하위 디렉터리에 있는 경우 디렉터리를 사용하여 가장 가까운 상위 디렉터리로 돌아가고 싶을 때가 있습니다. .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