# [PATCH 2/2] filter-branch: introduce convenience function "skip_commit"

5 messages from 2007-08-31 to 2007-08-31. Participants: Johannes Schindelin, Karl Hasselström, Junio C Hamano.
Thread: https://gitlist.dev/t/9728

## Johannes Schindelin, 2007-08-31 19:06

Subject: [PATCH 2/2] filter-branch: introduce convenience function "skip_commit"
Message-ID: <Pine.LNX.4.64.0708312005420.28586@racer.site>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0708312005420.28586%40racer.site

```

With this function, a commit filter can leave out unwanted commits
(such as temporary commits).  It does _not_ undo the changeset
corresponding to that commit, but it _skips_ the revision.  IOW
its ancestors' tree objects remain the same.

If you like to commit early and often, but want to filter out all
intermediate commits, marked by "@@@" in the commit message, you can
now do this with

	git filter-branch --commit-filter '
		if git cat-file commit $GIT_COMMIT | grep '@@@' > /dev/null;
		then
			skip_commit "$@";
		else
			git commit-tree "$@";
		fi' newbranch

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
---

	Same comment as for 1/2 applies here, too...

 Documentation/git-filter-branch.txt |   34 +++++++++++++++++++++++++++-------
 git-filter-branch.sh                |   14 ++++++++++++++
 t/t7003-filter-branch.sh            |    8 +-------
 3 files changed, 42 insertions(+), 14 deletions(-)

diff --git a/Documentation/git-filter-branch.txt b/Documentation/git-filter-branch.txt
index 456d52b..29bb8ce 100644
--- a/Documentation/git-filter-branch.txt
+++ b/Documentation/git-filter-branch.txt
@@ -112,6 +112,11 @@ OPTIONS
 As a special extension, the commit filter may emit multiple
 commit ids; in that case, ancestors of the original commit will
 have all of them as parents.
++
+You can use the 'map' convenience function in this filter, and other
+convenience functions, too.  For example, calling 'skip_commit "$@"'
+will leave out the current commit (but not its changes! If you want
+that, use gitlink:git-rebase[1] instead).
 
 --tag-name-filter <command>::
 	This is the filter for rewriting tag names. When passed,
@@ -209,24 +214,39 @@ To remove commits authored by "Darl McBribe" from the history:
 git filter-branch --commit-filter '
 	if [ "$GIT_AUTHOR_NAME" = "Darl McBribe" ];
 	then
-		shift;
-		while [ -n "$1" ];
-		do
-			shift;
-			echo "$1";
-			shift;
-		done;
+		skip_commit "$@";
 	else
 		git commit-tree "$@";
 	fi' HEAD
 ------------------------------------------------------------------------------
 
+Note that the changes introduced by the commits, and not reverted by
+subsequent commits, will still be in the rewritten branch. If you want
+to throw out _changes_ together with the commits, you should use the
+interactive mode of gitlink:git-rebase[1].
+
+The function 'skip_commits' is defined as follows:
+
+--------------------------
+skip_commit()
+{
+	shift;
+	while [ -n "$1" ];
+	do
+		shift;
+		map "$1";
+		shift;
+	done;
+}
+--------------------------
+
 The shift magic first throws away the tree id and then the -p
 parameters.  Note that this handles merges properly! In case Darl
 committed a merge between P1 and P2, it will be propagated properly
 and all children of the merge will become merge commits with P1,P2
 as their parents instead of the merge commit.
 
+
 To restrict rewriting to only part of the history, specify a revision
 range in addition to the new branch name.  The new branch name will
 point to the top-most revision that a 'git rev-list' of this range
diff --git a/git-filter-branch.sh b/git-filter-branch.sh
index 3b041d8..a4b6577 100755
--- a/git-filter-branch.sh
+++ b/git-filter-branch.sh
@@ -23,6 +23,20 @@ map()
 	fi
 }
 
+# if you run 'skip_commit "$@"' in a commit filter, it will print
+# the (mapped) parents, effectively skipping the commit.
+
+skip_commit()
+{
+	shift;
+	while [ -n "$1" ];
+	do
+		shift;
+		map "$1";
+		shift;
+	done;
+}
+
 # override die(): this version puts in an extra line break, so that
 # the progress is still visible
 
diff --git a/t/t7003-filter-branch.sh b/t/t7003-filter-branch.sh
index c79853d..e935b20 100755
--- a/t/t7003-filter-branch.sh
+++ b/t/t7003-filter-branch.sh
@@ -138,13 +138,7 @@ test_expect_success "remove a certain author's commits" '
 	git-filter-branch -f --commit-filter "\
 		if [ \"\$GIT_AUTHOR_NAME\" = \"B V Uips\" ];\
 		then\
-			shift;\
-			while [ -n \"\$1\" ];\
-			do\
-				shift;\
-				echo \"\$1\";\
-				shift;\
-			done;\
+			skip_commit \"\$@\";
 		else\
 			git commit-tree \"\$@\";\
 		fi" removed-author &&
-- 
1.5.3.rc7.18.gc9b59

```

