如何从远程Git仓库获取最新提交的SHA值?

93

有人知道如何在不进入 git 仓库的情况下获取给定分支的最新 SHA 吗?

如果你正在 git 仓库内部,可以执行以下操作:

git log origin/branch_X | head -1

我并不在一个git仓库中,我想避免必须 clone 一个仓库才能获取标签/分支的最新SHA值。有没有巧妙的方法可以做到这一点?


您是否具有访问要查询的存储库的文件系统权限? - Greg Hewgill
3
正确的做法是使用“git rev-parse origin/branch_X”或“git rev-parse refs/remotes/origin/branch_X”,而不是git-log。 - Jakub Narębski
如果没有克隆存储库,但有可用于克隆的URL,怎么办?(回答我的问题:https://dev59.com/9WAf5IYBdhLWcg3wVxjh#24750310) - pellucidcoder
12个回答

128

使用rev-parse

git rev-parse origin/master # to get the latest commit on the remote

git rev-parse HEAD          # to get the latest commit on the local 

1
在编程中,将“+1”与“| clip”附加到SHA上并将其放入剪贴板(Windows)是最有用的。 - Darren Lewis
1
git rev-parse HEAD 返回本地副本中的最新提交,而 git rev-parse origin/master 返回远程仓库中的最新提交,这也是本次询问的内容。尽管第一个命令应该被删除,但这是我最喜欢的答案。 - fedelibre
2
问题注明:“我想避免克隆存储库,只是为了获取标签/分支的最新SHA。”是否可以针对本地没有任何信息的存储库使用git rev-parse - Nick Chammas
15
如果你的本地仓库是最新的,我认为 git rev-parse origin/master 只会返回正确的结果。要验证这一点,断开网络连接并尝试一下;该命令将成功执行。相比之下,git ls-remote 将会失败,因为它试图联系远程仓库。 - Andy Stewart
5
不,应该是 git fetch origin; git rev-parse origin/master,fetch 很重要。 - Alexander Mills
显示剩余2条评论

82

如果你想要检查远程仓库中给定分支的SHA-1值,那么这个答案是正确的:

$ git ls-remote <URL>

然而,如果你在同一个文件系统上,更简单的解决方案(不需要从输出中提取SHA-1)就是:

$ git --git-dir=/path/to/repo/.git rev-parse origin/branch_X

请参考git(1)手册中对'--git-dir'选项的描述。


57

我的一个同事为我回答了这个问题:

git ls-remote ssh://git.dev.pages/opt/git/repos/dev.git <branch>

3
谢谢。这应该作为回答这个问题的升级版。 - Abhijeet

23

使用 Git URL:

$ git ls-remote <URL> | head -1 | sed "s/HEAD//"

使用可访问系统上的目录:

$ git --git-dir=/path/to/repo/.git rev-parse origin/<targeted-banch>

1
使用 sed "s/\tHEAD//" 命令也可以删除末尾的制表符。 - Perseids
4
为什么不使用 | awk '{ print $1 }' - devxoul

17

如上评论所述,这应该是最佳解决方案:

$ git ls-remote <URL> | head -1 | cut -f 1


1
这是我在派生仓库中从上游远程获取提交的唯一有效选项。 - Jalakoo

15

这应该可以解决问题:git ls-remote REMOTE | awk "/BRANCH/ {print \$1}"

将REMOTE替换为远程仓库的名称,将BRANCH替换为分支的名称。


4
如果你只想获取本地仓库当前检出分支的SHA-1值,可以使用HEAD代替origin/branch_X: git --git-dir=/path/to/repo/.git rev-parse --verify HEAD

4
这里有一个复制粘贴的解决方案,可以在代码库内部工作。
origin_head=$(git ls-remote --heads $(git config --get remote.origin.url) | grep "refs/heads/master" | cut -f 1)
if [ $origin_head != "$(git rev-parse HEAD)" ]; then
    echo >&2 "HEAD and origin/master differ."
    exit 1
fi

1
我建议使用 grep "refs/heads/master$",这样如果有人要求除 master 以外的其他分支或者有一个名为 master2 的分支,这可能会出现问题 ;) - kitingChris

2

分支头的引用存储在.git/refs/树中。因此,您应该能够在以下位置找到最新提交的哈希值:

cat .git/refs/remotes/origin/branch_X

您的路径可能略有不同。


2
如果您使用了压缩引用(packed refs),那么这种方法就行不通了。您需要查看 .git/packed-refs 文件。 - Jakub Narębski
没错,这个解决方案容易受到 Git 磁盘存储库格式的任何未来更改的影响。 - Greg Hewgill

0

我建议仅获取与指定分支相关的信息,然后解析以获取最新的sha:
git ls-remote <url> --tags <branch_name> | awk '{print $1;}'


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