如何在一些Git存储库中获取Git存储库的名称?

当您在某个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
334266 次浏览

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

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

git remote show origin

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

然而,如果你使用git remote rm origin删除了到原始远程的链接,或者如果你使用git init创建了存储库,这样的信息根本不可能获得——它不存在于任何地方。

不幸的是,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手册页. xml

好吧,如果你的存储库名称是指Git根目录名称(包含.git目录的目录),你可以运行这个:

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

git rev-parse --show-toplevel部分提供了该目录的路径,而basename删除了路径的第一部分。

其他答案仍然不会工作时,您的目录的名称不对应远程存储库名称(它可以)。 你可以通过以下方式获得存储库的真正的名称:

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

基本上,你调用git remote show origin,从“Fetch URL:”字段中获取存储库URL,并正则化它以获得带有name的部分: https://github.com/dragn/ <强> neat-vimrc < /强> . < / p >

如果你想要整个GitHub存储库名称('全名')-用户/存储库,并且你想用Ruby实现它…

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

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

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

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

这应该在Git 1.8.1.5起作用。在此之前,现在已弃用的git-repo-config命令可以工作(早在Git 1.7.5时)。

这种使用git-remote的方法对我来说很适合HTTPS遥控器:

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

例子

这是我的:

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

没有比其他的更好,但我把它作为一个bash函数,所以如果它不是origin,我可以在远程名称中删除。

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
}

可以使用: Git remote -v

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

管理您跟踪其分支的存储库集("remotes")。 - v 更详细一点,在名称后显示远程url。注意:这个必须放在remote和subcommand之间

下面是一个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!"

告诉用户回购是未命名的。


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

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

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

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

POSIX壳:

basename $(git remote get-url origin)

PowerShell:

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

另外,我刚刚发现在.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是存储库的名称

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

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

你将看到存储库的url,其中包括reponame:

[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

回购全称:

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

如果你试图获得用户名或组织名称和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路径

它在git-2.18.2中运行得非常好,并且可以从git目标库外部启动:

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

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


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