2011-05-21 29 views
12

我想列出从一个Git仓库了最新一起的目录提交每个目录条目的信息。熟悉Github如何显示目录或viewvc如何在SVN/CVS仓库中显示目录。如何在GIT repo中列出目录以及每个目录条目的最新提交信息?

目前,我不喜欢这样写道:

  1. 获取目录条目与git ls-tree master,并从输出解析目录结构。

  2. 然后对于每个目录条目我这样做:git log -n 1 master -- filename并解析其提交的信息(我指定特殊格式化字符串,使这更容易,但是这是不相关的我的问题)

这很明显,这是非常缓慢的,因为我必须为每个文件调用git。有没有更快的方法来做到这一点?也许我可以执行一个命令来同时获取我需要的所有数据?

回答

0

也许你可以解析git whatchanged master,继续向后走在历史上,直到你已经“看到”的所有文件路径?

根据一些文件多久你的历史和你多大了,这可能会更快。

+1

假设历史大,有哪个版本库创建后,从来没有改变过的文件和目录。所以我必须解析整个历史才能找到所有文件。我想那不会更快。 – kayahr 2011-05-21 17:23:26

+0

在这种情况下,我不知道有更好的解决方案(至少使用Git提供的工具,而不是直接使用对象文件)。由于树对象不绑定到特定的分支,因此它们不引用提交信息。 – Amber 2011-05-21 17:24:49

0

您可以要求git log -n 1 <file|directoryname>。因此,您可以在非递归模式下解析git-ls-tree,并且只需要为您处于的级别上的每个文件/目录运行它。

+0

这正是我已经写过的问题。问题是如果有更快的方法。 – kayahr 2011-05-22 06:10:50

4

Oneliner解析git whatchanged输出和打印树最近提交IDS注释:

git whatchanged -r --pretty=oneline | perl -ne 'our %q; if (/^([0-9a-f]{40})/) {$c = $1} if (/:.{38}(.*)/) { $q{$1} = $c unless exists $q{$1} }; END { print map {"$q{$_} $_\n"} (keys %q); }' | sort -k 2 

输出示例:

b32f7f65f19e547712388d2b22ea8d5355702ce2 code/unfreezemodule/file.c 
b32f7f65f19e547712388d2b22ea8d5355702ce2 code/unfreezemodule/Makefile 
b32f7f65f19e547712388d2b22ea8d5355702ce2 code/unfreezemodule/unfreezemodule.c 
efeda0a22e4d1d5f3d755fee5b72fa99c0046e38 code/unfreezer/.gitignore 
b822361ffbc4548d918df5381ce94c296459598a code/unfreezer/unfreezer.c 
18ed76836182eba702e89b929eff2c0ea78ffb3e code/whole/wh 
1e111ce4e8c0813b397f34e3634309f7594cb864 code/xbmctest/.gitignore 
cb67943c4c18e3461267a34935fc8efaca5e2166 .config/awesome/awesome.lua 
d5e2b7c1d24bed1d0b53338f43747dc856c9cfe4 .config/awesome/rc.lua 
13ca8dbcd7f1ec684a7eba494442ee743ed577c0 cr 
566b54fb72e32947fcbf7d5c58fed78b5abe976d d 
392ac1a2456e8a29b2ebb7af9499c3f69d24a559 Desktop/CityInfo.desktop 
392ac1a2456e8a29b2ebb7af9499c3f69d24a559 Desktop/.directory 

可以调整git whatchanged参数和/或过滤输出,只要你想。

+0

该命令总是打印整个树的所有最新更改。是否有一些选项只列出特定目录中的更改?当这个项目非常大时,我只想列出一个小目录,然后我想它会很慢地获取整个树的数据,然后过滤掉任何我不需要的东西。 – kayahr 2011-08-25 15:13:43

+0

你可以在“git whatchanged part”之后用grep或perl或其他方法过滤路径。例如:'git whatchanged -r --pretty = oneline | perl -ne'print if/[0-9a-f] {40} /;打印如果m!(?:\ S + \ s +){5} some_dir /!' | ....'。但资源经济不会很大。 – 2011-08-25 19:18:10

+0

这个脚本也可以修改打印最后两个每个文件提交的ID,例如... – 2011-08-25 19:19:30

相关问题