sourcecode

git root 디렉토리를 하나의 명령어로 얻을 수 있는 방법이 있나요?

copyscript 2023. 4. 14. 22:00
반응형

git root 디렉토리를 하나의 명령어로 얻을 수 있는 방법이 있나요?

Mercurial에는 루트 디렉토리(.hg 포함)를 인쇄하는 방법이 있습니다.

hg root

git에 .git 디렉토리가 포함된 디렉토리를 가져올 수 있는 동등한 것이 있습니까?

네:

git rev-parse --show-toplevel

Mercurial 명령을 더 직접 복제하려면 다음 에일리어스를 만들 수 있습니다.

git config --global alias.root 'rev-parse --show-toplevel'

지금은git root will will will will just just just just just just 와 같이 hg root.


주의: 서브모듈에서는 부모저장소가 아닌 서브모듈의 루트디렉토리가 표시됩니다.Git > = 2.13 이상을 사용하는 경우, 서브모듈을 통해 슈퍼프로젝트의 루트 디렉토리를 표시할 수 있습니다.GIT가 그보다 오래된 경우 다음 답변을 참조하십시오.

--show-toplevel에야 only 에 추가되었습니다.git rev-parse아니면 왜 아무도 그것에 대해 언급하지 않는 거죠?

git rev-parse 페이지 man "display" :

   --show-toplevel
       Show the absolute path of the top-level directory.

mangit-config(에일리어스 아래)는 다음과 같이 말합니다.

별칭 확장 앞에 느낌표가 있으면 셸 명령으로 처리됩니다. [...] 셸 명령은 저장소의 최상위 디렉터리에서 실행됩니다. 이 디렉터리는 현재 디렉터리가 아닐 수도 있습니다.

UNIX 에서는, 다음의 작업을 실시할 수 있습니다.

git config --global --add alias.root '!pwd'

"git rev-parse --git-dir는 어떻습니까?

F:\prog\git\test\copyMerge\dirWithConflicts>git rev-parse --git-dir
F:/prog/git/test/copyMerge/.git

--git-dir을 사용법

기능은 빈 저장소에서도 작동하지만,git rev-parse --show-toplevel "(어느 쪽인가 하면) "(어느 쪽인가 하면)"을.fatal: this operation must be run in a work tree

git rev-parse 매뉴얼 페이지에서:

--git-dir

    Show $GIT_DIR if defined else show the path to the .git directory.

스크립트에서 동작하고 있는 것을 확인할 수 있습니다.

Git > = 2.13 서브모듈 폴더에 있는 경우 다음을 사용합니다.

git rev-parse --show-superproject-working-tree

「 」를 사용하고 git rev-parse --show-toplevelGit 2.25+ (2020년 1분기) 대응하고 있는 것을 확인해 주세요.

여기에 간단한 답을 써서

git root

이 작업을 수행하려면 를 사용하여 git을 설정하기만 하면 됩니다.

git config --global alias.root "rev-parse --show-toplevel"

'다 하다'에 '에 하다'라는 말을 것 요.~/.bashrc:

alias cdroot='cd $(git root)'

'이렇게'라고 하면 요.cdroot최고의 자리에 오를 수 있도록 말이야

경우 git ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」cd $(git rev-parse --show-cdup)CD를 사용하다 cd ./$(git rev-parse --show-cdup)그걸 고치는 방법 중 하나죠

내및와 .git

대부분의 고객이 원하는 간단한 답변은 다음과 같습니다.

r=$(git rev-parse --git-dir) && r=$(cd "$r" && pwd)/ && echo "${r%%/.git/*}"

