当您在某个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
好吧,如果,对于存储库名称,您指的是Git根目录名称(包含.git目录的名称),您可以运行此命令:
basename `git rev-parse --show-toplevel`
git rev-parse --show-toplevel
部分为您提供了该目录的路径,basename
剥离了路径的第一部分。
如果你想要整个GitHub存储库名称('全名') - 用户/存储库,并且你想用Ruby做它...
git remote show origin -n | ruby -ne 'puts /^\s*Fetch.*:(.*).git/.match($_)[1] rescue nil'
这种使用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函数,所以我可以放入远程名称,如果它不是原点。
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
目录中有一些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
是您的存储库的名称
回购全名:
git config --get remote.origin.url | grep -Po "(?<=git@github\.com:)(.*?)(?=.git)"
你可以使用:git remote -v
文档:https://git-scm.com/docs/git-remote
管理您跟踪其分支的存储库集(“远程”)。 -v --verbose稍微详细一点,并在名字后显示远程URL。注意:这必须放在远程和子命令之间。
一般来说,你不能这样做。 Git并不关心如何命名你的git存储库。例如,您可以重命名包含您的存储库的目录(一个使用.git
子目录),git甚至不会注意到它 - 一切都将继续工作。
但是,如果您克隆它,则可以使用命令:
git remote show origin
显示有关您从中克隆存储库的原始远程的大量信息,它将包含原始克隆URL。
但是,如果您使用git remote rm origin
删除了原始远程的链接,或者使用git init
创建了该存储库,则无法获取此类信息 - 它在任何地方都不存在。
无需联系存储库即可获取名称,文件夹名称不一定反映远程名称。
我发现这是获取当前存储库名称的最准确和有效的方法:
basename -s .git `git config --get remote.origin.url`
这应该与Git 1.8.1.5一样。在此之前,现在已经弃用的git-repo-config
命令会起作用(早在Git 1.7.5)。
当您的目录名称与远程存储库名称不对应时,其他答案仍然无效(并且可能)。您可以使用以下内容获取存储库的真实名称:
git remote show origin -n | grep "Fetch URL:" | sed -E "s#^.*/(.*)$#\1#" | sed "s#.git$##"
基本上,您调用git remote show origin
,从“获取URL:”字段获取存储库URL,并使用正则表达式获取名称部分:https://github.com/dragn/neat-vimrc.git
在git v2.7.0+,一个子命令get-url
被引入git-remote
命令。
POSIX shell:
basename $(git remote get-url origin)
电源外壳:
Split-Path -Leaf (git remote get-url origin)
我认为这是明确识别存储库克隆的更好方法。
git config --get remote.origin.url
并检查确保原点与ssh://your/repo
匹配。
这个问题有点晚了,但如果你:
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
这是一个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
,它会打印currrent存储库的.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!"
告诉用户该回购是未命名的。
类似的东西在this script中实现。
不幸的是,似乎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。