> Another problem you might not have run into yet: the names given by > rev-list are not quoted in any way, and will just omit newlines. So if > your hook is trying to avoid malicious garbage like "foo\nbar", it won't > work. Thanks for that warning. I was not aware that rev-list didn't quote file names. > Those names are really just intended as hints for pack-objects. I > suspect the documentation could be more clear about these limitations. That would indeed be great and would have likely prevented the obvious misconceptions on my side. > I'm not sure what you mean by "one by one", since that is inherently > what rev-list is doing under the hood. If you mean "running a separate > process for each commit", then yes, that will be slow. Yes, that's what I meant to say. > But if you want > to know all of the names touched in a set of commits, I have used > something like this before: > > git rev-list $new --not --all | > git diff-tree --stdin --format= -r -c --name-only Thanks, that looks promising and solves at least one of my use cases. The only minor problem is that there seems to be no way to pipe the diff-tree output to cat-file without massaging it with awk first. I have three uses cases in my pre-receive hooks: 1. Filters solely based on the file name ? your suggestions works perfectly here 2. Filters based only on file contents ? git rev-list --objects + git cat-file provide everything I need 3. One filter based on file size and name (forbid large files, with exceptions) ? I'm guessing "git rev-list | git diff-tree --stdin | awk | git cat-file --batch-check" is the best solution to extract the necessary information from git in this case? -- Moritz