Obtenha a última mensagem de commit, autor e hash usando o comando git ls-remote like

4

Estou procurando uma maneira de obter três informações de um repositório remoto usando o comando git ls-remote like. Eu gostaria de usá-lo em um script bash em execução em cron . Atualmente, se eu fizer

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

Eu recebo o último hash de commit no branch master:

54e514b91b95d6441c12a7955addfb9f9d2afc65    refs/heads/master

Existe alguma maneira de obter uma mensagem de commit e autor de commit?

    
por FunkySayu 17.04.2015 / 21:15

2 respostas

6

Enquanto não há utilitários que vêm com o git que permite fazer o que você quer, é fácil escrever um script python que analisa um objeto git e então mostra o autor e a mensagem de commit .

Aqui está um exemplo que espera um objeto de confirmação do git em stdin e imprime o autor seguido pela mensagem de confirmação:

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

Para fazer um utilitário completo como você deseja, o servidor precisa suportar o protocolo de transporte dumb git por HTTP, já que você não pode obter um único commit usando o protocolo inteligente.

No entanto, o GitHub não suporta mais o protocolo de transporte simplificado, por isso vou usar minha cópia auto-hospedada da árvore Linus como exemplo.

Se o servidor remoto for compatível com o dump http git transport, você poderá usar o curl para obter o objeto e encaminhá-lo para o script python acima. Digamos que queremos ver o autor e enviar a mensagem de confirmação c3fe5872eb , depois, executaremos o seguinte script de shell:

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

Que imprimirá a seguinte saída:

Author: Sanidhya Kashyap <[email protected]>

bfs: correct return values

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

...

O commit completo SHA de commit c3fe5872eb é c3fe5872eb3f5f9e027d61d8a3f5d092168fdbca e, como você pode ver no script de shell acima, o SHA é dividido após o segundo caractere com uma barra no meio. Isso ocorre porque o git armazena objetos namespaced sob os dois primeiros caracteres do SHA, presumivelmente devido ao sistema de arquivos legado ter baixos limites no número de arquivos que podem residir em um único diretório.

Embora essa resposta não forneça uma implementação completa de trabalho de um comando git-show remoto, ela fornece as partes básicas necessárias para criar uma simples.

    
por 18.04.2015 / 00:00
3

Que tal usar o git log :

git log -1

Exemplo:

$ 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.
    
por 17.04.2015 / 21:25

Tags