在github中,如果您打开存储库,您将看到一个页面显示每个子目录和文件的最新提交和时间。
我可以通过 git 中的命令行执行此操作吗?
感谢 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
对于 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 提示符下运行将其用作在线命令。
在 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