Comment obtenir le nom du référentiel Git dans un référentiel Git?

144

Lorsque vous travaillez dans un répertoire Git, comment pouvez-vous obtenir le nom du référentiel Git dans un référentiel Git? Existe-t-il des commandes 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
gipcompany
la source
On dirait que c'est ce que vous recherchez. stackoverflow.com/questions/4076239/…
Max Sherman
Non, ce n'est probablement pas ce qu'il veut. Cela pourrait être, cependant: stackoverflow.com/questions/957928/…
Nevik Rehnel
si vous utilisez node.js, vous pouvez essayer npmjs.com/package/git-repo-name
jonschlinkert

Réponses:

153

Eh bien, si, pour le nom du référentiel, vous voulez dire le nom du répertoire racine Git (celui qui contient le répertoire .git), vous pouvez exécuter ceci:

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

La git rev-parse --show-toplevelpartie vous donne le chemin vers ce répertoire et basenamesupprime la première partie du chemin.

Fuad Saud
la source
9
Comme @mvp le dit ci-dessous, vous pouvez changer le nom du répertoire contenant le .gitsous - répertoire, donc ce n'est pas vrai que "si, pour le nom du référentiel, vous voulez dire le nom du répertoire racine git".
sheac
7
Cette commande vous donne exactement cela: le nom du répertoire directement au-dessus du répertoire .git. C'est une interprétation pour "le nom du référentiel", et il semble que c'est celle qu'OP recherchait. De toute évidence, il existe d'autres interprétations valides, comme le nom du référentiel d'origine distant. Il n'y a pas de vérité universelle dans ce cas et cela dépend vraiment de ce que vous voulez.
Fuad Saud
1
Ne fonctionne pas sous Windows 8.1 lorsque mon répertoire ressemble à "Projet 1.1". Il fait seulement écho à "Projet". De plus, le nom du dossier ici n'est pas nécessairement lié au nom de mon dépôt, non?
Buttle Butkus
Question supplémentaire: comment ajouter ceci à une chaîne dans une chaîne comme: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Comme vous le voyez probablement, cette ligne ne fonctionnera pas à cause de l'utilisation de `` inside ''
craint
1
Ce n'est pas sûr. Essayez cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevelet il vous
rendra
126

En général, vous ne pouvez pas faire cela. Git ne se soucie pas du nom de votre dépôt git. Par exemple, vous pouvez renommer le répertoire contenant votre référentiel (un avec un .gitsous-répertoire), et git ne le remarquera même pas - tout continuera à fonctionner.

Cependant, si vous l'avez cloné, vous pouvez utiliser la commande:

git remote show origin

pour afficher de nombreuses informations sur la télécommande d'origine à partir de laquelle vous avez cloné votre référentiel, et il contiendra l'URL de clonage d'origine.

Si, cependant, vous avez supprimé le lien vers la télécommande d'origine à l'aide de git remote rm origin, ou si vous avez créé ce référentiel à l'aide de git init, ces informations sont tout simplement impossibles à obtenir - elles n'existent nulle part.

mvp
la source
2
Vous pouvez toujours obtenir le nom de la branche en utilisant well, git branch:) (la branche active sera marquée d'une étoile *).
mvp
95

Il n'est pas nécessaire de contacter le référentiel pour obtenir le nom, et le nom du dossier ne reflétera pas nécessairement le nom distant.

J'ai trouvé que c'était le moyen le plus précis et le plus efficace d'obtenir le nom du référentiel actuel:

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

Cela devrait fonctionner à partir de Git 1.8.1.5. Avant cela, la git-repo-configcommande désormais obsolète aurait fonctionné (dès Git 1.7.5).

Savoureux Blé
la source
4
D'accord, c'est la réponse la plus claire (j'avais l'habitude d'avoir $ {PWD ## * /} mais comme vous le dites, le nom du dossier actuel peut être différent de l'origine)
Vincent De Smet
oui, je cherchais ceci, très apprécié.! le nom de mon dossier différait;)
csomakk
Celui-ci fonctionne aussi: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes le
28

Dans git v2.7.0 + , une sous-commande a get-urlété introduite dans git-remotecommand.

Shell POSIX:

basename $(git remote get-url origin)

PowerShell:

Split-Path -Leaf (git remote get-url origin)
corbeau vulcain
la source
J'obtiens le .gità la fin de ma chaîne en utilisant cette méthode, j'ai donc ajouté un split pour le dépouiller:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone
Si vous l'utilisez dans Jenkins, vous voudrez trim()def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone
17

D'autres réponses ne fonctionneront toujours pas lorsque le nom de votre répertoire ne correspond pas au nom du référentiel distant (et cela pourrait). Vous pouvez obtenir le vrai nom du référentiel avec quelque chose comme ceci:

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

En gros, vous appelez git remote show origin, prenez l'URL du référentiel dans le champ "Fetch URL:" et regexez-la pour obtenir la partie avec le nom: https://github.com/dragn/ neat-vimrc .git

dragn
la source
1
Oui, ça va, mais cela demandera à la télécommande une mise à jour. Il vaut mieux utiliser git remote show origin -npour éviter cela.
Ryanmt
1
Pouvons-nous mettre à jour la commande sed pour qu'elle fonctionne également lorsque l'URL d'origine ne se termine pas par .git? donc 'foo.git' devient 'foo', mais 'foo' est également mis en correspondance? Je suppose que nous avons besoin d'une correspondance non gourmande?
Arnout Engelen
@ArnoutEngelen Je pense que la chose la plus simple à faire est de se déshabiller (éventuellement) .gitavec un autre appel à sed, j'ai mis à jour le code dans la réponse. De cette façon, cela fonctionnera, lorsque l'URL ne se termine pas par .git.
dragn
Logique! Bon!
Arnout Engelen
7
Ce plus simple sedfonctionnait mieux sur mon Mac OSX:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu
6

