일부 Git 저장소에서 Git 저장소의 이름을 어떻게 얻습니까?


144

Git 디렉토리에서 작업 할 때 Git 저장소에서 Git 저장소 이름을 어떻게 얻을 수 있습니까? 힘내 명령이 있습니까?

# I did check out bar repository and working in somewhere 
# under bar directory at this moment such as below.

$ git clone git://github.com/foo/bar.git
$ cd bar/baz/qux/quux/corge/grault # and I am working in here!
$ git xxx # <- ???
bar

이것이 당신이 따르는 것 같습니다. stackoverflow.com/questions/4076239/…
Max Sherman

아니, 아마 그가 원하는 것이 아닐 것입니다. 이것은 다음과 같을 수도 있습니다 : stackoverflow.com/questions/957928/…
Nevik Rehnel 2013 년

당신은 Node.js를 사용하는 경우 당신은 시도 할 수 npmjs.com/package/git-repo-name
jonschlinkert

답변:


153

저장소 이름에 대해 Git 루트 디렉토리 이름 (.git 디렉토리가 포함 된 이름)을 의미하는 경우 다음을 실행할 수 있습니다.

basename `git rev-parse --show-toplevel`

git rev-parse --show-toplevel부분은 해당 디렉토리의 경로를 제공하고 경로 basename의 첫 부분을 제거합니다.


9
@mvp에서 아래에 나와 있듯이 .git하위 디렉토리를 포함하는 디렉토리 의 이름을 변경할 수 있으므로 "저장소 이름으로 git root 디렉토리 이름을 의미하는"것은 아닙니다.
sheac

7
이 명령은 정확히 .git 디렉토리 바로 위에있는 디렉토리 이름을 제공합니다. 이것이 "저장소 이름"에 대한 한 가지 해석이며 OP가 찾고있는 것 같습니다. 분명히 원격 오리진 저장소의 이름과 같은 다른 유효한 해석이 있습니다. 이 경우 보편적 인 진실은 없으며 실제로 원하는 것에 달려 있습니다.
Fuad Saud

1
내 디렉토리가 "프로젝트 1.1"처럼 보일 때 Windows 8.1에서 작동하지 않습니다. "프로젝트"만 에코합니다. 여기에 폴더 이름이 반드시 내 repo 이름과 관련이있는 것은 아닙니다.
Buttle Butkus

추가 질문 : 어떻게 이것을 체인 줄에 문자열로 추가합니까 : git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www"?? 당신은 아마이 줄을 참조 윌`안에```사용하지 작업 원인은
fearis

1
안전하지 않습니다. cd / var / www / html을 시도 git --git-dir=<some git repo>/.git rev-parse --show-toplevel하면 / var / www / html
sibaz

126

일반적으로이 작업을 수행 할 수 없습니다. Git은 git 저장소의 이름을 지정하지 않습니다. 예를 들어, 저장소 ( .git하위 디렉토리가 있는 디렉토리)가 포함 된 디렉토리의 이름을 바꿀 수 있으며 git은 그것을 알지 못합니다. 모든 것이 계속 작동합니다.

그러나 복제 한 경우 다음 명령을 사용할 수 있습니다.

git remote show origin

리포지토리를 복제 한 원본 원격에 대한 많은 정보를 표시하려면 원본 복제 URL이 포함됩니다.

그러나을 사용하여 원래 원격지에 대한 링크를 제거 git remote rm origin했거나을 사용하여 해당 리포지토리를 만든 경우 git init이러한 정보를 얻는 것이 불가능합니다.


2
항상 잘 사용하여 분기 이름을 얻을 수 있습니다 git branch:) (활성 분기는 별표로 표시됩니다 *).
mvp

95

이름을 얻기 위해 저장소에 접속할 필요가 없으며 폴더 이름에 반드시 원격 이름이 반영되지는 않습니다.

이것이 현재 저장소 이름을 얻는 가장 정확하고 효율적인 방법이라는 것을 알았습니다.

basename -s .git `git config --get remote.origin.url`

이것은 Git 1.8.1.5부터 작동합니다. 이 전에는 더 이상 사용되지 않는 git-repo-config명령이 작동했습니다 (Git 1.7.5부터).


