如何在GIT repo中列出目录以及每个目录条目的最新提交信息? [英] How to list a directory in a GIT repo together with the latest commit info for each directory entry?

查看:274
本文介绍了如何在GIT repo中列出目录以及每个目录条目的最新提交信息?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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



目前我这样做:


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

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


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

    解决方案

    Oneliner解析 git whatchanged 输出和用最近的提交ID标注的打印树:

      git whatchanged -r  - pretty = oneline | perl -ne'我们的%q; if(/ ^([0-9a-f] {40})/){$ c = $ 1} if(/:.{38}(.*)/){$ q {$ 1} = $ c除非存在$ q {$ 1}}; END {print map {$ q {$ _} $ _\\\
    }(键%q); }'| sort -k 2

    输出示例:

      b32f7f65f19e547712388d2b22ea8d5355702ce2代码/ unfreezemodule / file.c 
    b32f7f65f19e547712388d2b22ea8d5355702ce2代码/ unfreezemodule /生成文件
    b32f7f65f19e547712388d2b22ea8d5355702ce2代码/ unfreezemodule / unfreezemodule.c
    efeda0a22e4d1d5f3d755fee5b72fa99c0046e38代码/ unfreezer /。 gitignore
    b822361ffbc4548d918df5381ce94c296459598a码/ unfreezer / unfreezer.c
    18ed76836182eba702e89b929eff2c0ea78ffb3e码/全/ WH
    1e111ce4e8c0813b397f34e3634309f7594cb864码/ xbmctest /的.gitignore
    cb67943c4c18e3461267a34935fc8efaca5e2166的.config /真棒/ awesome.lua
    d5e2b7c1d24bed1d0b53338f43747dc856c9cfe4的.config /真棒/ rc.lua
    13ca8dbcd7f1ec684a7eba494442ee743ed577c0 CR
    566b54fb72e32947fcbf7d5c58fed78b5abe976d d
    392ac1a2456e8a29b2ebb7af9499c3f69d24a559桌面/ CityInfo.desktop
    392ac1a2456e8a29b2ebb7af9499c3f69d24a559桌面/名为.directory

    Y您可以调整 git whatchanged 参数和/或根据需要过滤输出。


    I want to list a directory from a GIT repository together with the latest commit info of each directory entry. Similiar to how Github displays directories or how viewvc displays a directory in a SVN/CVS repo.

    Currently I do it like this:

    1. Get the directory entries with git ls-tree master and parse the directory structure from the output.

    2. Then for each directory entry I do this: git log -n 1 master -- filename and parse the commit info from it (I specify a special format string to make this easier, but this isn't relevant to my problem)

    It's pretty obvious that this is very slow because I have to call git for each file. Is there a faster way to do this? Maybe a single command I can execute to get all the data I need at once?

    解决方案

    Oneliner to parse git whatchanged output and print tree annotated with recent commit 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
    

    Example output:

    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
    

    You can adjust git whatchanged parameters and/or filter the output as you want.

    这篇关于如何在GIT repo中列出目录以及每个目录条目的最新提交信息?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