【问题标题】:How to 'git blame' on the remote-side repository?如何在远程存储库上“git blame”?
【发布时间】:2011-05-09 08:19:03
【问题描述】:

在我的服务器上,我托管了我的个人 git 远程项目(使用 gitosis),并且我构建了一个 Web 界面来浏览存储库(类似于 Github)。

在远程端,您不能做很多事情,因为缺少工作树,这是正确的:顺便说一句,对于存储库浏览器,只需很少的命令,我几乎可以做所有事情。

git blame除外。

我不知道如何在远程端存储库中找到没有工作树的文件。你有什么想法吗?

【问题讨论】:

  • 有什么理由不能只用工作树进行克隆?另外,gitweb 没有责备视图吗? (我忘记了它是如何实现的。)
  • git 中的远程端是什么?如果你用 git 写了一个 webapp,它仍然可以在服务器上看到完整的 repo。

标签: git blame


【解决方案1】:

我找不到 git 文档在哪里谈论 -- 选项,顺便说一句,这很有效

其实这是必要的,因为“git blame”准备采取 古代奇怪的参数顺序“blame <path> <rev>”除了 通常是“blame [<rev>] <path>”。

这意味着,由于 Git 2.17(2018 年第二季度)将解释“git blame HEAD COPYING”在裸存储库中无法运行,而“git blame HEAD -- COPYING”运行正常。

但从 2.17 开始,您将不再需要 '--'。

参见Junio C Hamano (gitster)commit 0c668f5(2018 年 2 月 5 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 0c668f5,2018 年 2 月 7 日)

blame: 收紧命令行解析器

一个古老的奇怪参数顺序“blame <path> <rev>” 通常“blame [<rev>] <path>”至少有两个否定 后果:

  • 为了区分这两个,它检查最后一个命令是否 行参数命名工作树中的路径,使用 file_exists().
    但是,“blame <rev> <path>”是一个请求 解释存储在<path> 中的每一行内容 修订版<rev> 并且不需要工作树版本 的文件。使用file_exists() 进行检查是完全错误的。

  • 为了强制错误的file_exists()检查工作,代码 在这样做之前调用setup_work_tree(),因为它拥有的路径 相对于项目树的顶层。
    但是,“blame <rev> <path>”即使在裸存储库中也必须可用, 也没有理由让setup_work_tree() 抱怨 并以“此操作必须在工作树中运行”而死。

要更正前者,请切换到检查最后一个标记是否为 修订版(如果是,请使用“blame <path> <rev>”解析参数 规则)。

通过删除setup_work_tree()file_exists() 检查——唯一调用此函数很重要的情况 是当我们运行“blame <path>”时(即没有开始修订和 要求责怪<path> 的工作树文件,挖掘 HEAD 修订版),但在setup_scoreboard() 中有一个电话只是 在它调用fake_working_tree_commit()之前。

简而言之,从 Git 2.17 开始,这将在一个裸仓库中运行:

git blame master -- README.txt

在 Git 2.22 中,错误消息“This operation must be run in a work tree”应该会消失!

非裸存储库中的“git blame -- path”从工作树开始指责,并且裸存储库中的相同命令出错,因为根据定义没有工作树。
该命令已被教导改为从 HEAD 的提交开始责备, 哪个更有用。

参见SZEDER Gábor (szeder)commit a544fb0(2019 年 4 月 7 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit d8620d3,2019 年 4 月 25 日)

blame:当没有给出开始提交时,默认为裸仓库中的 HEAD

当调用 'git blame' 时未指定要启动的提交 归咎于,它从工作树中给定文件的状态开始。
但是,当在没有开始提交的裸存储库中调用时, 那么没有工作树状态可以开始,它会随着 以下错误信息:

$ git rev-parse --is-bare-repository
true
$ git blame file.c
fatal: this operation must be run in a work tree

这是一种误导,因为它暗示“git blame”不起作用 完全在裸存储库中,但实际上,它确实可以正常工作 它被赋予了开始的承诺。

当然,我们可以改进错误消息,但让我们在裸存储库中默认为 HEAD,因为这很可能是用户想要的(如果他们想从另一个提交开始,那么他们会首先指定)。

'git annotate' 只是 'git blame' 的一个薄包装,所以在 在相同的情况下,它打印出相同的误导性错误消息,而这 补丁也修复了它。


注意:如果您使用 gitweb 来查看“责备”,如 Jakub Narębski recommended,则 gitweb 中有一个相当老的错误,其中 javascript 操作模式下的增量责备输出从未起作用。
Git 2.24(2019 年第四季度)已解决此问题。

参见 Robert Luberda (roblub)commit 52bd3e4(2019 年 10 月 27 日)。
(由 Junio C Hamano -- gitster -- 合并到 commit 0d6799e,2019 年 10 月 30 日)

gitweb: 在 javascript-actions 模式下正确存储上一个版本

签字人:Jonathan Nieder
签字人:Robert Luberda
签字人:Jakub Narębski支持>

没有这个改变,设置

$feature{'javascript-actions'}{'default'} = 2;

gitweb.conf打破gitweb的责备页面:点击页面第二列显示的行号没有效果

作为比较,在禁用 javascript-actions 的情况下,单击行号会加载该行的先前版本。

地址https://bugs.debian.org/741883

【讨论】:

    【解决方案2】:

    即使在裸存储库中,以下内容也应该可以工作:

    git blame <rev> -- <path>
    

    例如

    git blame master -- README.txt
    

    【讨论】:

    • 我找不到 git 文档在哪里谈论 -- 选项,顺便说一句,这很有效,tnx
    • -- 选项(或分隔符)在git help blame 的概要中列出。 git help log: To prevent confusion with options and branch names, paths may need to be prefixed with "-- " to separate them from options or refnames 更好地解释。
    猜你喜欢
    • 2020-10-21
    • 1970-01-01
    • 2017-10-01
    • 2011-03-23
    • 2013-01-04
    • 1970-01-01
    • 2017-04-29
    • 2012-10-19
    相关资源
    最近更新 更多