¿Cómo se obtiene el nombre del repositorio de Git en algún repositorio de Git?


144

Cuando trabaja en algún directorio de Git, ¿cómo puede obtener el nombre del repositorio de Git en algún repositorio de Git? ¿Hay algún comando 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

Parece que esto es lo que buscas. stackoverflow.com/questions/4076239/…
Max Sherman

No, eso probablemente no sea lo que él quiere. Sin embargo, esto podría ser: stackoverflow.com/questions/957928/…
Nevik Rehnel

si usa node.js, puede probar npmjs.com/package/git-repo-name
jonschlinkert el

Respuestas:


153

Bueno, si para el nombre del repositorio te refieres al nombre del directorio raíz de Git (el que contiene el directorio .git) puedes ejecutar esto:

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

La git rev-parse --show-toplevelparte le proporciona la ruta a ese directorio y basenameelimina la primera parte de la ruta.


9
Como @mvp dice a continuación, puede cambiar el nombre del directorio que contiene el .gitsubdirectorio, por lo que no es cierto que "si, para el nombre del repositorio se refiere al nombre del directorio raíz de git".
sheac

77
Este comando le proporciona exactamente eso: el nombre del directorio directamente encima del directorio .git. Esa es una interpretación para "el nombre del repositorio", y parece que es la que estaba buscando OP. Obviamente hay otras interpretaciones válidas, como el nombre del repositorio de origen remoto. No hay una verdad universal en este caso y realmente depende de lo que quieras.
Fuad Saud

1
No funciona en Windows 8.1 cuando mi directorio se ve como "Proyecto 1.1". Solo hace eco de "Proyecto". Además, el nombre de la carpeta aquí no está necesariamente relacionado con mi nombre de repositorio, ¿verdad?
Buttle Butkus

Pregunta adicional: ¿cómo agregar esto para que sea una cadena en línea de cadena como: git remote add test "admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel: / var / www "?? Como probablemente vea, esta línea no funcionará por usar `` inside ''
fearis

1
Esto no es seguro. Pruebe cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevely le devolverá / var / www / html
sibaz

126

En general, no puedes hacer esto. A Git no le importa cómo se nombra su repositorio de git. Por ejemplo, puede cambiar el nombre del directorio que contiene su repositorio (uno con.git subdirectorio), y git ni siquiera lo notará, todo continuará funcionando.

Sin embargo, si lo clonó, puede usar el comando:

git remote show origin

para mostrar mucha información sobre el control remoto original desde el que clonó su repositorio, y contendrá la URL de clonación original.

Sin embargo, si eliminó el enlace al control remoto original usando git remote rm origin, o si creó ese repositorio usando git init, tal información es simplemente imposible de obtener, no existe en ninguna parte.


2
Siempre puede obtener el nombre de la sucursal usando well, git branch:) (la sucursal activa se marcará con una estrella *).
mvp

95

No es necesario ponerse en contacto con el repositorio para obtener el nombre, y el nombre de la carpeta no necesariamente reflejará el nombre remoto.

He descubierto que esta es la forma más precisa y eficiente de obtener el nombre del repositorio actual:

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

Esto debería funcionar a partir de Git 1.8.1.5. Antes de esto, el git-repo-configcomando ahora en desuso habría funcionado (ya en Git 1.7.5).


