added git_filter_branch_fix_author.sh
parent
6a7f8d5777
commit
b84c425098
@ -0,0 +1,108 @@
|
||||
#!/usr/bin/env bash
|
||||
# vim:ts=4:sts=4:sw=4:et
|
||||
#
|
||||
# Author: Hari Sekhon
|
||||
# Date: 2020-12-04 17:46:52 +0000 (Fri, 04 Dec 2020)
|
||||
#
|
||||
# https://github.com/HariSekhon/bash-tools
|
||||
#
|
||||
# License: see accompanying Hari Sekhon LICENSE file
|
||||
#
|
||||
# If you're using my code you're welcome to connect with me on LinkedIn and optionally send me feedback to help steer this or other code I publish
|
||||
#
|
||||
# https://www.linkedin.com/in/HariSekhon
|
||||
#
|
||||
|
||||
set -euo pipefail
|
||||
[ -n "${DEBUG:-}" ] && set -x
|
||||
srcdir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
|
||||
# shellcheck disable=SC1090
|
||||
. "$srcdir/lib/utils.sh"
|
||||
|
||||
# shellcheck disable=SC2034,SC2154
|
||||
usage_description="
|
||||
Rewrites the current Git branch using git filter-branch to change the Author/Committer name and/or email address
|
||||
|
||||
For each commit in the current branch history, if both:
|
||||
|
||||
- the Author or Committer Name matches the <old_name>
|
||||
- the Author or Committer Email matches the <old_email>
|
||||
|
||||
then both the Author and Committer names and emails are set to <new_name> and <new_email>
|
||||
|
||||
|
||||
Must be called from the top level directory of the repository
|
||||
|
||||
You may still see the old name/email in the local repo's git log, test by cloning to a new repo and if happy then park the old checkout and checkout clean
|
||||
|
||||
|
||||
DANGER: this rewrites Git history.
|
||||
Do not use this carelessly as it rewrites Git history.
|
||||
Always have a backup.
|
||||
Do not do this on pushed branches unless you are an Expert and intend to
|
||||
|
||||
If there is already a git filter-branch rewrite backup in .git/refs/original, git filter-branch will refused to proceed - specify \$FORCE_GIT_REWRITE=1 in the environment to force the rewrite
|
||||
"
|
||||
|
||||
# used by usage() in lib/utils.sh
|
||||
# shellcheck disable=SC2034
|
||||
usage_args="<old_email> <new_email> [<new_name>]"
|
||||
|
||||
help_usage "$@"
|
||||
|
||||
min_args 2 "$@"
|
||||
|
||||
old_email="$1"
|
||||
new_email="$2"
|
||||
new_name="${3:-}"
|
||||
|
||||
opts=""
|
||||
if [ -n "${FORCE_GIT_REWRITE:-}" ]; then
|
||||
opts="-f"
|
||||
fi
|
||||
|
||||
for x in "$old_email" "$new_email"; do
|
||||
# email_regex is defined in lib/utils.sh
|
||||
# shellcheck disable=SC2154
|
||||
# <Hari Sekhon@TeamCity> doesn't match - technically this may not match real emails so be a bit more lax
|
||||
#if ! [[ "$x" =~ $email_regex ]]; then
|
||||
if ! [[ "$x" =~ @ ]]; then
|
||||
die "Invalid email '$x' given"
|
||||
fi
|
||||
done
|
||||
|
||||
echo
|
||||
echo "DANGER!!!"
|
||||
echo
|
||||
echo -n "You are about to replace all Author and Committer references from '$old_email' to '$new_email'"
|
||||
if [ -n "$new_name" ]; then
|
||||
echo " and change the name field to '$new_name'"
|
||||
fi
|
||||
echo
|
||||
read -r -p "DANGER: are you absolutely sure? (y/N) " answer
|
||||
echo
|
||||
|
||||
shopt -s nocasematch
|
||||
if ! [[ "$answer" =~ ^(y|yes)$ ]]; then
|
||||
echo "Aborting..."
|
||||
exit 1
|
||||
fi
|
||||
shopt -u nocasematch
|
||||
|
||||
timestamp "Starting git filter-branch replacement"
|
||||
echo
|
||||
|
||||
git filter-branch "${opts[@]}" --tag-name-filter cat --env-filter \
|
||||
"
|
||||
if [ \"\$GIT_AUTHOR_EMAIL\" = '$old_email' ] ||
|
||||
[ \"\$GIT_COMMITTER_EMAIL\" = '$old_email' ]; then
|
||||
if [ -n '$new_name' ]; then
|
||||
export GIT_AUTHOR_NAME='$new_name'
|
||||
export GIT_COMMITTER_NAME='$new_name'
|
||||
fi
|
||||
export GIT_AUTHOR_EMAIL='$new_email'
|
||||
export GIT_COMMITTER_EMAIL='$new_email'
|
||||
fi
|
||||
" \
|
||||
-- --all
|
Loading…
Reference in New Issue