如何在某个 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=<some git repo>/.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=/<project-path>/.git remote get-url origin)
另外,上面的逗号:basename -s .git $(git --git-dir=/<project-path>/.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.git
和https://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=/<project-path>/.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 存储库的名称?的主要内容,如果未能解决你的问题,请参考以下文章