## Karl Hasselström, 2007-08-31 19:19

Subject: Re: [PATCH 2/2] filter-branch: introduce convenience function "skip_commit"
Message-ID: <20070831191921.GB2151@diana.vm.bytemark.co.uk>
URL: https://gitlist.dev/e/20070831191921.GB2151%40diana.vm.bytemark.co.uk
In-Reply-To: <Pine.LNX.4.64.0708312005420.28586@racer.site>

```
On 2007-08-31 20:06:27 +0100, Johannes Schindelin wrote:

> It does _not_ undo the changeset corresponding to that commit, but
> it _skips_ the revision. IOW its ancestors' tree objects remain the
> same.

While this is true too, I'm guessing you intended to say that its
_descendants'_ tree objects remain the same. Right?

-- 
Karl Hasselström, kha@treskal.com
      www.treskal.com/kalle

```

## Johannes Schindelin, 2007-08-31 21:05

Subject: Re: [PATCH 2/2] filter-branch: introduce convenience function "skip_commit"
Message-ID: <Pine.LNX.4.64.0708312204490.28586@racer.site>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0708312204490.28586%40racer.site
In-Reply-To: <20070831191921.GB2151@diana.vm.bytemark.co.uk>

```
Hi,

On Fri, 31 Aug 2007, Karl Hasselstr?m wrote:

> On 2007-08-31 20:06:27 +0100, Johannes Schindelin wrote:
> 
> > It does _not_ undo the changeset corresponding to that commit, but
> > it _skips_ the revision. IOW its ancestors' tree objects remain the
> > same.
> 
> While this is true too, I'm guessing you intended to say that its
> _descendants'_ tree objects remain the same. Right?

Right.  So how about:

IOW no tree objects are changed by this.

Hmm?

Ciao,
Dscho

```

## Junio C Hamano, 2007-08-31 21:32

Subject: Re: [PATCH 2/2] filter-branch: introduce convenience function "skip_commit"
Message-ID: <7vzm07wftf.fsf@gitster.siamese.dyndns.org>
URL: https://gitlist.dev/e/7vzm07wftf.fsf%40gitster.siamese.dyndns.org
In-Reply-To: <Pine.LNX.4.64.0708312204490.28586@racer.site>

```
Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:

> Hi,
>
> On Fri, 31 Aug 2007, Karl Hasselstr?m wrote:
>
>> On 2007-08-31 20:06:27 +0100, Johannes Schindelin wrote:
>> 
>> > It does _not_ undo the changeset corresponding to that commit, but
>> > it _skips_ the revision. IOW its ancestors' tree objects remain the
>> > same.
>> 
>> While this is true too, I'm guessing you intended to say that its
>> _descendants'_ tree objects remain the same. Right?
>
> Right.  So how about:
>
> IOW no tree objects are changed by this.

Ok, will amend.

```

## Johannes Schindelin, 2007-08-31 21:39

Subject: Re: [PATCH 2/2] filter-branch: introduce convenience function "skip_commit"
Message-ID: <Pine.LNX.4.64.0708312238430.28586@racer.site>
URL: https://gitlist.dev/e/Pine.LNX.4.64.0708312238430.28586%40racer.site
In-Reply-To: <7vzm07wftf.fsf@gitster.siamese.dyndns.org>

```
Hi,

On Fri, 31 Aug 2007, Junio C Hamano wrote:

> Johannes Schindelin <Johannes.Schindelin@gmx.de> writes:
> 
> > On Fri, 31 Aug 2007, Karl Hasselstr?m wrote:
> >
> >> On 2007-08-31 20:06:27 +0100, Johannes Schindelin wrote:
> >> 
> >> > It does _not_ undo the changeset corresponding to that commit, but
> >> > it _skips_ the revision. IOW its ancestors' tree objects remain the
> >> > same.
> >> 
> >> While this is true too, I'm guessing you intended to say that its
> >> _descendants'_ tree objects remain the same. Right?
> >
> > Right.  So how about:
> >
> > IOW no tree objects are changed by this.
> 
> Ok, will amend.

Thanks; this was the next mail I wanted to send ;-)

Ciao,
Dscho

```