44
De acuerdo, esta es la respuesta más clara (solía tener $ {PWD ## * /} pero como usted dice, el nombre de la carpeta actual puede ser diferente del origen)
Vincent De Smet

sí, estaba buscando esto, ¡muy apreciado! el nombre de mi carpeta era diferente;)
csomakk

Este también funciona: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes

28

En git v2.7.0 + , get-urlse introdujo un subcomando al git-remotecomando.

POSIX shell:

basename $(git remote get-url origin)

Potencia Shell:

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

Obtengo el .gitfinal de mi cadena usando este método, así que agregué una división para quitarlo:(git remote get-url origin | Split-Path -leaf).split('.')[0]
Max Cascone

Si estás usando esto en Jenkins, querrás quitar la nueva línea final con un trim():def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim()
Max Cascone

17

Otras respuestas aún no funcionarán cuando el nombre de su directorio no se corresponda con el nombre del repositorio remoto (y podría). Puede obtener el nombre real del repositorio con algo como esto:

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

Básicamente, usted llama git remote show origin, tome la URL del repositorio del campo "Recuperar URL:" y regexifique para obtener la porción con el nombre: https://github.com/dragn/ neat-vimrc .git


1
Sí, está bien, pero esto consultará al control remoto para una actualización. Es mejor usar git remote show origin -npara evitar eso.
Ryanmt

1
¿Podemos actualizar el comando sed para que también funcione cuando la url de origen no termine en .git? entonces 'foo.git' se convierte en 'foo', pero 'foo' también coincide? ¿Supongo que necesitamos un emparejamiento no codicioso?
Arnout Engelen

@ArnoutEngelen Creo que lo más simple es (opcionalmente) desnudarse .gitcon otra llamada sed, he actualizado el código en la respuesta. De esta manera funcionará, cuando la URL no termine con .git.
Dragn

¡Tiene sentido! Bueno uno!
Arnout Engelen

77
Este más simple sedfuncionó mejor en mi Mac OSX:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

Si está tratando de obtener el nombre de usuario o el nombre de la organización Y el nombre del proyecto o repositorio en github, pude escribir este comando que al menos me funciona localmente.

 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

Este es el resultado deseado, como Vydiaes el nombre de la organización y gouramiel nombre del paquete. Combinados pueden ayudar a formar el User/Repocamino completo


5

Creo que esta es una mejor manera de identificar inequívocamente un clon de un repositorio.

git config --get remote.origin.urly verificando que el origen coincida ssh://your/repo.


1
En realidad, una condición más fuerte, requiere menos análisis. Puede que tenga que especificar el nombre de la URL en lugar del nombre del proyecto, pero un pequeño precio a pagar. La forma en que todos lo hacen se rompería si ".git" apareciera en el nombre del repositorio. Improbable, pero posible.
Shane J

1
@ShaneJ tienes razón y me pediste que escribiera mi propia respuesta que maneja el ".git" en el nombre del repositorio de origen remoto: stackoverflow.com/a/58843794/2696867
animatedgif

5

Un poco tarde para esta pregunta, pero si usted:

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

Verá la url del repositorio que incluirá el nombre de archivo:

[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

Nombre completo del repositorio:

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

En la pregunta, gipcompany menciona estar en algún lugar de la jerarquía del directorio. Si bien no estoy seguro de lo que realmente quiere (hay un ejemplo, podría ser " obtener el nombre del repositorio Git de cualquier parte de ese repositorio Git " (que está en desacuerdo con cómo imagino los repositorios git)), no veo indicios de que un / la URL debe ser conocida.
barba gris

1

Este enfoque utilizando git-remotefuncionó bien para mí para controles remotos HTTPS:

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

Ejemplo


1

Aquí hay una función bash que imprimirá el nombre del repositorio (si se ha configurado correctamente):

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

Explicación:

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

Esto se ejecuta git rev-parse --git-dir, lo que imprime la ruta completa al .gitdirectorio del repositorio actual. Almacena el camino en $gitdir.

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

Esto se ejecuta cat ${gitdir}/description, lo que imprime el contenido .git/descriptionde su repositorio actual. Si ha nombrado correctamente su repositorio, imprimirá un nombre. De lo contrario, se imprimiráUnnamed repository; edit this file 'description' to name the repository.

cat ${gitdir}/description

Si el repositorio se denominó correctamente, imprima el contenido.

else

De otra manera...

echo "Unnamed repository!"

Dígale al usuario que el repositorio no tiene nombre.


Algo similar se implementa en este script .


1

Desafortunadamente, parece que Git no tiene dicho comando incorporado. Pero puede agregarlo fácilmente con alias de Git y algo de magia de shell.

Como se señala en esta respuesta , puede usar git rev-parse --show-toplevelpara mostrar la raíz de su carpeta Git actual.

Si desea usar esto regularmente, probablemente sea más conveniente definirlo como un alias. Para esto, usado git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. Después de esto, puede usar git rootpara ver la carpeta raíz del repositorio en el que se encuentra actualmente.

Si desea utilizar otro nombre de subcomando que no sea root, simplemente reemplace la segunda parte del alias.rootcomando anterior con lo que desee.

Para obtener detalles sobre los alias en Git, consulte también la git configpágina de manual .


2
git config --add alias.root 'rev-parse --show-toplevel'- no hay necesidad de lanzar el shell para un alias de comando único.
kostix

1

Si desea todo el nombre del repositorio de GitHub ('nombre completo') - usuario / repositorio, y desea hacerlo con Ruby ...

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

0

Aquí está el mío:

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

no mejor que los demás, pero lo convertí en una función bash para poder colocar el nombre remoto si no es origen.

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

También encuentro que hay información de repositorio dentro del .gitdirectorio. Entonces, solo puede ver el FETCH_HEADarchivo en la terminal para ver el nombre del repositorio:

Ejemplo:

cd your_project_folder/.git
more FETCH_HEAD

Salida:

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

Y https://bitbucket.org/somebituser/some_repo.gites el nombre de tu repositorio


0

Este funciona bastante bien con git-2.18.2 y se puede iniciar desde el repositorio de destino de git externo:

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


-1

Puedes usar: git remote -v

Documentación: https://git-scm.com/docs/git-remote

Administre el conjunto de repositorios ("controles remotos") cuyas ramas rastrea. -v --verbose Sea un poco más detallado y muestre la URL remota después del nombre. NOTA: Esto debe colocarse entre el control remoto y el subcomando.


1
git remote -vsolo devuelve una o más URL. ¿Cómo responde esto a la pregunta?
Peter Mortensen

Como se indicó anteriormente, esto solo devuelve URL ... y devuelve 2 URL separadas por un salto de línea, con caracteres innecesarios antes de la URL. Por lo tanto, crea un problema al incluir información innecesaria, luego presenta dos rutas para buscar, y aún así no obtiene el nombre del repositorio.
Andrew
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.