4
동의합니다. 이것은 가장 깨끗한 답변입니다 ($ {PWD ## * /}을 사용했지만 현재 폴더 이름은 원본과 다를 수 있습니다)
Vincent De Smet

그렇습니다, 나는 이것을 찾고 있었다, 대단히 감사합니다.! 내 폴더 이름이
다름

이것도 작동합니다 : basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

에서 자식 v2.7.0의 + , 부속 명령이 get-url소개되었다 git-remote명령.

POSIX 쉘 :

basename $(git remote get-url origin)

PowerShell :

Split-Path -Leaf (git remote get-url origin)

.git이 방법을 사용하여 문자열의 끝 부분을 얻으 므로 분할을 추가하여 제거했습니다.(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Jenkins에서이 기능을 사용하는 경우 다음과 같이 줄 바꿈 개행을 제거해야합니다 trim().def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

디렉토리 이름이 원격 리포지토리 이름과 일치하지 않는 경우에도 다른 답변이 작동하지 않습니다. 다음과 같이 저장소 의 실제 이름을 얻을 수 있습니다 .

git remote show origin -n | grep "Fetch URL:" | sed -E "s#^.*/(.*)$#\1#" | sed "s#.git$##"

기본적으로을 호출 git remote show origin하고 "Fetch URL :"필드에서 리포지토리 URL을 가져 와서 정규식으로 이름을 가진 부분을 가져옵니다 : https://github.com/dragn/ neat-vimrc .git


1
예, 괜찮습니다.하지만 업데이트를 위해 리모콘을 쿼리합니다. git remote show origin -n이를 방지하기 위해 사용 하는 것이 좋습니다 .
Ryanmt

1
원본 URL이 .git로 끝나지 않을 때도 작동하도록 sed 명령을 업데이트 할 수 있습니까? 그래서 'foo.git'은 'foo'가되지만 'foo'도 일치합니까? 욕심없는 매칭이 필요하다고 생각하십니까?
Arnout Engelen

@ArnoutEngelen 가장 간단한 방법은에 대한 .git다른 호출을 선택적으로 제거 sed하는 것입니다. 응답의 코드를 업데이트했습니다. 이렇게하면 URL이로 끝나지 않을 때 작동 .git합니다.
드래그 함

말이된다! 좋은 것!
Arnout Engelen

7
이 간단한 방법 sed은 Mac OSX에서 더 잘 작동했습니다.git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

github에서 사용자 이름 또는 조직 이름과 프로젝트 또는 리포지토리 이름을 얻으려고하면 적어도 로컬에서 작동하는이 명령을 작성할 수있었습니다.

 git config --get remote.origin.url
# => https://github.com/Vydia/gourami.git

 git config --get remote.origin.url | sed 's/.*\/\([^ ]*\/[^.]*\).*/\1/' # Capture last 2 path segments before the dot in .git
# => Vydia/gourami

이것은 Vydia조직 이름과 같이 원하는 결과 gourami이며 패키지 이름입니다. 결합하여 완전한 User/Repo경로를 형성 할 수 있습니다


5

이것이 리포지토리 의 복제본명확하게 식별하는 더 좋은 방법이라고 생각 합니다.

git config --get remote.origin.url원점이 일치하는지 확인합니다 ssh://your/repo.


1
실제로 더 강한 조건은 구문 분석이 덜 필요합니다. 프로젝트 이름 대신 URL 이름을 지정해야 할 수도 있지만 적은 비용이 듭니다. repo 이름에서 ".git"가 발생하면 다른 모든 사람이 수행하는 방식이 중단됩니다. 가능하지는 않지만 가능합니다.
Shane J

1
: 당신 @ShaneJ 맞아요 당신은 ".git"원격 원점 REPO 이름을 처리하는 내 자신의 답변을 작성하는 저를 묻는 메시지가 stackoverflow.com/a/58843794/2696867
animatedgif

5

이 질문에 조금 늦었지만 다음과 같은 경우 :

cat /path/to/repo/.git/config

reponame을 포함 할 저장소의 URL이 표시됩니다.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = true
[remote "origin"]
    url = https://github.com/your_git_user_name/your_git_repo_name.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master

2

레포 이름 :

git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"

이 질문에서 gipcompany는 디렉토리 계층의 깊은 곳에 있다고 언급했습니다. 그가 실제로 원하는 것이 확실하지 않지만 (예제 있습니다 - " Git 저장소의 어느 곳에서나 Git 저장소 이름을 얻을 있습니다 "(git 저장소를 상상하는 방법과 상충 할 수 있음)) / URL을 알고 있어야합니다.
greybeard

1

이 방법을 사용 git-remote하면 HTTPS 원격에서 잘 작동했습니다.

$ git remote -v | grep "(fetch)" | sed 's/.*\/\([^ ]*\)\/.*/\1/'
                                                |  |        | |
                                                |  |        | +---------------+
                                                |  |        | Extract capture |
                                                |  +--------------------+-----+
                                                |Repository name capture|
                                                +-----------------------+


1

저장소 이름을 올바르게 설정하는 bash 함수는 다음과 같습니다 (제대로 설정 한 경우).

__get_reponame ()
{
    local gitdir=$(git rev-parse --git-dir)

    if [ $(cat ${gitdir}/description) != "Unnamed repository; edit this file 'description' to name the repository." ]; then
        cat ${gitdir}/description
    else
        echo "Unnamed repository!"
    fi
}

설명:

local gitdir=$(git rev-parse --git-dir)

현재 저장소 git rev-parse --git-dir.git디렉토리에 대한 전체 경로를 인쇄하는을 실행 합니다. 경로를에 저장합니다 $gitdir.

if [ $(cat ${gitdir}/description) != "..." ]; then

현재 저장소 cat ${gitdir}/description의 내용을 인쇄하는을 실행 .git/description합니다. 저장소의 이름을 올바르게 지정하면 이름이 인쇄됩니다. 그렇지 않으면 인쇄됩니다Unnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

저장소의 이름이 올 바르면 내용을 인쇄하십시오.

else

그렇지 않으면...

echo "Unnamed repository!"

사용자에게 리포지토리의 이름이 지정되지 않았 음을 알리십시오.


이 스크립트 에서 비슷한 것이 구현됩니다 .


1

불행히도, Git에는 그러한 명령이 내장되어 있지 않은 것 같습니다. 그러나 Git 별명과 쉘 마법으로 쉽게 추가 할 수 있습니다.

이 답변 에서 지적했듯이 git rev-parse --show-toplevel현재 Git 폴더의 루트를 표시하는 데 사용할 수 있습니다 .

이것을 정기적으로 사용하려면 별칭으로 정의하는 것이 더 편리합니다. 이를 위해을 사용했습니다 git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. 그런 다음 git root현재있는 저장소의 루트 폴더를 볼 수 있습니다 .

이외의 다른 하위 명령 이름을 사용 하려면 위 명령 root의 두 번째 부분 을 원하는 것으로 바꾸십시오 alias.root.

Git의 별칭에 대한 자세한 내용은 git config매뉴얼 페이지를 참조하십시오 .


2
git config --add alias.root 'rev-parse --show-toplevel'단일 명령 별칭을 위해 셸을 넣을 필요가 없습니다.
kostix

1

전체 GitHub 리포지토리 이름 ( '전체 이름')-사용자 / 리포지토리를 원하고 Ruby로 수행하려는 경우 ...

git remote show origin -n | ruby -ne 'puts /^\s*Fetch.*:(.*).git/.match($_)[1] rescue nil'

0

내 꺼야 :

git remote --verbose | grep origin | grep fetch | cut -f2 | cut -d' ' -f1

다른 것보다 낫지는 않지만 bash 함수로 만들었으므로 원격이 아닌 경우 원격 이름을 드롭 할 수 있습니다.

grurl () {
  xx_remote=$1
  [ -z "$xx_remote" ] && xx_remote=origin
  git remote --verbose | grep "$1" | grep fetch | cut -f2 | cut -d' ' -f1
  unset xx_remote
}

0

또한 .git디렉토리 안에 repo 정보가 있다는 것을 알았습니다 . FETCH_HEAD터미널에서 파일을보고 repo의 이름을 볼 수 있습니다 .

예:

cd your_project_folder/.git
more FETCH_HEAD

산출:

672e38391557a192ab23a632d160ef37449c56ac        https://bitbucket.org/fonjeekay/some_repo

그리고 https://bitbucket.org/somebituser/some_repo.git당신의 저장소의 이름입니다


0

이것은 git-2.18.2와 잘 작동하며 git 대상 저장소 외부에서 시작할 수 있습니다.

basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)


-1

git remote -v를 사용할 수 있습니다

설명서 : https://git-scm.com/docs/git-remote

분기를 추적하는 리포지토리 세트 ( "원격")를 관리합니다. -v --verbose 조금 더 자세하게 설명하고 이름 뒤에 원격 URL을 표시하십시오. 참고 : 이것은 remote와 subcommand 사이에 있어야합니다.


1
git remote -v하나 이상의 URL을 반환합니다. 이것이 어떻게 질문에 대답합니까?
피터 Mortensen

앞에서 언급했듯이 URL 만 반환하고 URL 앞에 불필요한 문자가있는 줄 바꿈으로 구분 된 2 개의 URL을 반환합니다. 따라서 불필요한 정보를 포함시켜 문제를 생성 한 다음 검색 할 두 가지 경로를 제시하지만 여전히 리포지토리 이름을 얻지 못합니다.
Andrew
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.