Re: git log -z doesn't separate commits with NULs
- From
- Nikolaj Shurkaev <snnicky@gmail.com>
- Date
- Feb 23, 2012, 12:17 UTC
- Message-ID
- <4F462E61.4020203@gmail.com>
- In-Reply-To
- <20120223102426.GB2912@sigill.intra.peff.net>
Hello.
Thank you very much for your tips. They really helped me. I was trying to create patches that would affect only some given files or folders. By this moment I have the following:
GeneratePatches.sh --------------------- #!/bin/bash #parameter 1 - <since>..<to> #parameter 2 - path to file git log -z --reverse --format=email --patch "$1" -- "$2" | xargs --null --max-args=1 ./CreatePatchFile.sh ---------------------
and CreatePatchFile.sh --------------------- #!/bin/bash
myPatchNumber=$(ls ./*-patch.patch 2>/dev/null | wc -l) let "myPatchNumber += 1"
patchFile="./"$(printf "%04d" $myPatchNumber)"-patch.patch" echo "$@" > "$patchFile" ---------------------
I call ./GeneratePatches.sh HEAD~3..HEAD SomePath and that produces something very similar to what I want.
Perhaps there is a better way to do that.
Thank you once again. --- Best regards, Nikolaj
23.02.2012 13:24, Jeff King пишет:
Show 41 quoted lines
> On Thu, Feb 23, 2012 at 12:14:23PM +0300, Nikolaj Shurkaev wrote: > >> I wanted to generate several files with some statistics using "git >> log -z" command. >> I did something like this: >> git log -z --patch HEAD~10..HEAD -- SomePathHere | xargs -0 >> --max-chars=1000000 ~/1.sh > I'm not sure what "1.sh" is expecting to take as input, but that will > feed entire commits, including their commit message and entire diff, to > the script on its command line. > > That seems like an awkward interface, but we don't really know what your > script intends to do. Maybe it is worth sharing the contents of the > script. > >> If I put echo "started" into the file ~/1.sh I see that the file is >> called only once instead of multiple times. > Yes. The point of xargs is usually to cram as many arguments into each > invocation of "1.sh" as possible, splitting into multiple invocations > only when we hit the argument-list memory limit that the OS imposes. > > If you want xargs to give each argument its own invocation of the > script, use "xargs -n1". > >> I'm newbie to xargs, thus I tested with and that worked as I expected. >> find . -type f -print0 | xargs -0 ./1.sh >> That produced a lost of "started" lines. > If you instrument your 1.sh more[1], you will find that is not executing > once per file, but rather getting a large chunk of files per invocation. > > [1] Try adding: echo "got args: $*" > >> Thus I suspect there is a but in git log -z command and that doesn't >> "Separate the commits with NULs instead of with new newlines." as >> promised in the documents. > You could verify that assertion by looking at the output. Try piping > your "git log" command through "cat -A | less". When I try it, I see a > NUL between each commit (cat -A will show it as "^@"). > > -Peff >