Program Tip

디렉토리가 git 제어하에 있는지 확인

programtip 2020. 11. 23. 19:53
반응형

디렉토리가 git 제어하에 있는지 확인


주어진 디렉토리가 git 저장소의 일부인지 어떻게 알 수 있습니까?

(다음은 파이썬에 있지만 bash 등은 괜찮습니다.)

os.path.isdir('.svn')

현재 디렉토리가 Subversion에 의해 제어되는지 여부를 알려줍니다. Mercurial과 Git에는 저장소 상단에 .hg / .git이 있으므로 hg사용할 수 있습니다.

os.system('hg -q stat 2> /dev/null > /dev/null') == 0)

그러나 git status아무것도 변경되지 않으면 0이 아닌 (오류) 종료 상태를 반환합니다.

.git내가 할 수있는 최선 의 방법을 찾는 과정을 반복하고 있습니까?


루비에서는 system('git rev-parse')현재 디렉토리가 git repo에 있으면 true를 반환하고 그렇지 않으면 false를 반환합니다. pythonic 등가물이 비슷하게 작동해야한다고 생각합니다.

편집 : 물론 충분합니다.

# in a git repo, running ipython
>>> system('git rev-parse')
0

# not in a git repo
>>> system('git rev-parse')
32768

중요한 경우 저장소에 있지 않을 때 STDERR에 일부 출력이 있음을 유의하십시오.


방금 발견했습니다 git help rev-parse

git rev-parse --is-inside-work-tree

인쇄 true는 작업 트리에있는 경우, false그것은 '.git'나무, 치명적인 오류의 경우는 둘 다하지 않는 경우는. 'true'와 'false'는 모두 종료 상태가 0 인 stdout에 인쇄되고 치명적인 오류는 종료 상태가 128 인 stderr에 인쇄됩니다.


를 사용 gitpython하면 다음과 같은 함수를 만들 수 있습니다.

import git

...

def is_git_repo(path):
    try:
        _ = git.Repo(path).git_dir
        return True
    except git.exc.InvalidGitRepositoryError:
        return False

음, 디렉토리는 .gitignore 파일에 의해 무시 될 수도 있습니다. 따라서 .git 저장소를 확인하고, 만약 있다면 .gitignore를 파싱하여 그 디렉토리가 실제로 git 저장소에 있는지 확인해야합니다.

정확히 무엇을 하시겠습니까? 이를 수행하는 더 간단한 방법이있을 수 있습니다.

편집 : "이 디렉토리가 GIT 저장소의 루트입니까"를 의미합니까, 아니면 "이 디렉토리가 GIT 저장소의 일부입니까"를 의미합니까?

첫 번째의 경우 .git이 있는지 확인하십시오-루트에 있으므로 완료되었습니다. 두 번째의 경우 GIT 저장소 내부에 있음을 확인한 후 .gitignore에서 해당 하위 디렉터리를 확인해야합니다.


기록을 위해 git status 또는 이와 유사한 것을 사용하십시오. 이것은 완전성을 위해서입니다. :)

트리를 위로 검색하는 것은 정말 큰 일이 아닙니다. bash에서는이 간단한 한 줄짜리 작업을 수행 할 수 있습니다 (한 줄에 배치하면 ...);) 하나가 발견되면 0을 반환하고 그렇지 않으면 1을 반환합니다.

d=`pwd`
while [ "$d" != "" ]; do
  [ -d "$d"/.git ] && exit 0
  d=${d%/*}
done
exit 1

.git 폴더를 위쪽으로 검색합니다.


.git/저장소가 무엇인지 정의하기가 어렵습니다.

나는 Git이 Git 저장소로 간주하는 것을보기 위해 약간의 실험을했다.

1.9.1부터 .gitGit이 고려할 디렉토리 내부에 있어야하는 최소 디렉토리 구조 는 다음과 같습니다.

mkdir objects refs
printf 'ref: refs/' > HEAD

에서 인정한대로 rev-parse.

It is also obviously a corrupt repository in which most useful commands will fail.

The morale is: like any other format detection, false positives are inevitable, specially here that the minimal repo is so simple.

If you want something robust, instead of detecting if it is a Git repo, try to do whatever you want to do, and raise errors and deal with them if it fails.

It's easier to ask forgiveness than it is to get permission.


From git help rev-parse again, I think you can do something like :

git rev-parse --resolve-git-dir <directory> 

and check if the command returns the directory path itself. According to the manual git rev-parse returns the path to the directory if the argument contains a git repo or is a file which contains the path to a git repo.


Add this to your .bash_profile, and your prompt will always show the active git branch and whether you have uncommitted changes.

function parse_git_dirty {
  [[ $(git status 2> /dev/null | tail -n1) != "nothing to commit (working directory clean)" ]] && echo "*"
}
function parse_git_branch {
  git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/"
}

export PS1=' \[\033[0;33m\]\w\[\033[00m\]\[\033[01;00m\]$(parse_git_branch): ' #PS1='\w> '

You'll see this:

 ~: 
 ~: cd code/scala-plugin/
 ~/code/scala-plugin[master*]: 

If you'd prefer to look for a .gitdirectory, here's a cute way of doing that in Ruby:

require 'pathname'

def gitcheck()
  Pathname.pwd.ascend {|p| return true if (p + ".git").directory? }
  false
end

I'm unable to find something similar to ascend in Python.


Using git rev-parse --is-inside-work-tree along with subprocess.Popen, you can check if "true" is printed from the output indicating the directory does have a git repo:

import subprocess

repo_dir = "../path/to/check/" 

command = ['git', 'rev-parse', '--is-inside-work-tree']
process = subprocess.Popen(command, stdout=subprocess.PIPE, cwd=repo_dir,
                           universal_newlines=True)
process_output = process.communicate()[0]

is_git_repo = str(process_output.strip())

if is_git_repo == "true":
    print("success! git repo found under {0}".format(repo_dir))
else:
    print("sorry. no git repo found under {0}".format(repo_dir))

참고URL : https://stackoverflow.com/questions/2044574/determine-if-directory-is-under-git-control

반응형