如何获取Git版本控制文件中每行内容的创建日期及历史唯一行的引入日期映射
如何获取Git版本控制文件中每行内容的创建日期及历史唯一行的引入日期映射
当然可以实现这个需求!针对你追踪CSV文件每行首次引入Git仓库的日期场景,咱们可以通过Git命令+简单文本处理的组合来搞定,下面就一步步来操作:
核心思路
我们需要按提交时间从早到晚遍历文件的所有历史版本,记录每一行第一次出现的日期——这样就能保证拿到的是该行首次引入的时间,而非最后修改的时间。
具体操作步骤
假设你的CSV文件名叫data.csv,在终端里执行以下命令:
# 先初始化一个空文件用来存储结果 > line-dates.txt # 遍历所有修改过该文件的提交(按时间从早到晚排序) git log --reverse --pretty=format:"%ad %H" --date=short -- data.csv | while read date commit; do # 取出当前提交下的文件内容 git show "$commit:data.csv" | grep -v '^col1,col2,col3' | while read line; do # 如果该行还没被记录过,就写入行内容和对应的日期 if ! grep -q "^$line$" line-dates.txt 2>/dev/null; then echo "$line" >> line-dates.txt echo "$date" >> line-dates.txt fi done done
命令细节解释
git log --reverse:把提交按时间从最早到最晚排序,确保我们先处理最初的版本,准确记录每行的首次出现时机--pretty=format:"%ad %H" --date=short:输出每个提交的短格式日期(比如2023-12-09)和提交哈希值,方便后续取出对应版本的文件内容git show "$commit:data.csv":提取指定提交下该文件的完整内容grep -v '^col1,col2,col3':跳过CSV的表头行(如果你需要追踪表头的引入日期,可以去掉这部分)- 内层循环会检查每行是否已存在于结果文件中,只保留首次出现的行和对应的日期
查看最终结果
执行完上面的命令后,打开line-dates.txt就能得到你想要的映射内容:
val1,val2,val3 2023-12-09 val4,val5,val6 2023-12-09 val7,val8,val9 2023-12-10
如果想要更规整的表格样式,可以再执行这条命令来整理:
paste - - < line-dates.txt | awk '{print "Line\t\tDate\n" $1 "\t" $2}'
输出会变成:
Line Date val1,val2,val3 2023-12-09 Line Date val4,val5,val6 2023-12-09 Line Date val7,val8,val9 2023-12-10
小提示
- 如果你的文件里有空白行,可以在
grep -v '^col1,col2,col3'后面加上| grep -v '^$'来跳过空白行 - 如果文件名包含空格,记得给文件名加上引号,比如
"my data.csv"
备注:内容来源于stack exchange,提问作者tsouchlarakis
相关产品推荐
相关产品推荐

