We can't find the internet
Attempting to reconnect
## 操作原理
使用`git filter-branch`重写提交历史
## 执行方式
设置脚本:
```bash
# 设置git alias 方便操作
git config --global alias.change-commits '!'"f() { VAR=\$1; OLD=\$2; NEW=\$3; shift 3; git filter-branch --env-filter \"if [[ \\\"\$\`echo \$VAR\`\\\" = '\$OLD' ]]; then export \$VAR='\$NEW'; fi\" \$@; }; f"
# 更换名字
git change-commits GIT_AUTHOR_NAME "old name" "new name"
# 更换邮箱
git change-commits GIT_AUTHOR_EMAIL "old@email.com" "new@email.com" HEAD~10..HEAD
### git config
### change-commits="!f() { VAR=$1; OLD=$2; NEW=$3; shift 3; git filter-branch --env-filter \"if [[ \\\"$`echo $VAR`\\\" = '$OLD' ]]; then export $VAR='$NEW'; fi\" \$@; }; f"
```
或者使用commit-filter
```bash
git filter-branch --commit-filter '
if [ "$GIT_AUTHOR_EMAIL" = "wrong_email@wrong_host.local" ];
then
GIT_AUTHOR_NAME="Your Name Here (In Lights)";
GIT_AUTHOR_EMAIL="correct_email@correct_host.com";
git commit-tree "$@";
else
git commit-tree "$@";
fi' HEAD
# 修改脚本可以一次修改多个名称
```
如果运行多次,会出现错误
```text
A previous backup already exists in refs/original/ In that case, re run it, with the new email, and add a -f before the --commit-filter.
```
这需要执行
```bas
# 删除backup
git update-ref -d refs/original/refs/heads/master
# 恢复backup
git filter-branch -f --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD
```
更复杂的配置, 需要关联tags
```bash
#!/bin/bash
git filter-branch --env-filter '
OLD_EMAIL="oldEmail@xxx-MacBook-Pro.local"
CORRECT_NAME="yourName"
CORRECT_EMAIL="yourEmail"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
```