调用 URL http://<gitweburl>/gitweb.cgi?p=<repo>;a=tree;f=<subdir>;hb=HEAD 将显示从 <repo> 开始的 <subdir> 树。

调用 URL http://<gitweburl>/gitweb.cgi?p=<repo>;a=snapshot;f=<subdir>;hb=HEAD 将产生 404。

调用 URL http://<gitweburl>/gitweb.cgi?p=<repo>.git;a=snapshot;h=HEAD 将提供 HEAD 修订版的 <repo> 快照。

我找不到正确的语法让 Gitweb 从子目录开始给出快照。我的意思是导致:$ git archive --format=tar --remote=<gituser>@<gitserver>:<repo> HEAD:<subdir>
我天真地尝试调用 URL http://<gitweburl>/gitweb.cgi?p=<repo>;a=snapshot;h=HEAD;f=<subdir> 导致包含整个存储库 的快照存档。

在 Gitweb 网络界面中单击后,我发现,更改为“树” View 并移动到 <subdir>,然后单击“快照”使用类似于以下的 URL:
http://<gitweburl>?p=<repo>;a=snapshot;h=42a6503da6aaedc92bb3543e0b0de9b2de0aaae9;sf=tgz
这正是我想要的,但我不知道这个哈希参数 h=... 是什么。这不是提交 ID - 我已经检查过了。它必须以某种方式识别 <subdir> 。但即使是这样 - 这仍然对我没有帮助,因为有人只是想要一个只从 <subdir> 开始/只包含 h=42a6503da6aaedc92bb3543e0b0de9b2de0aaae9 的快照通常不知道这个哈希。

关于如何通过 Gitweb 获取子目录快照的任何想法?
提前致谢!

添加:

刚刚发现:<subdir> 是与 $ git ls-tree -r -t HEAD 相关联的哈希值,例如可见$ git archive --format=tar --remote=<gituser>@<gitserver>:<repo> HEAD:<subdir>
所以这两个命令:
$ git archive --format=tar --remote=<gituser>@<gitserver>:<repo> 42a6503da6aaedc92bb3543e0b0de9b2de0aaae9HEAD:<subdir>
做同样的事情,让我 认为 42a6503da6aaedc92bb3543e0b0de9b2de0aaae9http://<gitweburl>?p=<repo>;a=snapshot;h=42a6503da6aaedc92bb3543e0b0de9b2de0aaae9;sf=tgz 是等价的。我仍然不能只是用 HEAD:<subdir> 替换 URL http://<gitweburl>/gitweb.cgi?p=<repo>;a=snapshot;h=HEAD;f=<subdir> 中的哈希值。调用此 URL 会导致“400 - 无效的哈希参数”......所以这里没有真正的进展。

正如 poke 所建议的,使用 ojit_code 的快速肮脏黑客

$ diff -Naur gitweb.cgi.original gitweb.cgi.new
--- gitweb.cgi.original 2012-09-28 00:50:47.000000000 +0200
+++ gitweb.cgi.new  2013-01-22 11:04:29.870532502 +0100
@@ -7029,6 +7029,9 @@

    my ($name, $prefix) = snapshot_name($project, $hash);
    my $filename = "$name$known_snapshot_formats{$format}{'suffix'}";
+   if ($file_name) {
+       $hash="$hash:$file_name"
+   }
    my $cmd = quote_command(
        git_cmd(), 'archive',
        "--format=$known_snapshot_formats{$format}{'format'}",

最佳答案

有问题的 h 值是您当前正在查看的树对象的 ID。一次提交有一个单一的根树对象,你可以在 Gitweb 的提交页面上看到。每个树都是指向 blob(在文件的情况下)或其他树对象的目录条目列表。

因此,当您在树中更深入地导航时,h 始终表示树 id。另一方面,hb 值是提交 ID。

不幸的是,Gitweb 没有包含更好的方法来获取子目录的快照,即不知道树哈希而只知道路径。但是可能可以为其添加一些功能,将 f 参数考虑在内并自动为您获取树哈希。

我刚刚检查了这个来源,在修改 this part 时你可能会很幸运。我不太了解 perl 来告诉你到底要做什么,但你基本上可以检查 $file_name 变量是否已设置,如果是这种情况,只需获取 $hash:$file_name 的哈希值。然后将其设置为新的哈希值,一切都可以正常工作。

关于子目录的 gitweb 快照,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14444593/

10-13 09:17