如何在没有本地仓库的情况下在远程运行git命令

17

我有一个叫做“git-export”的脚本可以帮助我导出远程仓库,使用方法如下:

git-export http://host.com/git-repo <-t tag or -b branch or -c commit> /local/dir

之前它被用于导出本地仓库,我使用了以下命令:

从分支获取提交记录:

git branch -v --no-abbrev|awk '($1=="'$BRANCH'") || ($1 == "*" && $2 == "'$BRANCH'"){if($1 == "*"){print $3;}else{print $2;}}'

或者
git rev-parse -q --verify $BRANCH^{commit}

通过标签获取提交记录:

git rev-parse -q --verify $TAG^{commit}

我有一些脚本可以列出标签、版本(以v开头的标签),我使用git branch -v来显示分支... 问题是:如何在没有本地副本的情况下在远程存储库上执行这些操作。是否有一种通用的查询远程存储库的方法。例如:git --remote=http://host.com/repo branch -vgit --remote=http://host.com/repo log 原因:如果我想在远程主机上安装软件,我只想要: 1.列出版本、分支等 2.导出特定的版本/分支/提交,并显示提交的SHA1,无论导出哪个(通过导出我的意思是git archive --remote=<repo>|tar x) 编辑: 我不想在远程实际运行命令。我想使用本地命令使用远程存储库并格式化显示。
2个回答

35

你需要使用git ls-remote命令。例如:

$ git ls-remote git://git.kernel.org/pub/scm/git/git.git
4d8b32a2e1758236c4c1b714f179892e3bce982c    HEAD
f75a94048af9e423a3d8cba694531d0d08bd82b4    refs/heads/html
810cae53e0f622d6804f063c04a83dbc3a11b7ca    refs/heads/maint
70b5eebd65f2d47fd69073aed1d3da0f1fd7a017    refs/heads/man
4d8b32a2e1758236c4c1b714f179892e3bce982c    refs/heads/master
b9f1b13437fd0b8b1857ffbdebb9e1adc50481f0    refs/heads/next
83a9d3226b19a683a9a783bde0784c2caf19e9a1    refs/heads/pu
2309986900ed1a5744b3a81c507943593000ce32    refs/heads/todo
d5aef6e4d58cfe1549adef5b436f3ace984e8c86    refs/tags/gitgui-0.10.0
3d654be48f65545c4d3e35f5d3bbed5489820930    refs/tags/gitgui-0.10.0^{}
33682a5e98adfd8ba4ce0e21363c443bd273eb77    refs/tags/gitgui-0.10.1
729ffa50f75a025935623bfc58d0932c65f7de2f    refs/tags/gitgui-0.10.1^{}
...
(git.git has a lot of tags!)

您可以使用--heads选项限制自己的分支,或使用--tags选项选择标签,或指定一个模式来选择引用。例如,要仅查看git.git的git版本标记,可以使用命令git ls-remote <url> refs/tags/v*。或者您可能已经确切地知道所需的引用: git ls-remote <url> HEAD

但是,您不能在任意远程上运行任意命令。传输协议不支持该功能-它们设计用于支持列出引用和传输对象(通过packs)。特别地,您将无法执行类似于rev-list的任何操作。您只能获得由引用指向的提交的SHA1值。


看起来非常有用,我想它会完成工作,但是否有一个接受 --format 参数的命令?这个格式的问题之一是:^{} 表示此标签指向的提交。然而,如果标签是轻量级的,则提交 sha1 将没有 ^{}。无论标签的类型如何,我都想在列出标签时获取提交的 sha1。我使用 for-each-ref--format 来做到这一点。请参见 man git-for-each-ref - NickSoft
@NickSoft:是的,我知道你的意思,但我认为你可能需要自己做。如果您可以确保所有标签都已注释(这也可能是一个好习惯),则可以执行git ls-remote <url> refs/tags/*^{},否则我认为您将不得不阅读列表并进行一些后处理。(当然,请注意,您仍然可以使用带注释的标记的SHA1进行git archive,因此您也可以使用grep -v '\^{}$'剥离所有指向提交的内容,并完成它。) - Cascabel

0

您可以使用curl来检查特定的URL是否存在,例如当我尝试访问AngularJS现有的URL时。

$ curl -I https://github.com/angular/angularjs.org/tree/master/src
**HTTP/1.1 200 OK**
Server: GitHub.com
Date: Mon, 11 Aug 2014 15:22:40 GMT

当我访问错误的URL时

$ curl -I https://github.com/angular/angularjs.org/tree/master/abcd
**HTTP/1.1 404 Not Found**
Server: GitHub.com
Date: Mon, 11 Aug 2014 15:24:06 GMT

希望这能有所帮助


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接