显示git中每个子目录的最新更改

时间:2013-06-09 08:11:15

标签: git github

github中,如果您打开存储库,您将看到一个页面,其中显示了每个子目录和文件的最新提交和时间。

我可以通过git中的命令行执行此操作吗?

3 个答案:

答案 0 :(得分:3)

感谢Klas Mellbourn和Nevik Rehnel的答案,最后我将这两个版本合并到了我的中:

#!/bin/bash

FILES=`ls -A`
MAXLEN=0
for f in $FILES; do
    if [ ${#f} -gt $MAXLEN ]; then
        MAXLEN=${#f}
    fi
done
for f in $FILES; do
    str=$(git log -1 --format="%cr      [%cn]   %s" $f)
    printf "%-${MAXLEN}s -- %s\n" "$f" "$str"
done

输出:

$ bash view.bash
android_webview   -- 4 months ago       [boxxx@chromium.org]    Disable testCalledForIframeUnsupportedSchemeNavigations
ash               -- 4 months ago       [osxxxx@chromium.org]   Rename _hot_ -> _hover_
cc                -- 4 months ago       [enxx@chromium.org]     cc: Let impl-side painting use smaller tiles
chrome            -- 5 weeks ago        [Deqing]     Set the nacl pipe to non-blocking
tools             -- 10 weeks ago       [Haxx Hx]    Add submodule tools/gyp

答案 1 :(得分:2)

您无法在CWD中的所有条目的单个Git命令中执行此操作,但使用简单的bash脚本,您可以:

#!/bin/bash

FILES=`ls -A`
MAXLEN=0
for f in $FILES; do
    if [ ${#f} -gt $MAXLEN ]; then
        MAXLEN=${#f}
    fi
done
for f in $FILES; do
    printf "%-${MAXLEN}s -- %s\n" "$f" "$(git log --oneline -1 -- $f)"
done

在文件中并将其作为脚本运行,或通过运行
将其用作在线命令 直接在bash提示符上FILES=$(ls -A); MAXLEN=0; for f in $FILES; do if [ ${#f} -gt $MAXLEN ]; then MAXLEN=${#f}; fi; done; for f in $FILES; do printf "%-${MAXLEN}s -- %s\n" "$f" "$(git log --oneline -1 -- $f)"; done

答案 2 :(得分:2)

在PowerShell中,您可以创建一个这样的脚本

git ls-tree --name-only HEAD | ForEach-Object { 
   Write-Host $_ "`t" (git log -1 --format="%cr`t%s" $_)
}

循环遍历当前目录中的所有文件,写出文件名,选项卡(反引号“t”),然后输出git log的相对日期,选项卡和提交消息。

示例输出:

subfolder        18 hours ago   folder for miscellaneous stuff included
foo.txt          3 days ago     foo is important
.gitignore       3 months ago   gitignore added

GitHub结果实际上也包含了提交者,你也可以通过添加[%cn]得到它:

Write-Host $_ "`t" (git log -1 --format="%cr`t%s`t[%cn]" $_)

上面的脚本不能很好地处理长文件名,因为它依赖于标签。这是一个脚本,它创建一个格式良好的表,其中每列完全符合它所需的宽度:

git ls-tree --name-only HEAD | ForEach-Object { 
  Write-Output ($_ + "|" + (git log -1 --format="%cr|%s" $_)) 
} | ForEach-Object {
  New-Object PSObject -Property @{
    Name = $_.Split('|')[0]
    Time = $_.Split('|')[1]
    Message = $_.Split('|')[2]
  }
} | Format-Table -Auto -Property Name, Time, Message