209

当您在某个 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
4

17 回答 17

210

好吧,如果对于存储库名称,您的意思是 Git 根目录名称(包含 .git 目录的名称),您可以运行以下命令:

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

git rev-parse --show-toplevel部分为您提供该目录的路径并basename删除路径的第一部分。

于 2013-03-30T07:09:46.490 回答
163

一般来说,你不能这样做。Git 不关心你的 git 存储库是如何命名的。例如,您可以重命名包含您的存储库的目录(一个带有.git子目录的目录),而 git 甚至不会注意到它 - 一切都会继续工作。

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

git remote show origin

显示有关您从中克隆存储库的原始远程的大量信息,并且它将包含原始克隆 URL。

但是,如果您使用 删除了指向原始远程的链接git remote rm origin,或者您使用 创建了该存储库git init,则根本无法获得此类信息-它在任何地方都不存在。

于 2013-03-30T07:05:55.863 回答
147

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

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

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

这应该从 Git 1.8.1.5 开始工作。在此之前,现在已弃用的git-repo-config命令会起作用(早在 Git 1.7.5 中)。

于 2017-03-01T22:05:00.227 回答
39

git v2.7.0+get-url中,引入了一个子命令来git-remote命令。

POSIX 外壳:

basename $(git remote get-url origin)

电源外壳:

Split-Path -Leaf (git remote get-url origin)
于 2018-08-10T21:39:17.373 回答
22

如果您尝试在 github 上获取用户名或组织名称以及项目或 repo 名称,我能够编写至少在本地对我有用的命令。

▶ 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路径

于 2019-11-13T18:55:30.367 回答
19

当您的目录名称与远程存储库名称不对应时(它可以),其他答案仍然不起作用。您可以通过以下方式获取存储库的真实名称:

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

于 2015-04-29T13:56:33.647 回答
7

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

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

您将看到包含 reponame 的存储库的 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
于 2019-04-10T15:52:18.680 回答
6

我认为这是明确识别存储库克隆的更好方法。

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

于 2018-04-17T18:17:40.110 回答
3

回购全名:

git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"
于 2019-07-14T16:17:54.953 回答
2

如果你想要整个 GitHub 存储库名称(“全名”) - 用户/存储库,并且你想用 Ruby 来做......

git remote show origin -n | ruby -ne 'puts /^\s*Fetch.*:(.*).git/.match($_)[1] rescue nil'
于 2015-12-16T17:43:13.520 回答
1

不幸的是,Git 似乎没有内置这样的命令。但是您可以使用 Git 别名和一些 shell 魔术轻松地自己添加它。

正如这个答案所指出的,您可以使用它git rev-parse --show-toplevel来显示当前 Git 文件夹的根目录。

如果您想定期使用它,将其定义为别名可能更方便。为此,使用了git config alias.root '!echo "$(git rev-parse --show-toplevel)"'. 在此之后,您可以使用git root查看当前所在存储库的根文件夹。

如果您想使用另一个子命令名称而不是,只需将上述命令中root的第二部分替换为您想要的任何内容。alias.root

有关 Git 中别名的详细信息,另请参见git config手册页

于 2013-03-30T07:09:31.097 回答
1

这种方法git-remote对我来说非常适合 HTTPS 遥控器:

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

例子

于 2017-03-15T13:40:50.613 回答
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

如果 repo 命名正确,则打印内容。

else

除此以外...

echo "Unnamed repository!"

告诉用户该 repo 未命名。


在这个脚本中实现了类似的东西。

于 2017-11-09T22:36:19.200 回答
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
}
于 2017-05-05T01:31:52.067 回答
0

另外我只是发现.git目录中有一些回购信息。因此,您可以FETCH_HEAD在终端中查看文件以查看 repo 的名称:

例子:

cd your_project_folder/.git
more FETCH_HEAD

输出:

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

并且https://bitbucket.org/somebituser/some_repo.git是您的存储库的名称

于 2018-11-12T20:58:03.317 回答
0

这个与 git-2.18.2 配合得很好,可以从外部 git 目标存储库启动:

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

于 2020-04-20T08:27:05.720 回答
-1

您可以使用: git remote -v

文档: https ://git-scm.com/docs/git-remote

管理您跟踪其分支的一组存储库(“远程”)。-v --verbose 更详细一点,并在名称后显示远程 url。注意:这必须放在远程和子命令之间。

于 2017-07-23T18:16:55.677 回答