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

관련 정보