git diff на голом репо

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

cd /path/to/my/bare/repo.git/
git --git-dir . diff --shortstat "@{1 month ago}"
fatal: Unable to read log 'logs/refs/heads/master': No such file or directory

Однако он отлично работает в рабочей ветке с локальной проверкой.

Есть ли способ сделать это без особых хлопот?

Чтобы избежать проблемы XY: я хочу запустить статистику через сотни репозиториев на сервере Gitlab.


person λq_    schedule 03.09.2014    source источник
comment
Вы пробовали в каталоге репо без --git-dir ?   -  person NoDataFound    schedule 03.09.2014
comment
cd /path/to/bare/repo.git ; git diff --shortstat '@{1 month ago}' должно работать.   -  person knittl    schedule 03.09.2014
comment
Что говорит git --git-dir /path/to/my/bare/repo.git/ branch -a?   -  person marbu    schedule 03.09.2014
comment
@NoDataFound да. @knittl та же ошибка, что и в моем вопросе. @marbu показывает * master   -  person λq_    schedule 03.09.2014
comment
Просто запустив git diff в пустом репозитории, я получаю следующее: This operation must be run in a work tree. Я бы не сказал, что это невозможно (gitk показывает разницу в голом репо, но я думаю, что он использует SHA1 коммитов для создания разницы!).   -  person NoDataFound    schedule 03.09.2014
comment
@NoDataFound Это то, что я догадался. Я сделал простой strace git log , он действительно сканирует множество SHA1, но git diff требует logs/refs/heads/master   -  person λq_    schedule 03.09.2014


Ответы (2)


Попробуйте и убедитесь, что при сравнении в голом репо указаны две фиксации (иначе при сравнении по умолчанию будет использоваться рабочее дерево, которого нет в голый репозиторий).

Вам не нужно --git-dir .

Однако использование даты при указании версии не будет работать, так как он основан на logs/refs, которого нет в голом репо

<refname>@{<date>}, e.g. master@{yesterday}, HEAD@{5 minutes ago}

Ссылка, за которой следует суффикс @ с указанием даты, заключенной в пару фигурных скобок (например, {yesterday}, {1 month 2 weeks 3 days 1 hour 1 second ago} или {1979-02-26 18:30:00}), указывает значение ссылки в предыдущий момент времени.
Этот суффикс можно использовать только немедленно. после имени ссылки, и ссылка должна иметь существующий журнал ($GIT_DIR/logs/<ref>).

person VonC    schedule 03.09.2014
comment
спасибо, есть решение для сбора статистики? Пока что я стараюсь перечислить количество коммитов, используя git log, но это не так хорошо, как git diff --shortstat. - person λq_; 04.09.2014

Я нашел этот вопрос, потому что получал fatal: This operation must be run in a work tree

Если вы получаете сообщение об ошибке (в вашем голом репо):

[ec2-user@xxxxx git]$ git diff 81dcb182e4d16b6894b69a5b31133b8d8ff6c5e2
fatal: This operation must be run in a work tree

Убедитесь, что вы предоставляете два хэша фиксации для сравнения (поскольку HEAD является символической ссылкой).

[ec2-user@xxxxx git]$ git diff <BASE COMMIT HASH> <UPDATE COMMIT HASH>

Eg.

[ec2-user@xxxxx git]$ git diff 11dcb182e4d16b6894b69a5b31133b8d8ff6c5ex 81dcb182e4d16b6894b69a5b31133b8d8ff6c5e2
person Fostah    schedule 29.01.2019