16

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

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

除了git blame

在远程存储库中,我无法找出如何在没有工作树的情况下归咎于文件。你有什么想法吗?

4

2 回答 2

31

即使在裸存储库中,以下内容也应该有效:

git blame <rev> -- <path>

例如

git blame master -- README.txt
于 2010-11-12T23:29:49.510 回答
0

我无法找到 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 ( ) 的提交 0c668f5(2018 年 2 月 5 日(由Junio C Hamano 合并——提交 0c668f5中,2018 年 2 月 7 日)gitster
gitster

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 ( ) 的提交 a544fb0(2019 年 4 月 7 日(由Junio C Hamano 合并 -- --d8620d3 提交中,2019 年 4 月 25 日)szeder
gitster

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' 的一个薄包装,因此在相同的情况下它会打印相同的误导性错误消息,此补丁也修复了它。


注意:如果您按照Jakub Narębski的建议使用gitweb 来查看“责备”,那么 gitweb中有一个相当老的错误,其中 javascript 操作模式下的增量责备输出从未起作用。 这已通过 Git 2.24(2019 年第四季度)修复。

请参阅Robert Luberda ( ) 的提交 52bd3e4(2019 年 10 月 27 日(由Junio C Hamano 合并 -- --提交 0d6799e中,2019 年 10 月 30 日)roblub
gitster

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

于 2018-03-03T23:48:12.467 回答