git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: How to split a patch

From
Wincent Colaiuta <win@wincent.com>
Date
Jan 28, 2008, 10:44 UTC
Message-ID
<E8308544-2613-463D-8277-5C1B40709A7B@wincent.com>
In-Reply-To
<7vy7aatfck.fsf@gitster.siamese.dyndns.org>
El 28/1/2008, a las 11:27, Junio C Hamano escribió:
Show 19 quoted lines
> Matthieu Moy <Matthieu.Moy@imag.fr> writes:
>
>> "Paolo Ciarrocchi" <paolo.ciarrocchi@gmail.com> writes:
>>
>>> Yes it helps but I still wonder whether thereis a "simpler" way to  
>>> achive that.
>>> Is it possible to split a patch selecting the hunk in git gui or any
>>> other graphical
>>> tool?
>>
>> You can apply the patch without commiting it, and them make several
>> partial commits, by right-click "stage hunk for commit" in git-gui.
>
> Yes, and you can do the same with "git add -i".  These tools are
> not quite nice, as they encourage a wrong workflow of committing
> what you haven't had as a whole in the work tree.  By
> definition, you are making untested commits between your base
> commit (that presumably was tested well) and your final commit
> (that would also be tested well).

And as another alternative, seeing as Git is so easy to script, it is trivial to make a script that checks out all the commits in a series and runs the test suite against them. This of course assumes that you have a test suite!

For example, this is the script that I use on a topic branch before submitting the corresponding patch series. It's one of the first scripts for Git that I wrote, so it is probably a bit naïve, but it works in the basic case. Basically bails if "make clean && make test" doesn't work for any commit in the series.

I've used this on the series that I've sent to the Git mailing list, but you can use it internally on your local projects too before merging topic branches.

Cheers, Wincent

#!/bin/sh -e # # check-series.sh # Check all commits in a topic branch before submission # # Created by Wincent Colaiuta on 23 November 2007. # Copyright 2007 Wincent Colaiuta.

# # Functions #

die () {
   echo "$1"
   exit 1
}

# # Main #

git diff --quiet || die "Unstaged changes; won't start" git diff --cached --quiet || die "Staged changes; won't start"

# parse HEAD (something like "ref: refs/heads/my_local_branch") to get  
remote and merge
GIT_DIR=$(git rev-parse --git-dir)
TOPIC="$GIT_DIR/HEAD"
test -f "$TOPIC" || die "No HEAD found at '$TOPIC'"
BRANCH_REF=$(< "$TOPIC")
if [ "${BRANCH_REF%%: */*}" != "ref" ]; then
   die "expected HEAD '$BRANCH_REF' to be of the form 'ref: .../...'"
fi
BRANCH=${BRANCH_REF##*/}
REMOTE=$(git config branch.$BRANCH.remote) || die "failed to get  
branch.$BRANCH.remote"
MERGE=$(git config branch.$BRANCH.merge) || die "failed to get branch. 
$BRANCH.merge"
MERGE=${MERGE##*/}

# remember which branch we were on prior to starting trap 'git checkout $BRANCH' exit

# will check all commits in topic branch not present in origin
echo "On branch $BRANCH"
echo "Commits to be checked:"
git rev-list --pretty=oneline HEAD ^$REMOTE/$MERGE
for COMMIT in $(git rev-list HEAD ^$REMOTE/$MERGE); do
   echo "Checking $COMMIT"
   git checkout $COMMIT
   make clean
   make test || die "Commit $COMMIT is bad"
done
echo "All revisions passed!"
Previous: Mike HommeyNext: Johannes Schindelin
Message 8 of 11 in “How to split a patch”
  1. Paolo CiarrocchiJan 28, 2008
  2. Junio C HamanoJan 28, 2008
  3. Paolo CiarrocchiJan 28, 2008
  4. Matthieu MoyJan 28, 2008
  5. Junio C HamanoJan 28, 2008
  6. Junio C HamanoJan 28, 2008
  7. Mike HommeyJan 28, 2008
  8. Wincent ColaiutaJan 28, 2008
  9. Johannes SchindelinJan 28, 2008
  10. Wincent ColaiutaJan 28, 2008
  11. Boaz HarroshJan 28, 2008

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.