트리(「Git」의 「Git」의합니다..git 단,가 directory(라고 불리는 것을 로 합니다..git을 사용법서브모듈을 사용하면 가장 바깥쪽이 포함된 저장소의 루트로 이동합니다.

현재 서브모듈의 루트에 액세스하려면 다음 명령을 사용합니다.

echo $(r=$(git rev-parse --show-toplevel) && ([[ -n $r ]] && echo "$r" || (cd $(git rev-parse --git-dir)/.. && pwd) ))

루트에서 하려면 " " " " 에서 명령을 합니다.[alias] 안에서.gitconfig , 가::

sh = "!f() { root=$(pwd)/ && cd ${root%%/.git/*} && git rev-parse && exec \"$@\"; }; f"

하면 할 수요.git sh ag <string>

이름 이름을 .git ★★★★★★★★★★★★★★★★★」$GIT_DIR디렉토리로 이동합니다.

:$GIT_DIR 수 )..git따라서 추가 확인이 필요합니다.

을 당신의 것 your your this에 넣으세요..bashrc

# Print the name of the git working tree's root directory
function git_root() {
  local root first_commit
  # git displays its own error if not in a repository
  root=$(git rev-parse --show-toplevel) || return
  if [[ -n $root ]]; then
    echo $root
    return
  elif [[ $(git rev-parse --is-inside-git-dir) = true ]]; then
    # We're inside the .git directory
    # Store the commit id of the first commit to compare later
    # It's possible that $GIT_DIR points somewhere not inside the repo
    first_commit=$(git rev-list --parents HEAD | tail -1) ||
      echo "$0: Can't get initial commit" 2>&1 && false && return
    root=$(git rev-parse --git-dir)/.. &&
      # subshell so we don't change the user's working directory
    ( cd "$root" &&
      if [[ $(git rev-list --parents HEAD | tail -1) = $first_commit ]]; then
        pwd
      else
        echo "$FUNCNAME: git directory is not inside its repository" 2>&1
        false
      fi
    )
  else
    echo "$FUNCNAME: Can't determine repository root" 2>&1
    false
  fi
}

# Change working directory to git repository root
function cd_git_root() {
  local root
  root=$(git_root) || return 1  # git_root will print any errors
  cd "$root"
}

를 입력하여 합니다.git_root한 후: ( " 시 ( ( ( ("exec bash)

한 바와 , 이다.git rev-parse --show-cdup해야 할 몇 가지 하다, 하다, 하다.

  1. 트리의 는 빈합니다.cwd는 빈 문자열입니다.
    실제로는 빈 행이 생성되지만 명령어 대체는 후행 구분을 제거합니다.최종 결과는 빈 문자열입니다.

    에 '어느 정도'를 붙이는 ../이 「」가 되도록 ."./" cd.

  2. GIT_WORK_TREE가 cwd의 부모가 아닌 위치로 설정되어 있는 경우 출력은 절대 경로 이름이 될 수 있습니다.

    ''./을 사용하다「」의 './는 절대 경로 앞에 추가되어 상대 경로가 됩니다(또한 cwd가 시스템의 루트 디렉토리일 경우에만 같은 위치를 참조합니다).

  3. 출력에 공백이 포함될 수 있습니다.

    이것은 실제로는 두 번째 경우에만 적용되지만 간단한 수정이 있습니다.명령어 치환 주위에 큰따옴표를 사용합니다(및 그 이후의 값 사용).

했듯이, '하다, 하다, 하다, 하다, 하다, 하다'를 할 수 있습니다.cd "./$(git rev-parse --show-cdup)"단, 두 번째 엣지 케이스(큰따옴표를 떼면 세 번째 엣지 케이스)에서는 깨집니다.

는 많이 .cd ""가 할 수 일이니까cd "$(git rev-parse --show-cdup)"(큰따옴표는 첫 번째 엣지 케이스에서는 빈 문자열을 인수로 보호하고 세 번째 엣지 케이스에서는 공백을 유지합니다).는 POSIX의 .cd ""미지정이기 때문에 이 가정을 하지 않는 것이 좋을 수 있습니다.

위의 모든 경우에 효과가 있는 솔루션은 어떤 종류의 테스트가 필요합니다.명시적으로 실시하면, 다음과 같이 됩니다.

cdup="$(git rev-parse --show-cdup)" && test -n "$cdup" && cd "$cdup"

.cd첫 번째 가장자리 케이스에 대해 수행됩니다.

「」를 실행할 수.cd . 조건화는 할 수 있습니다.

cdup="$(git rev-parse --show-cdup)" && cd "${cdup:-.}"

현재 git 루트 디렉토리의 절대 경로를 계산하려면, 예를 들어 셸 스크립트에서 사용하는 경우 다음과 같이 readlink와 git rev-parse의 조합을 사용합니다.

gitroot=$(readlink -f ./$(git rev-parse --show-cdup))

git-rev-parse --show-cdup"cwd"는 "cwd"입니다."을 제공합니다.루트에 있는 경우는 빈 문자열을 지정합니다. 다음 빈하기 위해 . .을 .을 사용합니다.readlink -f을 사용하다

해서 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,git-root합니다.PATH 기술을합니다.

cat > ~/bin/git-root << EOF
#!/bin/sh -e
cdup=$(git rev-parse --show-cdup)
exec readlink -f ./$cdup
EOF
chmod 755 ~/bin/git-root

(위 내용을 단말기에 붙여넣어 git-root를 만들고 실행 비트를 설정할 수 있습니다.실제 스크립트는 2, 3, 4행입니다).

그러면 넌 도망칠 수 있을 거야git root현재 트리의 루트를 가져옵니다.셸 스크립트에서 "-e"를 사용하여 rev-parse가 실패할 경우 셸이 종료되도록 하고 git 디렉토리에 없는 경우 종료 상태와 오류 메시지를 올바르게 얻을 수 있도록 합니다.

이 한다면 Git을 :/

# this adds the whole working tree from any directory in the repo
git add :/

# and is equal to
git add $(git rev-parse --show-toplevel)

"git config" 답변을 약간 수정하려면:

git config --global --add alias.root '!pwd -P'

길을 깨끗이 청소해 주세요.아주 좋아.

할 수 있는 폭발하지 cd dirsyslog dir:syslog dir: dir:

alias ..g='git rev-parse && cd "$(git rev-parse --show-cdup)"'

git-extras

$ git root
https://github.com/tj/git-extras/blob/master/Commands.md#git-root 를 참조해 주세요.

$ pwd
.../very-deep-from-root-directory
$ cd `git root`
$ git add . && git commit

git-extra의 가용성

  • homebrew(osx)/linuxbrew(linux)$ brew install git-extras
  • debian/ubuntu 저장소(https://packages.debian.org/sid/git-extras)$ apt-get install git-extras

이 셸 에일리어스는 git 서브디어나 최상위 레벨에 관계없이 기능합니다.

alias gr='[ ! -z `git rev-parse --show-toplevel` ] && cd `git rev-parse --show-toplevel || pwd`'

backtick 대신 최신 구문을 사용하도록 업데이트되었습니다.

alias gr='[ ! -z $(git rev-parse --show-toplevel) ] && cd $(git rev-parse --show-toplevel || pwd)'
alias git-root='cd \`git rev-parse --git-dir\`; cd ..'

그 외의 모든 것은 홈 디렉토리로 이동하거나 완전히 실패하거나 둘 중 어느 시점에서 실패한다.이것이 GIT_DIR로 돌아가는 가장 빠르고 빠른 방법입니다.

$ git config alias.root '!pwd'
# then you have:
$ git root

다음은 두 가지 경우를 모두 처리하는 스크립트입니다. 1) 작업영역이 있는 저장소, 2) 베어 저장소입니다.

