Jak uzyskać nazwę repozytorium Git w jakimś repozytorium Git?


144

Kiedy pracujesz w jakimś katalogu Git, jak możesz uzyskać nazwę repozytorium Git w jakimś repozytorium Git? Czy są jakieś polecenia 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

Wygląda na to, że właśnie tego szukasz. stackoverflow.com/questions/4076239/…
Max Sherman,

Nie, prawdopodobnie nie tego chce. Może to być jednak: stackoverflow.com/questions/957928/…
Nevik Rehnel

jeśli używasz node.js, możesz spróbować npmjs.com/package/git-repo-name
jonschlinkert

Odpowiedzi:


153

Cóż, jeśli jako nazwę repozytorium masz na myśli nazwę katalogu głównego Git (ten, który zawiera katalog .git), możesz uruchomić to:

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

git rev-parse --show-toplevelCzęść daje ścieżkę do tego katalogu i basenamepaski pierwszą część ścieżki.


9
Jak mówi @mvp poniżej, możesz zmienić nazwę katalogu zawierającego .gitpodkatalog, więc nie jest prawdą, że „jeśli dla nazwy repozytorium masz na myśli nazwę katalogu głównego git”.
sheac

7
To polecenie daje dokładnie to: nazwę katalogu bezpośrednio nad katalogiem .git. To jest jedna interpretacja „nazwy repozytorium” i wygląda na to, że jest to jedyne, którego szukał OP. Oczywiście istnieją inne poprawne interpretacje, takie jak nazwa repozytorium zdalnego pochodzenia. W tym przypadku nie ma uniwersalnej prawdy i to naprawdę zależy od tego, czego chcesz.
Fuad Saud

1
Nie działa w systemie Windows 8.1, gdy mój katalog wygląda jak „Projekt 1.1”. Powtarza tylko „Projekt”. Poza tym nazwa folderu tutaj niekoniecznie jest związana z nazwą mojego repozytorium, prawda?
Buttle Butkus

Dodatkowe pytanie: jak dodać to jako ciąg w linii łańcucha, np .: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Jak zapewne widzisz, ta linia nie zadziała, ponieważ używasz `` wewnątrz ''
strachis

1
To nie jest bezpieczne. Wypróbuj cd / var / www / html, git --git-dir=<some git repo>/.git rev-parse --show-toplevela
zwróci

126

Generalnie nie możesz tego zrobić. Git nie dba o to, jak nazywa się twoje repozytorium git. Na przykład, możesz zmienić nazwę katalogu zawierającego repozytorium (takie z .gitpodkatalogiem), a git nawet tego nie zauważy - wszystko będzie dalej działać.

Jeśli jednak go sklonowałeś, możesz użyć polecenia:

git remote show origin

aby wyświetlić wiele informacji o oryginalnym pilocie, z którego sklonowałeś swoje repozytorium, i będzie zawierał oryginalny sklonowany adres URL.

Jeśli jednak usunąłeś link do oryginalnego zdalnego użycia git remote rm originlub jeśli utworzyłeś to repozytorium za pomocą git init, takich informacji jest po prostu niemożliwe do uzyskania - nigdzie ich nie ma.


2
Nazwę oddziału można zawsze uzyskać używając dobrze git branch:) (aktywna gałąź będzie oznaczona gwiazdką *).
mvp,

95

Nie ma potrzeby kontaktowania się z repozytorium, aby uzyskać nazwę, a nazwa folderu niekoniecznie musi odzwierciedlać nazwę zdalną.

Uważam, że jest to najdokładniejszy i najskuteczniejszy sposób uzyskania aktualnej nazwy repozytorium:

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

Powinno to działać od wersji Git 1.8.1.5. Wcześniej przestarzałe git-repo-configpolecenie działałoby (już w Git 1.7.5).


