Как получить имя репозитория Git в каком-нибудь репозитории Git?


153

Когда вы работаете в каком-либо каталоге Git, как вы можете получить имя репозитория 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/…
Макс Шерман

Нет, вероятно, он не этого хочет. Однако это может быть: stackoverflow.com/questions/957928/…
Невик Ренель,

если вы используете node.js, вы можете попробовать npmjs.com/package/git-repo-name
jonschlinkert

Ответы:


161

Что ж, если для имени репозитория вы имеете в виду имя корневого каталога Git (тот, который содержит каталог .git), вы можете запустить это:

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

Эта git rev-parse --show-toplevelчасть дает вам путь к этому каталогу и basenameудаляет первую часть пути.


10
Как говорит @mvp ниже, вы можете изменить имя каталога, содержащего .gitподкаталог, поэтому неверно, что «если для имени репозитория вы имеете в виду имя корневого каталога git».
sheac 03

7
Эта команда дает вам именно это: имя каталога прямо над каталогом .git. Это одна из интерпретаций «имени репозитория», и, похоже, это именно то, что искал OP. Очевидно, существуют и другие допустимые интерпретации, например имя удаленного репозитория происхождения. В этом случае нет универсальной истины, и это действительно зависит от того, чего вы хотите.
Fuad Saud

1
Не работает в Windows 8.1, когда мой каталог выглядит как «Проект 1.1». Это только перекликается с «Проектом». Кроме того, имя папки здесь не обязательно связано с именем моего репо, верно?
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

136

В общем, нельзя этого делать. Git не волнует, как называется ваш репозиторий git. Например, вы можете переименовать каталог, содержащий ваш репозиторий (один с .gitподкаталогом), и git даже не заметит этого - все будет продолжать работать.

Однако, если вы его клонировали, вы можете использовать команду:

git remote show origin

для отображения большого количества информации об исходном пульте дистанционного управления, из которого вы клонировали свой репозиторий, и он будет содержать исходный URL-адрес клона.

Если, однако, вы удалили ссылку на исходное удаленное использование git remote rm originили если вы создали этот репозиторий, используя git init, такую ​​информацию получить просто невозможно - ее нигде нет.


2
Вы всегда можете получить название ветки, используя хорошо, git branch:) (активная ветка будет отмечена звездочкой *).
mvp

105

Нет необходимости связываться с репозиторием, чтобы получить имя, и имя папки не обязательно будет отражать удаленное имя.

Я обнаружил, что это наиболее точный и эффективный способ получить текущее имя репозитория:

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

Это должно работать с Git 1.8.1.5. До этого git-repo-configработала бы устаревшая команда (уже в Git 1.7.5).


5
Согласен, это наиболее чистый ответ (раньше у меня был $ {PWD ## * /}, но, как вы говорите, текущее имя папки может отличаться от
Винсент Де Смет

да, я искал это, очень признателен! имя моей папки отличалось;)
csomakk

Этот также работает: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

Кроме того, команда выше: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)может быть запущена из любого места, вам не нужно находиться внутри репозитория git.
fjammes

29

В git v2.7.0 +get-url для git-remotecommand была введена подкоманда .

Оболочка POSIX:

basename $(git remote get-url origin)

PowerShell:

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

1
Я получаю .gitв конце строки с помощью этого метода, поэтому я добавил разделение, чтобы убрать его:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Макс Каскон

Если вы используете это в Jenkins, вы захотите удалить завершающую новую trim()def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
строку

17

Другие ответы по-прежнему не будут работать, если имя вашего каталога не соответствует имени удаленного репозитория (а может). Вы можете получить настоящее имя репозитория примерно так:

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

По сути, вы вызываете git remote show origin, берете URL-адрес репозитория из поля «Fetch URL:» и повторяете его, чтобы получить часть с именем: https://github.com/dragn/ neat-vimrc .git


1
Да, это нормально, но это запросит у пульта обновление. Лучше использовать, git remote show origin -nчтобы этого не произошло.
Ryanmt

1
Можем ли мы обновить команду sed, чтобы она также работала, когда исходный URL-адрес не заканчивается на .git? так что "foo.git" становится "foo", но "foo" также совпадает? Думаю, нам нужно не жадное сопоставление?
Arnout Engelen

@ArnoutEngelen Я думаю, что самое простое, что можно сделать, это (необязательно) разделить .gitдругой вызов sed, я обновил код в ответе. Таким образом, это будет работать, если URL-адрес не заканчивается на .git.
dragn

Имеет смысл! Хороший!
Arnout Engelen

7
Этот упрощенный sedgit remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
вариант

8

Если вы пытаетесь получить имя пользователя или имя организации И имя проекта или репо на 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путь


1
git config --get remote.origin.url | sed -r 's/.*(\@|\/\/)(.*)(\:|\/)([^:\/]*)\/([^\/\.]*)\.git/https:\/\/\2\/\4\/\5/'преобразует ОБЕ git@dom.tld:User/Repo.gitИ https://dom.tld/User/Repo.gitв https://dom.tld/User/Repo. Попал туда благодаря твоей sedидее
Рид

5

Я думаю, что это лучший способ однозначно идентифицировать клон репозитория.

git config --get remote.origin.urlи проверка, чтобы убедиться, что происхождение совпадает ssh://your/repo.


1
На самом деле более сильное условие требует меньшего анализа. Возможно, придется указать имя URL вместо имени проекта, но это небольшая цена. То, как это делают все остальные, сломалось бы, если бы в имени репо появилось «.git». Вряд ли, но возможно.
gamesguru

1
@ShaneJ, вы правы, и вы предложили мне написать мой собственный ответ, который обрабатывает ".git" в имени
animatedgif

5

Немного поздно для этого вопроса, но если вы:

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

Вы увидите 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

Если вам нужно полное имя репозитория GitHub ('полное имя') - пользователь / репозиторий, и вы хотите сделать это с помощью Ruby ...

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

2

Полное наименование репо:

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

В вопросе gipcompany упоминает, что находится где-то в глубине иерархии каталогов. Хотя я не уверен, что он на самом деле хочет (есть пример - может быть, « получить имя репозитория Git из любого места в этом репозитории Git » (что расходится с тем, как я представляю себе репозитории git)), я не вижу никаких признаков того, что / URL должен быть известен.
глиняный кувшин

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

0

Вот мой:

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

не лучше, чем другие, но я сделал ее функцией bash, чтобы я мог добавить удаленное имя, если оно не origin.

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каталога есть некоторая информация о репо . Итак, вы можете просто посмотреть FETCH_HEADфайл в терминале, чтобы увидеть имя репо:

Пример:

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 target:

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 после имени. ПРИМЕЧАНИЕ: Это должно быть помещено между удаленным и подкомандой.


1
git remote -vпросто возвращает один или несколько URL-адресов. Как это отвечает на вопрос?
Питер Мортенсен

Как указывалось ранее, это возвращает только URL-адреса ... и возвращает 2 URL-адреса, разделенных разрывом строки, с ненужными символами перед URL-адресом. Итак, он создает проблему, включая ненужную информацию, затем предоставляет два пути для поиска, а затем по-прежнему не получает имя репо.
Эндрю
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.