2016-08-01 2 views
1

Это не вопрос, о котором вы думаете.Как определить, когда был создан git ref?

Я хочу знать, когда был создан определенный рефлекс. Я не хочу знать, какова отметка времени автора или временная метка коммиттера.

Например: если я вытаскиваю из удаленного репо, которое обновляет мое местное репо, я хочу получить временные метки того времени, когда были созданы локальные репозитории репо.

[remote-host]$ git show --format='%H %cD' refs/heads/master 
25f2508a379adf2f8aa264afe6f7e5046943274a Mon, 1 Aug 2016 11:33:12 -0700 

[remote-host]$ logout 
Connection to remote-host closed. 
[local-host]$ git fetch 
remote: Counting objects: 165073, done 
remote: Finding sources: 100% (1836/1836) 
remote: Total 1836 (delta 484), reused 1374 (delta 484) 
Receiving objects: 100% (1836/1836), 4.10 MiB | 0 bytes/s, done. 
Resolving deltas: 100% (484/484), completed with 262 local objects. 
... 
[local-host]$ git show --format='%H %cD' 25f2508a379adf2f8aa264afe6f7e5046943274a 
25f2508a379adf2f8aa264afe6f7e5046943274a Mon, 1 Aug 2016 11:33:12 -0700 

[local-host]$ date 
Mon Aug 1 11:50:44 PDT 2016 

Выхода я хочу это Mon Aug 1 11:50:44 PDT 2016 (т.е. времени выборки), а не дата коммиттера, которые правильно идентичны на оба пульте дистанционного управления и локальный хост.

Я думал об использовании git reflog, но вывод этой команды странно лишен какой-либо информации о метке времени.

+0

я добавил пример, чтобы показать, почему коммиттер метка времени не работает (также отметив свой комментарий как «неконструктивной») –

+0

'% cD' является дата коммиттера, о которой вы сказали, не то, что вы хотите. – alzee

+0

@ user3137702, он демонстрирует, как '% cD' не предоставляет информацию, которую он ищет. Внимательно прочитайте последние четыре строки или вопрос, в частности, на выходе команды 'git show', команды' date' и предпоследнего предложения. – larsks

ответ

1

Я не думаю, что git отслеживает информацию, которую вы ищете, что, я думаю, более точно описано как «дата создания блоба на моей локальной системе».

Вы могли:

  • Первого взгляд на свободный сгусток с хэш-контента соответствия, и если вы найдете его, предположим, что mtime этого сгустка время, на котором был создан на вашей системе (так как она не должна модифицируются любой последующей операции):

    cid=25f2508a379adf2f8aa264afe6f7e5046943274a 
    if test -f .git/objects/${cid:0:2}/${cid:2}; then 
        ls -l .git/objects/${cid:0:2}/${cid:2} 
    fi 
    
  • Если вы не можете найти свободный объект, просматривать ваши файлы пакета, чтобы найти соответствующий идентификатор контента, и если вы найдете его, предположим, mtime соответствующая packfile является дата, вы хотите:

    for idx in .git/objects/pack/*.idx; do 
        if git show-index < $idx | grep $cid; then 
        ls -l ${idx/idx/pack} 
        break 
        fi 
    done 
    
+0

Я боялся, что это будет ответ. Не возражаете, если я изменю вопрос, чтобы использовать «дату создания блоба в моей локальной системе»? –

+0

Оберните его в красивый сценарий, вставьте его на github и станьте интернет-знаменитым! :) – larsks

+1

Слишком поздно! https://github.com/larsks/git-tools – larsks

-1

Использование --date=short или --date=relative/--relative-date (или действительно любой из директив даты) покажет вам временную метку самого reflog записи, а не штамп времени фиксации, внутри {...} части:

$ git reflog torturetest --date=relative 
8bb1189 [email protected]{3 days ago}: branch: Created from HEAD 
$ git reflog torturetest --date=default 
8bb1189 [email protected]{Fri Jul 29 00:17:04 2016 -0700}: branch: Created from HEAD 

Основная проблема заключается в том, что нет никакой гарантии, что запись Created from существует: она, возможно, никогда не была помещена в reflog, или она, возможно, истекла.

+0

В приведенном выше примере, если я набираю 'git reflog --date = default 25f2508a379adf2f8aa264afe6f7e5046943274a', я не получаю никакого вывода. Кажется, что reflog не принимает sha1s, или я что-то не понимаю. –

+0

reflogs не являются объектами Git и не могут быть названы SHA-1. Единственными допустимыми аргументами являются имена ссылок (например, 'HEAD' или имя ветви филиала или удаленного отслеживания). (Кроме того, я ответил, прежде чем у вас появился пример, и работал из вашего текста о том, когда был создан или обновлен рефактор, на котором я предположил, что вы имеете в виду ссылку). – torek

Смежные вопросы