如何在某个 Git 仓库中获取 Git 仓库的名称?

264

在你正在某个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

1
看起来这就是你想要的。https://dev59.com/zG855IYBdhLWcg3w6Y5q - Max Sherman
不,那可能不是他想要的。但这个可能是:https://dev59.com/cHNA5IYBdhLWcg3wcddk - Nevik Rehnel
如果您使用node.js,可以尝试使用https://www.npmjs.com/package/git-repo-name。 - jonschlinkert
“没有好答案”,因为根本就没有答案。有些答案可以让您获取目录名称,您可以在其中选择备用名称进行克隆(或只是更名)。其他答案让您查看远程 - 但多个远程是一个东西,“origin”只是默认值。还有一个答案建议查看.git / description - 如果不是所有Git主机都一致使用,那么这也是无用的。 - nhed
21个回答

265
在Git中,没有仓库名称的概念。仓库本身保存在文件系统中的一个目录下(包含.git目录的那个目录),您可以使用以下命令获取该目录的名称:

在 Git 中,没有仓库名称的概念。仓库本身保存在文件系统中的一个目录下(包含 .git 目录的那个目录),您可以使用以下命令获取该目录的名称:

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

git rev-parse --show-toplevel 部分会给你该目录的路径,basename则去掉了路径中的第一部分。


另一个关于“Git仓库名称”的通用解释是在Git托管服务(如GitHub或GitLab)中用于标识仓库的名称。可以通过查看远程信息来获取该名称,有几种不同的方法可以实现这一点,其他答案中已经记录下来。


17
正如下面@mvp所说,您可以更改包含“.git”子目录的目录名称,因此“如果您指的是git根目录名称作为存储库名称”这种说法并不正确。 - sheac
9
这个命令可以给你准确地提供这个目录名称:.git目录上方的目录名称。这是“仓库名称”的一种解释,看起来这正是问题的作者所寻求的。显然,还有其他合理的解释,例如远程源仓库的名称。在这种情况下,并没有普遍适用的真理,它取决于你想要什么。 - Fuad Saud
1
当我的目录名称为“Project 1.1”时,在Windows 8.1中无法正常工作。它只会回显“Project”。此外,这里的文件夹名称不一定与我的仓库名称相关,对吧? - Buttle Butkus
更安全的做法是使用原始仓库名称,因为在添加“.”时basename可能会被更改 -> “clone repo-name .” 如果您想在脚本中使用repo名称的防弹解决方案:https://dev59.com/AGsy5IYBdhLWcg3w-i_h - fearis
2
这样做不安全。尝试使用cd /var/www/html git --git-dir=<some git repo>/.git rev-parse --show-toplevel,它会返回/var/www/html。 - sibaz
显示剩余6条评论

209

通常情况下,你不能这样做。Git不关心你的git存储库的名称。例如,你可以重命名包含存储库的目录(其中一个带有.git子目录),而Git甚至不会注意到 - 一切都将继续工作。

但是,如果你克隆了它,你可以使用以下命令:

git remote show origin

为了显示关于你克隆存储库的原始远程的大量信息,它将包含原始克隆URL。

然而,如果使用git remote rm origin命令删除了到原始远程的链接,或者如果使用git init创建了该存储库,则无法获取这些信息-它在任何地方都不存在。


2
你可以随时使用 git branch 命令获取分支名称 :) (当前分支会被标记为星号 *)。 - mvp

178

不需要联系存储库来获取名称,而且文件夹名称不一定反映远程名称。

我发现这是获取当前存储库名称最准确和高效的方法:

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

从Git 1.8.1.5开始,这应该能够正常工作。在此之前,现在已被弃用的git-repo-config命令可以工作(早在Git 1.7.5)。


5
同意,这是最简洁的答案(我以前使用 ${PWD##*/},但正如您所说,当前文件夹名称可能与原始名称不同)。 - Vincent De Smet
是的,我正在寻找这个,非常感谢!我的文件夹名称不同 ;) - csomakk
这个也可以工作:basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin) - Fabrice Jammes
此外,上述命令:basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin) 可以从任何地方启动,您不需要在 git 存储库内部。 - Fabrice Jammes
git config --get remote.origin.url可以工作。 - Anis
这是东西。 - pean

50
git v2.7.0+ 版本中,git-remote 命令引入了一个子命令 get-url
POSIX shell:
basename $(git remote get-url origin)

PowerShell:

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

2
我使用这种方法得到了字符串末尾的.git,因此我添加了一个split来去掉它:(git remote get-url origin | Split-Path -leaf).split('.')[0] - Max Cascone
如果您在Jenkins中使用此代码,您需要使用trim()函数去掉末尾的换行符:def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim() - Max Cascone
5
这非常简洁明了!您可以使用 basename -s .git $(git remote get-url origin) 命令来移除结尾的 .git - Daniel Bang

28
如果你想在 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 路径。


6
git config --get remote.origin.url | sed -r 's/.*(\@|\/\/)(.*)(\:|\/)([^:\/]*)\/([^\/\.]*)\.git/https:\/\/\2\/\4\/\5/' 这条命令将同时把 git@dom.tld:User/Repo.githttps://dom.tld/User/Repo.git 转换成 https://dom.tld/User/Repo。这是得益于你使用的 sed 的想法。 - Reed

20

当你的目录名与远程仓库名称不对应时(这种情况很常见),其他答案可能仍然无法解决问题。你可以使用以下命令获取实际的仓库名称:

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

基本上,你需要调用git remote show origin命令,从“Fetch URL:”字段获取仓库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
9
在我的Mac OSX上,这个更简单的sed命令效果更好:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//' - MarkHu
你能解释一下为什么在MacOS中需要使用单引号吗?在哪些情况下需要使用单引号?而对于 grep 又为什么不需要呢?谢谢。 - user3341592
Git 不是 Github 或任何其他 git 托管服务。创建和使用 git 存储库而不需要任何获取 URL 是完全可以的。 - oldherl
显示剩余6条评论

8

这个问题的回答有点晚了,但如果你:

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

您将看到包含存储库名称的存储库网址:
[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

6

我认为这是一种更好的方法来明确地识别存储库的克隆

git config --get remote.origin.url并检查确保原点匹配 ssh://your/repo


1
实际上,更强的条件需要更少的解析。可能需要指定URL名称而不是项目名称,但这是一个小代价。如果“.git”出现在存储库名称中,则其他人正在使用的方法将会中断。虽然不太可能,但仍有可能发生。 - gamesguru
1
@ShaneJ 你说得对,你促使我写了自己的答案,处理了远程源仓库名称中的“.git”:https://dev59.com/lGUo5IYBdhLWcg3w3ycF#58843794 - animatedgif

4

仓库完整名称:

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

在这个问题中,gipcompany提到他正在一个很深的目录层次结构中。虽然我不确定他究竟想要什么(有一个例子可能是从那个Git存储库的任何位置获取Git存储库名称(这与我想象中的Git存储库的方式不同)),但我看不出URL应该是已知的迹象。 - greybeard

2
如果你想获取GitHub仓库的完整名称(“full name”)- 用户名/仓库名称,并且希望使用Ruby实现...
git remote show origin -n | ruby -ne 'puts /^\s*Fetch.*:(.*).git/.match($_)[1] rescue nil'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接