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


144

在某些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

看起来这就是您所追求的。 stackoverflow.com/questions/4076239/...
马克斯·谢尔曼

不,那可能不是他想要的。这可能是,虽然:stackoverflow.com/questions/957928/...
Nevik Rehnel

如果您使用node.js,则可以尝试npmjs.com/package/git-repo-name
jonschlinkert,2015年

Answers:


153

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

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

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


9
就像@mvp在下面说的那样,您可以更改包含.git子目录的目录的名称,因此“如果,对于存储库名称,您的意思是git根目录名称”,这不是真的。
sheac

7
该命令为您提供了确切的信息:.git目录正上方的目录名称。这是对“存储库名称”的一种解释,似乎是OP所寻求的。显然,还有其他有效的解释,例如远程来源存储库的名称。在这种情况下,没有普遍的真理,这实际上取决于您想要什么。
Fuad Saud 2014年

1
当我的目录看起来像“ Project 1.1”时,在Windows 8.1中不起作用。它仅回显“项目”。另外,这里的文件夹名称不一定与我的回购名称相关,对吗?
Buttle Butkus,2015年

附加问题:如何将其添加为链状线,例如:git remote add test“ admin @ sed -n '1 p' test.ip | basename basename` git rev-parse --show-toplevel:/ var / www”?正如您可能会看到的那样,此行将不起作用,原因是使用“ inside”
fearis

1
这不安全。尝试使用cd / var / www / html git --git-dir=<some git repo>/.git rev-parse --show-toplevel,它会带您回来/ var / www / html
sibaz

126

通常,您无法执行此操作。Git不在乎git存储库的命名方式。例如,您可以重命名包含您的存储库的目录(一个带有.git子目录),而git甚至不会注意到它-一切都会继续工作。

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

git remote show origin

以显示很多有关您从中克隆存储库的原始远程服务器的信息,它将包含原始克隆URL。

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


2
您总是可以使用井号git branch()来获取分支名称:(活动分支将用star标记*)。
mvp 2014年

95

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

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

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

从Git 1.8.1.5起应该可以使用。在此之前,现在不推荐使用的git-repo-config命令将已经起作用(早于Git 1.7.5)。


4
同意,这是最干净的答案(我以前有$ {PWD ## * /},但正如您所说,当前文件夹名称可能与来源不同)
Vincent De Smet

是的,我一直在寻找这个,非常感谢。我的文件夹名称有所不同;)
csomakk

此选项也适用: basename -s .git $(git --git-dir=/<project-path>/.git remote get-url origin)
fjammes,

28

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

POSIX外壳:

basename $(git remote get-url origin)

电源外壳:

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

.git使用此方法在字符串的末尾得到了,所以我添加了一个拆分以将其剥离:(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()
符号删除

17

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

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
当原始网址未以.git结尾时,我们可以将sed命令更新为也可以使用吗?所以'foo.git'变成'foo',但是'foo'也被匹配了吗?我猜我们需要非贪心匹配吗?
Arnout Engelen 2015年

@ArnoutEngelen我认为最简单的方法是(可选)剥离.git另一个调用sed,我已经更新了答案中的代码。如果网址不以结束,则可以使用这种方式.git
2015年

说得通!好一个!
Arnout Engelen,2015年

7
sed在我的Mac OSX上,这种更简单的方法效果更好:git remote show origin -n | grep h.URL | sed 's/.*://;s/.git$//'
MarkHu

6

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


5

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

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


1
实际上条件更强,需要较少的解析。可能必须指定url名称而不是项目名称,但是要付出很小的代价。如果回购名称中出现“ .git”,则其他所有人的操作方式都会中断。不太可能,但可能。
Shane J

1
@ShaneJ你说的没错,你促使我写我自己的答案,处理“git的”远程起源回购名称:stackoverflow.com/a/58843794/2696867
animatedgif

5

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

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

您将看到存储库的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

2

回购全名:

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

在问题中,gipcompany提到了在目录层次结构中的某个深处。虽然我不确定他实际上想要什么(有一个例子- 可能是“ 从该Git存储库中的任何位置获取Git存储库名称 ”(这与我想象的git存储库不符)),但我没有看到任何指示/ URL应该是已知的。
灰胡子

1

这种方法git-remote对HTTPS远程服务器很有效:

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


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似乎没有内置这样的命令。但是您可以使用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手册页


2
git config --add alias.root 'rev-parse --show-toplevel'-无需为单个命令的别名而扔掉外壳。
kostix

1

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

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

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
}

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


0

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

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


-1

您可以使用:git remote -v

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

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


1
git remote -v仅返回一个或多个URL。这如何回答问题?
彼得·莫滕森

如前所述,这仅返回URL ...,并且它返回2个由换行符分隔的URL,在URL之前带有不必要的字符。因此,它通过包含不需要的信息而产生了问题,然后提供了两条搜索路径,然后仍未获得存储库的名称。
安德鲁(Andrew)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.