我的回购已经过期了。我认为一个好的起点是按照上次触摸的顺序列出所有文件,并从最旧的文件开始。有没有办法实现这个目标?
答案 0 :(得分:5)
使用标准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
开头时,它会中断。
答案 1 :(得分:1)
Commit级别的信息应该足以回答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 " "
其他组合也是可能的。
对于带有空格和其他字符的文件,所有这些方法都应该起作用。
答案 2 :(得分:0)
4b825dc642cb6eb9a060e54bf8d69288fbee4904 is the empty-tree commit in git.
使用--name-only选项,您可以获取文件名,通过不打印任何内容,您可以获得提交信息的空行。通过管道连接到awk NF,可以过滤空行。通过管道输送到tac中,顺序相反。
git log --pretty="format:" --name-only 4b825dc642cb6eb9a060e54bf8d69288fbee4904..HEAD | awk NF | tac