4
Zgoda, to najczystsza odpowiedź (miałem $ {PWD ## * /}, ale jak mówisz, aktualna nazwa folderu może różnić się od pochodzenia)
Vincent De Smet

tak, szukałem tego, bardzo doceniam.! nazwa mojego folderu była
inna

Ten również działa: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

W git v2.7.0 + , A komenda get-urlzostała wprowadzona do git-remotekomendy.

Powłoka POSIX:

basename $(git remote get-url origin)

PowerShell:

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

Dostaję .gitna końcu mojego ciągu używając tej metody, więc dodałem podział, aby go zdjąć:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Jeśli używasz tego w Jenkins, będziesz chciał usunąć końcową nową linię za pomocą trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

Inne odpowiedzi nadal nie będą działać, jeśli nazwa twojego katalogu nie odpowiada nazwie zdalnego repozytorium (a może). Możesz dostać prawdziwe nazwę repozytorium za pomocą czegoś takiego:

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

Zasadniczo dzwonisz git remote show origin, bierzesz adres URL repozytorium z pola „Pobierz URL:” i regex go, aby uzyskać część o nazwie: https://github.com/dragn/ neat-vimrc .git


1
Tak, to jest w porządku, ale spowoduje to wysłanie zapytania do pilota o aktualizację. Lepiej jest git remote show origin -ntemu zapobiec.
Ryanmt

1
Czy możemy zaktualizować polecenie sed, aby działało również, gdy pierwotny adres URL nie kończy się na .git? więc „foo.git” staje się „foo”, ale „foo” też jest dopasowane? Myślę, że potrzebujemy niechcianego dopasowania?
Arnout Engelen

@ArnoutEngelen Myślę, że najprostszą rzeczą do zrobienia jest (opcjonalnie) rozebranie się .gitz innym wywołaniem do sed, zaktualizowałem kod w odpowiedzi. W ten sposób zadziała, gdy adres URL nie kończy się na .git.
dragn

Ma sens! Dobry!
Arnout Engelen

7
To prostsze seddziałało lepiej na moim Mac OSX:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

Jeśli próbujesz uzyskać nazwę użytkownika lub nazwę organizacji ORAZ nazwę projektu lub repozytorium na github, udało mi się napisać to polecenie, które działa dla mnie przynajmniej lokalnie.

 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

Jest to pożądany wynik, podobnie jak Vydianazwa organizacji i gouraminazwa pakietu. Połączone mogą pomóc uformować pełną User/Repościeżkę


5

Myślę, że jest to lepszy sposób na jednoznaczne zidentyfikowanie klonu repozytorium.

git config --get remote.origin.urli sprawdzanie, czy pochodzenie pasuje ssh://your/repo.


1
Właściwie silniejszy stan wymaga mniej analizowania. Może trzeba będzie podać nazwę adresu URL zamiast nazwy projektu, ale za niewielką cenę. Sposób, w jaki robią to inni, zepsułby się, gdyby w nazwie repozytorium pojawił się „.git”. Mało prawdopodobne, ale możliwe.
Shane J,

1
@ShaneJ masz rację i poprosiłeś mnie o napisanie własnej odpowiedzi, która obsługuje „.git” w nazwie zdalnego repozytorium: stackoverflow.com/a/58843794/2696867
animatedgif

5

Trochę za późno na to pytanie, ale jeśli:

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

Zobaczysz adres URL repozytorium, które będzie zawierać nazwę repozytorium:

[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

Pełna nazwa repozytorium:

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

W pytaniu gipcompany wspomina, że ​​znajduje się gdzieś głęboko w hierarchii katalogów. Chociaż nie jestem pewien, czego on naprawdę chce (istnieje przykład - może to być „ pobierz nazwę repozytorium Git z dowolnego miejsca w tym repozytorium Git ” (co jest sprzeczne z tym, jak wyobrażam sobie repozytoria git)), nie widzę żadnej wskazówki, że / adres URL powinien być znany.
siwobrody

1

To podejście git-remotedziałało dobrze w przypadku pilotów HTTPS:

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

Przykład


1

Oto funkcja bash, która wypisze nazwę repozytorium (jeśli zostało poprawnie skonfigurowane):

__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
}

Wyjaśnienie:

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

Spowoduje git rev-parse --git-dirto wyświetlenie pełnej ścieżki do .gitkatalogu bieżącego repozytorium. Przechowuje ścieżkę w $gitdir.

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

To jest wykonywane cat ${gitdir}/description, co powoduje wydrukowanie zawartości .git/descriptionbieżącego repozytorium. Jeśli poprawnie nazwałeś repozytorium, wypisze ono nazwę. W przeciwnym razie wydrukujeUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Jeśli repozytorium zostało poprawnie nazwane, wydrukuj zawartość.

else

Inaczej...

echo "Unnamed repository!"

Poinformuj użytkownika, że ​​repozytorium nie miało nazwy.


Coś podobnego jest zaimplementowane w tym skrypcie .


1

Niestety wygląda na to, że Git nie ma wbudowanego takiego polecenia. Ale możesz łatwo dodać je samodzielnie, używając aliasów Git i trochę magii powłoki.

Jak wskazano w tej odpowiedzi , możesz użyćgit rev-parse --show-toplevel aby wyświetlić katalog główny bieżącego folderu Git.

Jeśli chcesz używać tego regularnie, prawdopodobnie wygodniej będzie zdefiniować go jako alias. Do tego używane git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Następnie możesz użyć, git rootaby zobaczyć folder główny repozytorium, w którym się aktualnie znajdujesz.

Jeśli chcesz użyć innej nazwy podkomendy niż root, po prostu zamień drugą część alias.rootpowyższego polecenia na dowolną.

Aby uzyskać szczegółowe informacje na temat aliasów w Git, zobacz także git configstronę podręcznika .


2
git config --add alias.root 'rev-parse --show-toplevel'- nie ma potrzeby wrzucania powłoki do aliasu pojedynczego polecenia.
kostix

1

Jeśli chcesz mieć całą nazwę repozytorium GitHub ('pełna nazwa') - użytkownik / repozytorium, i chcesz to zrobić w Rubim ...

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

0

To moje:

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

nie lepiej niż inne, ale zrobiłem z tego funkcję bash, więc mogę dodać zdalną nazwę, jeśli nie jest to źródło.

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

Po prostu stwierdzam, że w .gitkatalogu są informacje o repozytorium . Możesz więc po prostu obejrzeć FETCH_HEADplik w terminalu, aby zobaczyć nazwę repozytorium:

Przykład:

cd your_project_folder/.git
more FETCH_HEAD

Wynik:

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

I https://bitbucket.org/somebituser/some_repo.gitto nazwa twojego repozytorium


0

Ten działa całkiem dobrze z git-2.18.2 i można go uruchomić z zewnętrznego repozytorium git target:

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


-1

Możesz użyć: git remote -v

Dokumentacja: https://git-scm.com/docs/git-remote

Zarządzaj zestawem repozytoriów („pilotów”), których gałęzie śledzisz. -v --verbose Bądź bardziej szczegółowy i pokaż zdalny adres URL po nazwie. UWAGA: To musi być umieszczone pomiędzy zdalnym a podpoleceniem.


1
git remote -vpo prostu zwraca jeden lub więcej adresów URL. Jak to odpowiada na pytanie?
Peter Mortensen

Jak wspomniano wcześniej, zwraca to tylko adresy URL ... i zwraca 2 adresy URL oddzielone znakiem podziału wiersza, z niepotrzebnymi znakami przed adresem URL. W takim razie stwarza problem, dołączając niepotrzebne informacje, a następnie przedstawia dwie ścieżki wyszukiwania, a następnie nadal nie otrzymuje nazwy repozytorium.
Andrew
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.