Git: how to list all version control files along with their author date?

Given the git repository, I need to generate a dictionary of each changed date with a controlled version of the date as a unix timestamp mapped to its file path. I need the last modified date before git, not the file system.

To do this, I would like to get git to list all version control files along with each file creation date. Exiting git ls-files or git ls-tree -r master would be ideal if their output had timestamps included on each line.

Is there any way to get this output from git?

Update for a larger context: I have a current implementation consisting of a python script that iterates through each file under source control and does git log for each of them, but I do not scale well. The more files in the repo, the more git log calls I have to make. Thus, this led me to find a way to collect this information from git with fewer calls (ideally just 1).

+7
git
source share
4 answers

a list of all version control files along with each file creation date

Scaling is not a problem with this:

 #!/bin/sh temp="${TMPDIR:-/tmp}/@@@ commit-at@ @@$$" trap "rm '$temp'" 0 1 2 3 15 git log --pretty=format:"%H%x09%at" --topo-order --reverse " $@ " >"$temp" cut -f1 "$temp" \ | git diff-tree -r --root --name-status --stdin \ | awk ' BEGIN {FS="\t"; OFS="\t"} FNR==1{++f} f==1 {at[$1]=$2; next} NF==1 {commit=$1; next} $1=="D"{$1=""; delete last[$0]; next} # comment to also show deleted files {did=$1;$1=""; last[$0]=at[commit]"\t"did} END {for (f in last) print last[f]f} ' "$temp" - \ | sort -t"`printf '\t'`" -k3 
+1
source share

I wrote the following script to output path, short hashtag and date for each file.

 #!/usr/bin/env python3 # -*- coding: utf-8 -*- # # Author: RF Smith < rsmith@xs4all.nl > # $Date: 2013-03-23 01:09:59 +0100 $ # # To the extent possible under law, Roland Smith has waived all # copyright and related or neighboring rights to gitdates.py. This # work is published from the Netherlands. See # http://creativecommons.org/publicdomain/zero/1.0/ """For each file in a directory managed by git, get the short hash and data of the most recent commit of that file.""" import os import sys import subprocess import time from multiprocessing import Pool # Suppres terminal windows on MS windows. startupinfo = None if os.name == 'nt': startupinfo = subprocess.STARTUPINFO() startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW def filecheck(fname): """Start a git process to get file info. Return a string containing the filename, the abbreviated commit hash and the author date in ISO 8601 format. Arguments: fname -- Name of the file to check. """ args = ['git', '--no-pager', 'log', '-1', '--format=%h|%at', fname] try: b = subprocess.check_output(args, startupinfo=startupinfo) data = b.decode()[:-1] h, t = data.split('|') out = (fname[2:], h, time.gmtime(float(t))) except (subprocess.CalledProcessError, ValueError): return (fname[2:], '', time.gmtime(0.0)) return out def main(): """Main program.""" # Get a list of all files allfiles = [] # Get a list of excluded files. exargs = ['git', 'ls-files', '-i', '-o', '--exclude-standard'] exc = subprocess.check_output(exargs).split() if not '.git' in os.listdir('.'): print('This directory is not managed by git.') sys.exit(0) for root, dirs, files in os.walk('.'): if '.git' in dirs: dirs.remove('.git') tmp = [os.path.join(root, f) for f in files if f not in exc] allfiles += tmp # Gather the files' data using a Pool. p = Pool() filedata = [] for res in p.imap_unordered(filecheck, allfiles): filedata.append(res) p.close() # Sort the data (latest modified first) and print it filedata.sort(key=lambda a: a[2], reverse=True) dfmt = '%Y-%m-%d %H:%M:%S %Z' for name, tag, date in filedata: print('{}|{}|{}'.format(name, tag, time.strftime(dfmt, date))) if __name__ == '__main__': main() 
0
source share

What would I do, run git ls-files and add all of them to the array, then run git log $date_args --name-only , and then git log $date_args --name-only this output and remove these files from the array when adding date information to the dictionary and stop processing after the array is empty.

0
source share

Here you go:

 git ls-files -z | xargs -0 -n1 -I{} -- git log -1 --format='%at {}' {} 

This works on bash and probably sh .

0
source share

All Articles