如何在某个 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个回答

2

你可能想要的是 'origin'

你可以使用 git remote -v

第一个词是通常被命名为 'origin' 的存储库名称


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 remote -v

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

管理跟踪的分支的存储库集合(“远程”)。 -v --verbose 稍微详细一些,并在名称后显示远程URL。注意:这必须放置在远程和子命令之间。

1
git remote -v 只会返回一个或多个URL。这怎么回答问题了呢? - Peter Mortensen
正如之前所述,它只返回URL...并且它返回两个由换行符分隔的URL,URL之前还有不必要的字符。因此,它包含了不必要的信息,然后提供了两个搜索路径,但仍然无法获取存储库的名称,这就造成了问题。 - Andrew
我认为这是正确的。第一个单词是存储库名称,通常为“origin”。 - The OuterSpace

1

很遗憾,Git似乎没有内置此类命令。但是,您可以通过Git别名和一些shell魔法轻松添加它。

正如this answer所指出的那样,您可以使用git rev-parse --show-toplevel来显示当前Git文件夹的根目录。

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

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

有关Git中别名的详细信息,请参见git config man page


2
git config --add alias.root 'rev-parse --show-toplevel' -- 对于一个单命令别名,没有必要引入shell。 - kostix

1
git ls-remote --get-url | xargs basename -s .git # bar

# zsh
git ls-remote --get-url | read
print $REPLY:t:r # bar

1
这个命令在git-2.18.2版本中运行良好,可以从git目标仓库外部启动: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)

1

对于 HTTPS 远程仓库,使用 git-remote 这种方法对我来说效果非常好:

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

示例

0

您可以将项目名称存储在Git对象数据库中的对象中,并在注释标签中引用它。

例如,仓库名称"GnuMake"是标签名"nameRepo"。ssh -F指定ssh配置文件khnSrv_al已注册为远程主机。

命令:创建并放置一个对象到Git数据库中,获取并保存链接到放置对象的注释标签。

git -C /path/dir_git -c user.email=you@example.com -c user.name=ВашеИмя tag -a nameRepo -m 'Имя репозитория' $(echo 'GnuMake'|git -C /path/dir_git hash-object -w --stdin)

al@rznCad:~$ git -C ~/experiments/git -c user.email=you@example.com -c user.name=ВашеИмя tag -a nameRepo -m 'Имя репозитория' $(echo 'GnuMake'|git -C ~/experiments/git hash-object -w --stdin)

al@rznCad:~$ ssh -F /ubData/docs/PktDstSSH/master_config khnSrv_al "git -C /home/al/newRepos/GNU_Make -c user.email=you@example.com -c user.name=ВашеИмя tag -a nameRepo -m 'Имя репозитория' \$(echo 'GnuMake'|git -C /home/al/newRepos/GNU_Make hash-object -w --stdin)"

命令:使用名为“nameRepo”的标签从git数据库对象中提取存储库名称

git -C /path/dir_git cat-file blob nameRepo

al@rznCad:~$ git -C ~/experiments/git cat-file blob nameRepo
=>GnuMake

al@rznCad:~$ ssh -F /ubData/docs/PktDstSSH/master_config khnSrv_al "git -C /home/al/newRepos/GNU_Make cat-file blob nameRepo"
=>GnuMake

al@rznCad:~$ ssh -F /ubData/docs/PktDstSSH/master_config khnSrv_al git -C /home/al/newRepos/GNU_Make show nameRepo
tag nameRepo
Tagger: ВашеИмя <you@example.com>
Date:   Wed Jan 25 09:01:18 2023 +0200

Имя репозитория
GnuMake

请注意,除了这个之外,仓库里不需要有任何其他东西,并且您可以随时创建一个仓库名称。

0
如果仓库名称可能有多个文件夹级别,那么仅使用"basename"是不够的。
我发现以下方法最简单且能涵盖所有情况:
git remote get-url origin | sed 's/^.*://;s/.git$//'

这个命令将生成一行包含仓库URL的文本,可以很容易地使用sed进行过滤,只提取其中的名称。

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 是您的存储库名称


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