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.
man
git-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-toplevel
Git 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
해야 할 몇 가지 하다, 하다, 하다.
트리의 는 빈합니다.cwd는 빈 문자열입니다.
실제로는 빈 행이 생성되지만 명령어 대체는 후행 구분을 제거합니다.최종 결과는 빈 문자열입니다.에 '어느 정도'를 붙이는 .
./
이 「」가 되도록 ."./"
cd
.GIT_WORK_TREE가 cwd의 부모가 아닌 위치로 설정되어 있는 경우 출력은 절대 경로 이름이 될 수 있습니다.
''
./
을 사용하다「」의 './
는 절대 경로 앞에 추가되어 상대 경로가 됩니다(또한 cwd가 시스템의 루트 디렉토리일 경우에만 같은 위치를 참조합니다).출력에 공백이 포함될 수 있습니다.
이것은 실제로는 두 번째 경우에만 적용되지만 간단한 수정이 있습니다.명령어 치환 주위에 큰따옴표를 사용합니다(및 그 이후의 값 사용).
했듯이, '하다, 하다, 하다, 하다, 하다, 하다'를 할 수 있습니다.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
셸 프레임워크에서의 사전 설정된 셸 에일리어스
셸 프레임워크를 사용하는 경우 이미 사용 가능한 셸 별칭이 있을 수 있습니다.
$ grt
oh-my-zsh(68k)(cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
in 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
'sourcecode' 카테고리의 다른 글
Dapper ORM을 사용하여 * FROM X WHERE ID IN (...)를 선택합니다. (0) | 2023.04.14 |
---|---|
여러 개의 "with"를 사용할 수 있습니까? (0) | 2023.04.14 |
Excel 커스텀 함수 툴팁 탐색 (0) | 2023.04.14 |
ASP.Net 또는 WPF(C#) (0) | 2023.04.14 |
WPF 그리드의 하단 테두리 (0) | 2023.04.14 |