Si vous essayez d'obtenir le nom d'utilisateur ou le nom de l'organisation ET le nom du projet ou du repo sur github, j'ai pu écrire cette commande qui fonctionne pour moi au moins localement.

 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

Il s'agit du résultat souhaité, tout comme Vydiale nom de l'organisation et gouramile nom du package. Combinés, ils peuvent aider à former le User/Repochemin complet

GIF animé
la source
5

Je pense que c'est une meilleure façon d' identifier sans ambiguïté un clone d'un référentiel.

git config --get remote.origin.urlet vérifier que l'origine correspond ssh://your/repo.

OLIVER.KOO
la source
1
En fait, une condition plus forte nécessite moins d'analyse. Vous devrez peut-être spécifier le nom de l'url au lieu du nom du projet, mais un petit prix à payer. La façon dont tout le monde le fait serait cassé si ".git" apparaissait dans le nom du dépôt. Peu probable, mais possible.
Shane J
1
@ShaneJ vous avez raison et vous m'avez invité à écrire ma propre réponse qui gère le ".git" dans le nom du repo d'origine distante: stackoverflow.com/a/58843794/2696867
animatedgif
5

Un peu en retard pour cette question, mais si vous:

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

Vous verrez l'url du référentiel qui comprendra le reponame:

[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
jonnyjandles
la source
2

Si vous voulez le nom complet du référentiel GitHub ('nom complet') - utilisateur / référentiel, et que vous voulez le faire avec Ruby ...

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

Nom complet du repo:

git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"
Lemonada
la source
Dans la question, gipcompany mentionne être quelque part au fond de la hiérarchie des répertoires. Bien que je ne sois pas sûr de ce qu'il veut réellement (il y a un exemple - peut être " obtenir le nom du référentiel Git de n'importe où dans ce référentiel Git " (ce qui est en contradiction avec la façon dont j'imagine les référentiels git)), je ne vois aucune indication qu'un / l'URL doit être connue.
greybeard le
1

Cette approche git-remotea bien fonctionné pour moi pour les télécommandes HTTPS:

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

Exemple

tourbillon
la source
1

Voici une fonction bash qui affichera le nom du référentiel (s'il a été correctement configuré):

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

Explication:

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

Ceci s'exécute git rev-parse --git-dir, ce qui imprime le chemin complet du .gitrépertoire du référentiel currrent. Il stocke le chemin dans $gitdir.

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

Cela s'exécute cat ${gitdir}/description, ce qui imprime le contenu .git/descriptionde votre référentiel actuel. Si vous avez correctement nommé votre référentiel, il imprimera un nom. Sinon, il imprimeraUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Si le référentiel a été correctement nommé, imprimez le contenu.

else

Autrement...

echo "Unnamed repository!"

Dites à l'utilisateur que le dépôt n'a pas de nom.


Quelque chose de similaire est implémenté dans ce script .

MD XF
la source
1

Malheureusement, il semble que Git n'ait pas une telle commande intégrée. Mais vous pouvez facilement l'ajouter vous-même avec des alias Git et un peu de magie du shell.

Comme indiqué par cette réponse , vous pouvez utilisergit rev-parse --show-toplevel pour afficher la racine de votre dossier Git actuel.

Si vous souhaitez l'utiliser régulièrement, il est probablement plus pratique de le définir comme un alias. Pour cela, utilisé git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Après cela, vous pouvez utiliser git rootpour voir le dossier racine du référentiel dans lequel vous vous trouvez actuellement.

Si vous souhaitez utiliser un autre nom de sous-commande que root, remplacez simplement la deuxième partie de alias.rootdans la commande ci-dessus par ce que vous voulez.

Pour plus de détails sur les alias dans Git, consultez également la git configpage de manuel .

Nevik Rehnel
la source
2
git config --add alias.root 'rev-parse --show-toplevel'- il n'est pas nécessaire de lancer le shell pour un alias à commande unique.
kostix
0

Voici la mienne:

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

pas mieux que les autres, mais j'en ai fait une fonction bash pour que je puisse ajouter le nom distant s'il n'est pas 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
}
Tamouse
la source
0

Aussi je trouve juste qu'il y a des informations de repo à l'intérieur du .gitrépertoire. Vous pouvez donc simplement regarder le FETCH_HEADfichier dans le terminal pour voir le nom du repo:

Exemple:

cd your_project_folder/.git
more FETCH_HEAD

Production:

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

Et https://bitbucket.org/somebituser/some_repo.gitest le nom de votre référentiel

Yevhenii Shashkov
la source
0

Celui-ci fonctionne plutôt bien avec git-2.18.2 et peut être lancé depuis l'extérieur du référentiel cible git:

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

fjammes
la source
-1

Vous pouvez utiliser: git remote -v

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

Gérez l'ensemble des référentiels ("télécommandes") dont vous suivez les branches. -v --verbose Soyez un peu plus bavard et affichez l'URL distante après le nom. REMARQUE: il doit être placé entre la télécommande et la sous-commande.

David
la source
1
git remote -vrenvoie simplement une ou plusieurs URL. Comment cela répond-il à la question?
Peter Mortensen
Comme indiqué précédemment, cela ne renvoie que des URL ... et il renvoie 2 URL séparées par un saut de ligne, avec des caractères inutiles avant l'URL. Donc, cela crée un problème en incluant des informations inutiles, puis présente deux chemins de recherche, puis il n'obtient toujours pas le nom du dépôt.
Andrew