summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xcommit-remove-pointless-commit52
-rwxr-xr-xmsg-record-original-commit3
-rwxr-xr-xparent-prune-empty-first21
-rwxr-xr-xparent-prune-empty-merge20
4 files changed, 43 insertions, 53 deletions
diff --git a/commit-remove-pointless-commit b/commit-remove-pointless-commit
deleted file mode 100755
index ba33522..0000000
--- a/commit-remove-pointless-commit
+++ /dev/null
@@ -1,52 +0,0 @@
-#!/usr/bin/ruby
-# Executed like the following to trim off pointless commits (including merge commits)
-# that doesn't change the tree
-# git filter-branch -f --commit-filter '~/ws/jenkins/split2/helper.rb "$@"' HEAD
-#
-# parameters are "<tree> [ -p <parent> ]*" and is the same as git commit-tree
-
-# system "echo executing #{ARGV.join(' ')} >> /tmp/log"
-
-# extract parents
-parents=[]
-i=2
-while i<ARGV.size do
- parents << ARGV[i]
- i+=2
-end
-parents=parents.uniq
-
-tree=ARGV[0]
-
-# is the commit 'c' already an ancestor of any of the commits given in 'commits'?
-def subsumed_by(c,commits)
- commits.find do |c2|
- c!=c2 && c==`git merge-base #{c} #{c2}`.chomp()
- end
-end
-
-# only keep commits that are not subsumed by others
-# subsumed parents are pointless merge
-parents = parents.select do |p|
- !subsumed_by(p,parents)
-end
-
-# does any parent has a different tree?
-non_empty_commit = parents.find do |p|
- tree != `git rev-parse #{p}^{tree}`.chomp()
-end
-
-if non_empty_commit!=nil || parents.size==0 then
- # if a commit has non-empty diff, make a commit
- args = []
- args << tree
- parents.each{ |c| args << "-p"; args << c; }
- # system "echo git commit-tree #{args.join(' ')} >> /tmp/log"
- exec "git commit-tree #{args.join(' ')}"
-else
- # system "echo skipping >> /tmp/log"
- # otherwise don't create this as a commit
- puts parents
-end
-
-
diff --git a/msg-record-original-commit b/msg-record-original-commit
index cbb96e1..f5a5d00 100755
--- a/msg-record-original-commit
+++ b/msg-record-original-commit
@@ -1,4 +1,5 @@
#!/bin/sh
# commit message filter used with git-filter-branch to record the original commit ID
cat
-echo "\nOriginally-Committed-As: $GIT_COMMIT"
+echo
+echo "Originally-Committed-As: $GIT_COMMIT"
diff --git a/parent-prune-empty-first b/parent-prune-empty-first
new file mode 100755
index 0000000..c9d73df
--- /dev/null
+++ b/parent-prune-empty-first
@@ -0,0 +1,21 @@
+#!/usr/bin/env bash
+# Usage: git filter-branch -f --parent-filter ~/git-filters/parent-prune-empty-first HEAD
+
+has_empty_tree() {
+ [[ "$(git rev-parse "${1}^{tree}")" == 4b825dc642cb6eb9a060e54bf8d69288fbee4904 ]]
+}
+
+has_parents() {
+ git rev-parse "${1}^" &>/dev/null
+}
+
+for parent in $(cat); do
+ if [[ "$parent" == '-p' ]]; then
+ continue
+ fi
+ if has_empty_tree "$parent" && ! has_parents "$parent"; then
+ continue
+ fi
+ printf ' -p %s ' "$parent"
+done
+echo
diff --git a/parent-prune-empty-merge b/parent-prune-empty-merge
new file mode 100755
index 0000000..10e9fb8
--- /dev/null
+++ b/parent-prune-empty-merge
@@ -0,0 +1,20 @@
+#!/usr/bin/env ruby
+# Usage: git filter-branch -f --parent-filter ~/git-filters/parent-prune-empty-merge HEAD
+
+# Function to determine if commit 'c' already an ancestor of any of
+# the commits given in 'commits'
+def subsumed_by(c,commits)
+ commits.any? do |c2|
+ c!=c2 && c==`git merge-base #{c} #{c2}`.chomp()
+ end
+end
+
+# Get the current list of parents
+parents = $stdin.read.split.select{|a|a!='-p'}
+
+# Pnly keep parents that are not subsumed by other parents.
+parents = parents.select do |p|
+ not subsumed_by(p,parents)
+end
+
+puts parents.uniq.map{|p|"-p #{p}"}.join(' ')