https://gist.github.com/jdsumsion/6282953

git-root 내의 저장 가능): (경로 내의 파일 가능):

#!/bin/bash
GIT_DIR=`git rev-parse --git-dir` &&
(
  if [ `basename $GIT_DIR` = ".git" ]; then
    # handle normal git repos (with a .git dir)
    cd $GIT_DIR/..
  else
    # handle bare git repos (the repo IS a xxx.git dir)
    cd $GIT_DIR
  fi
  pwd
)

이게 도움이 됐으면 좋겠네요.

Git 2.13.0 이후 서브모듈 내부에서 사용해도 작동하는 루트 프로젝트의 경로를 보여주는 새로운 옵션을 지원합니다.

git rev-parse --show-superproject-working-tree

셸 프레임워크에서의 사전 설정된 셸 에일리어스

셸 프레임워크를 사용하는 경우 이미 사용 가능한 셸 별칭이 있을 수 있습니다.

  • $ grtoh-my-zsh(68k)(cd $(git rev-parse --show-toplevel || echo "."))
  • $ git-rootin prezto (8.8k) (작업 트리 루트에 대한 경로 변경)
  • $ g.. zimfw (1k) (현재 디렉토리를 작업 트리의 최상위 수준으로 변경합니다.)

나는 대니얼 브로크먼의 훌륭한 코멘트에 대해 자세히 말하고 싶었다.

