Як ви отримуєте ім'я сховища Git у деякому сховищі Git?


144

Коли ви працюєте в якомусь каталозі 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 / ...
Nevik Rehnel

якщо ви використовуєте 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".
sheac

7
Ця команда дає вам саме це: ім'я каталогу безпосередньо над .git dir. Це одна інтерпретація "назви сховища", і, здається, це одне ОП шукало. Очевидно, є й інші допустимі інтерпретації, наприклад, назва сховища віддаленого походження. У цьому випадку немає універсальної правди, і це дійсно залежить від того, що ви хочете.
Фуад Сауд

1
Не працює у Windows 8.1, коли мій каталог виглядає як "Проект 1.1". Це лише перегукується з «Проектом». Плюс назва папки тут не обов'язково пов'язана з моїм іменем репо, правда?
Буттер Буткус

Додатковий запитання: як додати це до рядка в рядку ланцюга, як: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Як ви, напевно, бачите, цей рядок не буде працювати причиною використання `` всередині ''
страх

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

так, я шукав це, дуже цінував! назва моєї папки відрізнялася;)
csomakk

Цей також працює: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

У git 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]
Макс Каскон

Якщо ви користуєтесь цим у Дженкінсі, вам захочеться зняти нову лінію з 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-адресу сховища з поля "Отримати URL-адресу:" та повторно встановіть його, щоб отримати частину з назвою: https://github.com/dragn/ neat-vimrc .git


1
Так, це нормально, але це буде запитувати пульт для оновлення. Краще використовувати git remote show origin -nдля запобігання цьому.
Ryanmt

1
Чи можемо ми оновити команду sed, щоб вона також працювала, коли URL-адреса не закінчується .git? так 'foo.git' стає 'foo', але 'foo' також відповідає? Гадаю, нам потрібна не жадібна відповідність?
Арнут Енгелен

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

Має сенс! Хороший!
Арнут Енгелен

7
Цей простіший sedgit remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
варіант

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 замість назви проекту, але невелику ціну, яку потрібно заплатити. Те, як це роблять всі інші, порушиться, якби в назві репо відбувся ".git". Навряд чи, але можливо.
Шейн Дж

1
@ShaneJ ти маєш рацію, і ти запропонував мені написати власну відповідь, яка обробляє ".git" у назві repo віддаленого походження: stackoverflow.com/a/58843794/2696867
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

Повне ім'я Repo:

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

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. Таким чином, ви можете просто переглянути 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:

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.