【发布时间】:2014-04-28 20:01:21
【问题描述】:
我的回购逾期未清理。我认为一个好的起点是按照最后一次触摸的顺序列出所有文件,并从最旧的开始。有没有办法做到这一点?
【问题讨论】:
-
您的意思是列出 repo 中实际修改的所有(本地)文件,还是列出通过签入修改文件的顺序?即,您是真的要求执行 git 操作,还是只想执行 shell/文件系统操作?
标签: git
我的回购逾期未清理。我认为一个好的起点是按照最后一次触摸的顺序列出所有文件,并从最旧的开始。有没有办法做到这一点?
【问题讨论】:
标签: git
没有办法(我知道)使用标准的 git 命令来做到这一点。您需要的是整个存储库的某种git blame,标识历史中更改每个文件的最后一次提交。当然,您可以使用标准的git blame,解析瓷器输出以识别向文件添加内容的最新提交的时间戳,并根据该时间戳对文件进行排序:
#!/bin/bash
function last-modified()
{
git blame -p "$1" | awk '
BEGIN {
print 0;
}
$1 == "author-time" {
print $2;
}' | sort -n | tail -n 1
}
function list-files()
{
for file in $(git ls-files); do
echo "$(last-modified $file) $file"
done
}
list-files | sort -n
这种方法只能注册被添加到文件的内容,但不能注册被删除文件的内容。此外,当您的存储库中有以author-time 开头的行时,它会中断。
【讨论】:
提交级别的信息应该足以回答 OP 问题,不需要 git-blame 获取的那种细节。
这种方法列出了 git 已知的所有文件以及影响文件的最后一次提交的日期,按该日期排序:
while read FILE
do git log --pretty="%ad $FILE" --date=iso8601-strict -1 -- "$FILE"
done < <( git ls-files ) | sort
可能希望限制当前目录中当前签出的文件:
while read FILE
do git log --pretty="%ad $FILE" --date=iso8601-strict -1 -- "$FILE"
done < <( find . -type f ) | sort
可能只想列出文件,不显示日期:
while read FILE
do git log --pretty="%ad $FILE" --date=iso8601-strict -1 -- "$FILE"
done < <( git ls-files ) | sort | cut -f 2 -d " "
其他组合也是可能的。
所有这些都应该适用于带有空格和其他字符的文件。
【讨论】:
4b825dc642cb6eb9a060e54bf8d69288fbee4904 is the empty-tree commit in git.
使用 --name-only 你可以得到文件名,通过漂亮的打印什么,你得到提交信息的空行。通过管道进入 awk NF,您可以过滤空行。通过管道进入 tac,顺序是相反的。
git log --pretty="format:" --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904..HEAD | awk NF | tac
【讨论】: