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

Posted

技术标签:

【中文标题】如何在某个 Git 存储库中获取 Git 存储库的名称?【英文标题】:How do you get the Git repository's name in some Git repository? 【发布时间】:2013-03-20 21:31:55 【问题描述】:

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

【问题讨论】:

看起来这就是你所追求的。 ***.com/questions/4076239/… 不,这可能不是他想要的。不过,这可能是:***.com/questions/957928/… 如果你使用 node.js 你可以试试npmjs.com/package/git-repo-name 没有好的答案,因为没有答案。一些答案会为您提供目录名称,您可以在其中选择一个备用名称来克隆(或只是重命名)。其他人让你看看遥控器 - 但多个遥控器是origin 恰好是默认值。一个答案建议查看.git/description - 抱歉,如果所有 git 主机没有一致使用,这也是没用的 【参考方案1】:

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

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

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

【讨论】:

正如@mvp 下面所说,您可以更改包含.git 子目录的目录的名称,因此“如果,对于存储库名称,您的意思是 git 根目录名称”是不正确的。 这个命令给你确切的信息:.git 目录正上方的目录名称。这是对“存储库名称”的一种解释,它似乎是 OP 正在寻找的一种。显然还有其他有效的解释,比如远程源存储库的名称。在这种情况下没有普遍的真理,这真的取决于你想要什么。 当我的目录看起来像“Project 1.1”时,在 Windows 8.1 中不起作用。它只呼应“项目”。加上这里的文件夹名称不一定与我的 repo 名称有关,对吧? 附加问题:如何将其添加为链中的字符串,例如: git remote add test "admin@sed -n '1 p' test.ip | basename basename git rev-parse --show-toplevel `:/var/www" ??正如您可能看到的那样,由于在 `` 内使用 ``,此行将不起作用 这不安全。试试 cd /var/www/html git --git-dir=&lt;some git repo&gt;/.git rev-parse --show-toplevel 它会返回 /var/www/html【参考方案2】:

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

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

git remote show origin

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

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

【讨论】:

你总是可以使用 well 获取分支名称,git branch :)(活动分支将标有星号*)。【参考方案3】:

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

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

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

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

【讨论】:

同意,这是最干净的答案(我曾经有 $PWD##*/ 但正如你所说,当前文件夹名称可能与原名不同) 是的,我正在寻找这个,非常感谢。!我的文件夹名称不同 ;) 这个也可以:basename -s .git $(git --git-dir=/&lt;project-path&gt;/.git remote get-url origin) 另外,上面的逗号:basename -s .git $(git --git-dir=/&lt;project-path&gt;/.git remote get-url origin)可以从任何地方启动,你不需要在git仓库里面。【参考方案4】:

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

POSIX 外壳:

basename $(git remote get-url origin)

PowerShell:

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

【讨论】:

我使用这种方法在字符串末尾得到了.git,所以我添加了一个拆分来将其剥离:(git remote get-url origin | Split-Path -leaf).split('.')[0] 如果你碰巧在 Jenkins 中使用它,你会想用 trim() 去掉尾随的换行符:def repo = powershell(returnStdout: true, script: "(git remote get-url origin | Split-Path -leaf).split('.')[0]" ).trim() 这非常简洁干净!您可以使用basename -s .git $(git remote get-url origin) 删除末尾的.git【参考方案5】:

如果您尝试在 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 路径

【讨论】:

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 想法【参考方案6】:

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

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

【讨论】:

是的,这没关系,但这会查询遥控器以获取更新。最好使用git remote show origin -n 来防止这种情况发生。 我们能否更新 sed 命令,使其在原始 url 不以 .git 结尾时也能正常工作?所以'foo.git'变成'foo',但'foo'也匹配?我猜我们需要非贪婪匹配? @ArnoutEngelen 我认为最简单的做法是(可选地)剥离.git 并再次调用sed,我已经更新了答案中的代码。这样,当 URL 不以 .git 结尾时,它将起作用。 有道理!不错! 这个更简单的 sed 在我的 Mac OSX 上运行得更好:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'【参考方案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

【讨论】:

【参考方案8】:

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

git config --get remote.origin.url 并检查以确保来源与ssh://your/repo 匹配。

【讨论】:

其实更强的条件,需要的解析更少。可能必须指定 url 名称而不是项目名称,但要付出很小的代价。如果 repo 名称中出现“.git”,其他人的做法就会中断。不太可能,但可能。 @ShaneJ 你是对的,你提示我写我自己的答案来处理远程原始仓库名称中的“.git”:***.com/a/58843794/2696867【参考方案9】:

回购全名:

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

【讨论】:

在问题中,gipcompany 提到位于目录层次结构的深处。虽然我不确定他真正想要什么(有一个示例 - 可能是“从该 Git 存储库中的任何位置获取 Git 存储库名称”(这与我如何想象 git 存储库)),我没有看到任何迹象表明应该知道 URL。【参考方案10】:

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

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

【讨论】:

【参考方案11】:

这种使用 git-remote 的方法对我来说非常适合 HTTPS 远程:

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

例子

【讨论】:

【参考方案12】:

这是一个 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 未命名。


this script 中实现了类似的东西。

【讨论】:

【参考方案13】:

不幸的是,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。

【讨论】:

git config --add alias.root 'rev-parse --show-toplevel' -- 无需在 shell 中输入单命令别名。【参考方案14】:

这是我的:

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

【讨论】:

【参考方案15】:

我也只是发现.git目录里面有一些repo信息。因此,您可以在终端中观看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 是您的存储库的名称

【讨论】:

【参考方案16】:

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

basename -s .git $(git --git-dir=/&lt;project-path&gt;/.git remote get-url origin)

【讨论】:

【参考方案17】:

您可以使用: git远程-v

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

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

【讨论】:

git remote -v 只是返回一个或多个 URL。这是如何回答问题的? 如前所述,它只返回 URL... 它返回由换行符分隔的 2 个 URL,在 URL 之前有不必要的字符。所以它通过包含不需要的信息来创建一个问题,然后提供两个搜索路径,然后它仍然没有得到 repo 的名称。

以上是关于如何在某个 Git 存储库中获取 Git 存储库的名称?的主要内容,如果未能解决你的问题,请参考以下文章

Git从本地存储库中删除上游

如何重新创作 Git 存储库中的所有提交? [复制]

JGit:我可以在不检查的情况下找出某个特定标签是不是存在于 Git 存储库中吗?

删除 GIT 存储库的远程密码 [重复]

限制 git 存储库中的文件大小

如何 git-svn 从 Subversion 存储库克隆最后 n 个修订?