의 정의git config --global alias.exec '!exec '에서는, 「 」의 조작을 할 수 .git exec make 「」로서, 「」라고 하는 것은,man git-config★★★★

별칭 확장 앞에 느낌표가 있으면 셸 명령으로 처리됩니다. [...] 셸 명령은 저장소의 최상위 디렉터리에서 실행됩니다. 이 디렉터리는 현재 디렉터리가 아닐 수도 있습니다.

'아까운 게 있다'라는 것도 수 있어요.$GIT_PREFIX저장소의 최상위 디렉토리에 상대적인 현재 디렉토리에 대한 경로가 됩니다.하지만, 알고 있는 것은 싸움의 반™에 지나지 않습니다.셸 변수 확장으로 인해 사용하기 어렵습니다. 저는 사용하기를 권합니다.bash -c다음과 같이 합니다.

git exec bash -c 'ls -l $GIT_PREFIX'

기타 명령어는 다음과 같습니다.

git exec pwd
git exec make

한 방법이 한 경우 POSIX를 필요로 하지 .git행행: :

다음과 같습니다git-root.

#$1: Path to child directory
git_root_recurse_parent() {
    # Check if cwd is a git root directory
    if [ -d .git/objects -a -d .git/refs -a -f .git/HEAD ] ; then
        pwd
        return 0
    fi

    # Check if recursion should end (typically if cwd is /)
    if [ "${1}" = "$(pwd)" ] ; then
        return 1
    fi

    # Check parent directory in the same way
    local cwd=$(pwd)
    cd ..
    git_root_recurse_parent "${cwd}"
}

git_root_recurse_parent

는, 하고, 마지막 shebang, shebang, shebang을 .git_root_recurse_parent§:

git_root() {
    (git_root_recurse_parent)
}

Git ★★★★★★★★★★★★★★★★★★★★★★★★★★★」--git-dir..git실제 .git할 수 , " " " 를 사용합니다.--git-common-dir★★★★

/Projects/mywork$ git rev-parse --git-dir
/Projects/app/.git/worktrees/mywork
/Projects/mywork$ git rev-parse --git-common-dir
/Projects/app/.git

편집: 후크에는 다음과 같은 더 나은 솔루션이 있습니다.

/Projects/mywork$ git rev-parse --git-path hooks
/Projects/app/.git/hooks

오늘 이 문제를 직접 해결해야 했어프로그램에 필요했기 때문에 C#에서 해결했지만, 특별히 다시 쓸 수 있을 것 같습니다.이 Public Domain을 고려합니다.

public static string GetGitRoot (string file_path) {

    file_path = System.IO.Path.GetDirectoryName (file_path);

    while (file_path != null) {

        if (Directory.Exists (System.IO.Path.Combine (file_path, ".git")))
            return file_path;

        file_path = Directory.GetParent (file_path).FullName;

    }

    return null;

}

언급URL : https://stackoverflow.com/questions/957928/is-there-a-way-to-get-the-git-root-directory-in-one-command

반응형