6

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

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

4

3 回答 3

5

感谢 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
于 2013-06-14T09:11:56.733 回答
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

在文件中并将其作为脚本运行,或者通过
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 提示符下运行将其用作在线命令。

于 2013-06-09T08:26:48.120 回答
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
于 2013-06-09T08:27:10.730 回答