使用 git ls-remote 之类的命令获取最后提交消息、作者和哈希值

使用 git ls-remote 之类的命令获取最后提交消息、作者和哈希值

我正在寻找一种使用 like 命令从远程存储库获取三个信息的方法git ls-remote。我想在 .bashrc 文件中运行的 bash 脚本中使用它cron。目前,如果我这样做

git ls-remote https://github.com/torvalds/linux.git master

我在 master 分支上得到了最后一次提交哈希:

54e514b91b95d6441c12a7955addfb9f9d2afc65    refs/heads/master

有没有办法获取提交消息和提交作者?

答案1

虽然 git 没有任何实用程序可以让你做你想做的事,但它编写一个解析 git 对象然后输出作者和提交消息的 python 脚本相当容易。

下面是一个示例,它需要一个 git commit 对象stdin,然后打印作者,然后打印提交消息:

from parse import parse
import sys, zlib

raw_commit = sys.stdin.buffer.read()

commit = zlib.decompress(raw_commit).decode('utf-8').split('\x00')[1]
(headers, body) = commit.split('\n\n')

for line in headers.splitlines():
    # `{:S}` is a type identifier meaning 'non-whitespace', so that
    # the fields will be captured successfully.
    p = parse('author {name} <{email:S}> {time:S} {tz:S}', line)
    if (p):
        print("Author: {} <{}>\n".format(p['name'], p['email']))
        print(body)
        break

要制作一个像您想要的完整实用程序,服务器需要支持 HTTP 上的哑 git 传输协议,因为您无法使用智能协议获得单个提交。

然而,GitHub 不再支持哑传输协议,因此我将使用我的 Linus 树的自托管副本作为示例。

如果远程服务器支持 dump http git 传输,您可以使用curl 来获取对象,然后将其通过管道传输到上面的python 脚本。假设我们想要查看 commit 的作者和提交消息c3fe5872eb,那么我们将执行以下 shell 脚本:

baseurl=http://git.kyriasis.com/kyrias/linux.git/objects
curl "$baseurl"/c3/fe5872eb3f5f9e027d61d8a3f5d092168fdbca | python parse.py

这将打印以下输出:

Author: Sanidhya Kashyap <[email protected]>

bfs: correct return values

In case of failed memory allocation, the return should be ENOMEM instead
of ENOSPC.

...

commit 的完整提交 SHAc3fe5872ebc3fe5872eb3f5f9e027d61d8a3f5d092168fdbca,正如您在上面的 shell 脚本中看到的,SHA 在第二个字符之后被分割,中间有一个斜杠。这是因为 git 将命名空间的对象存储在 SHA 的前两个字符下,可能是由于旧文件系统对可以驻留在单个目录中的文件数量的限制较低。


虽然这个答案没有给出远程git-show命令的完整工作实现,但它提供了制作简单命令所需的基本部分。

答案2

怎么样使用git 日志:

git log -1

例子:

$ git log -1
commit 4a3dfcc66ca76a19052a7c0d44d5e6c315d79e07
Author: LE Manh Cuong <[email protected]>
Date:   Fri Apr 17 01:54:10 2015 +0700

    Make yanking work in OSX.

相关内容