如何从远程git存储库中获取最新提交的SHA?


73

有谁知道如何获取给定分支的最新SHA git存储库外部

如果您位于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
JakubNarębski09年

Answers:


74

如果要检查远程存储库中给定分支的SHA-1,那么您的答案是正确的:

$ git ls-remote <URL>

但是,如果您使用的是同一文件系统,则更简单的解决方案(不需要从输出中提取SHA-1)将很简单:

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

有关' '选项的说明,请参见git(1)联机帮助页--git-dir


102

使用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与附加|一起证明是最有用的 剪辑将阴影放置到剪贴板上(Windows)。
达伦·刘易斯

1
git rev-parse HEAD返回本地副本中git rev-parse origin/master的最新提交,而返回远程上的最新提交,这就是这里的要求。即使应该删除第一个命令,这也是我最喜欢的答案。
fedelibre

2
该问题提示“我想避免克隆存储库只是为了获得标签/分支的最新SHA”。是否可以git rev-parse针对您在本地没有任何信息的存储库使用它?
Nick Chammas 2015年

14
我认为git rev-parse origin / master仅在您的本地仓库为最新版本时才返回正确答案。为了证明这一点,请断开互联网并尝试;该命令将成功。相反,git ls-remote将失败,因为它尝试联系远程仓库。
安迪·斯图尔特

4
呃,不,git fetch origin; git rev-parse origin/master是,获取不是很重要吗?
亚历山大·米尔斯

41

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

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

3
谢谢。这应该升级为该问题的答案。
阿披耶特(Abhijeet)

19

使用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//"删除尾随标签。
英仙座

3
为什么不使用| awk '{ print $1 }'
devxoul

14

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

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


13

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

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


1
(对我而言)这是唯一的用于从派生存储库中的上游远程获取提交的选项。
Jalakoo

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分支,则可能会
损坏

2

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

cat .git/refs/remotes/origin/branch_X

您的路径可能会略有不同。


1
如果您打包了引用,那将是行不通的。然后,您必须看一下.git / packed-refs
JakubNarębski09年

没错,此解决方案容易受到Git磁盘存储库格式未来的任何更改。
格雷格·休吉尔

0

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

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.