Peter Bengtsson
Peter Bengtsson

Reputation: 7485

In a git post-commit hook how do I get a list of the files that were changed?

Trying to figure out how long time was spent in a commit in a Git post-commit hook.

I've got a post-commit git hook that submits information over an API about the commit. What I want to do is figure out how long time was spent on the commit. Roughly.

My assumption is that a rough value can be figured out by finding the minimum of all the creation-time and modification-time of the files involved and compare with the maximum creation- and modification-time.

I can easily do this in a Python script. If someone tells me it was the files "foo.txt", "bar.txt" and "path/bla.txt" I can quickly do some arithmetic in a script based on these files.

So, In a git post-commit hook how do I get a list of the files that were changed?

Upvotes: 13

Views: 6649

Answers (3)

Mir-Ismaili
Mir-Ismaili

Reputation: 16978

Thank @JoshLee for his answer.

I tried to complete it:

git diff-tree -r --name-only --diff-filter=ACMRTUXB --no-commit-id HEAD

Explanation for --diff-filter=ACMRTUXB:

ACMRTUXB includes all changes except Delete. See: https://git-scm.com/docs/git-diff#Documentation/git-diff.txt---diff-filterACDMRTUXB82308203

Upvotes: 0

Josh Lee
Josh Lee

Reputation: 177584

When writing scripts around git, you should try to stick to the plumbing commands — their format is less likely to change and easier to parse. Here is a command which outputs the names of the paths which changed in a commit:

git diff-tree -r --name-only --no-commit-id <tree-ish>

That aside, you may wish to examine the index, as it contains timestamps about when the files were staged, which might give you an extra edge; however, I don’t believe there is a way to access this information.

Upvotes: 14

Peter Bengtsson
Peter Bengtsson

Reputation: 7485

Been doing some research and found that git log --name-only -n1 is the best approach. It's not difficult to get the min. and max. timestamps out of the files by doing a bit of string matching and using the Python os.stat module.

As a general solution it still isn't great because the modification times on the files doesn't really reflect the reality of the time spent actually.

Upvotes: 1

Related Questions