裸仓库上的git diff

5

我想在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

然而,在本地检出的工作分支中它可以正常工作。

有没有一种不需要太多麻烦的方法来解决这个问题?

为了避免 X-Y 问题:我想在 Gitlab 服务器上的数百个存储库上运行统计信息。


你尝试过在仓库目录中不使用 --git-dir 吗? - NoDataFound
cd /path/to/bare/repo.git ; git diff --shortstat '@{1 month ago}' 应该可以工作。 - knittl
git --git-dir /path/to/my/bare/repo.git/ branch -a 表示什么? - marbu
@NoDataFound 是的。@knittl 和我的问题一样的错误。@marbu 显示* master - λq_
2
在一个裸仓库上运行git diff会给我这个错误:This operation must be run in a work tree。我不会说这是不可能的(gitk在裸仓库上显示差异,但我猜它使用提交的SHA1来创建差异!)。 - NoDataFound
@NoDataFound 这正是我猜测的。我做了一个简单的 strace git log,它确实在扫描大量的SHA1,但是 git diff 需要 logs/refs/heads/master - λq_
2个回答

4
尝试确保在裸库中进行差异比较时指定两个提交(否则diff将默认为工作树,但在裸库中不存在)。
您不需要--git-dir . 然而,在指定修订版本时使用日期是行不通的,因为它基于logs/refs,而这在裸库中不存在。
<refname>@{<date>}, e.g. master@{yesterday}, HEAD@{5 minutes ago}

一个带有后缀@和日期规范的ref,用大括号括起来(例如{yesterday}、{1 month 2 weeks 3 days 1 hour 1 second ago}或{1979-02-26 18:30:00}),指定了先前某个时间点上ref的值。
此后缀只能紧随在ref名称之后使用,且ref必须具有现有日志($GIT_DIR/logs/)。

1
谢谢,有什么解决方案可以获取统计数据吗?到目前为止,我最好的努力是使用 git log 列出提交次数,但这不如 git diff --shortstat - λq_

1
我发现这个问题是因为我收到了“致命错误:此操作必须在工作树中运行”的提示。
如果你在裸仓库中遇到这个错误:
[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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接