批量替换提交作者信息时如何实现错误处理?

How to implement error handling when mass replacing commit author information?

使用 Git-TF 将 TFS 项目转换为 Git 并保留提交历史记录。转换完成后,作者需要将 TFS 样式 "Domain\Username" 重命名为 Git 样式 "Name Email".

如果名字不存在,下面的脚本(来源:http://ringo.de-smet.name/2013/02/migrating-from-tfs-to-git/)将不会 运行。如果第二个名字不存在,它将被替换为最后使用的名字。

git filter-branch --env-filter '
case ${GIT_COMMITTER_NAME} in
"DOMAIN\user1") name="ProperName1" ; email="ProperName1@email.com" ;;
"DOMAIN\user2") name="ProperName2" ; email="ProperName2@email.com" ;;
"DOMAIN\user3") name="ProperName3" ; email="ProperName3@email.com" ;;
"DOMAIN\user4") name="ProperName4" ; email="ProperName4@email.com" ;;
...
"DOMAIN\user200") name="ProperName200" ; email = "ProperName200@email.com"
esac

export GIT_AUTHOR_NAME="$name"
export GIT_AUTHOR_EMAIL="$email"
export GIT_COMMITTER_NAME="$name"
export GIT_COMMITTER_EMAIL="$email"
fi
'

要检查的名称列表超过 200 个。当要过滤的行超过 100 domain/name 行时,会出现 Status_Access_Violation。当列表被分成两半时,两半都会执行,但不会执行完整列表。不知道为什么会这样。

MSYS-1.0.12 Build:2012-07-05 14:56
Exception: STATUS_ACCESS_VIOLATION at eip=0A3B3B20
eax=00000000 ebx=6D65203B ecx=FFFFFFFF edx=680A4C5C esi=3D6C6961 edi=6E614422
ebp=2275612E esp=00263808 program=C:\Program Files (x86)\Git\bin\sh.exe
cs=0023 ds=002B es=002B fs=0053 gs=002B ss=002B
Stack trace:
Frame     Function  Args
25813 [main] sh 37608 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
29854 [main] sh 37608 handle_exceptions: Error while dumping state (probably corrupted stack)

目前正在尝试将导出包装在 if 语句中,但无法弄清楚如何根据当前情况对其进行检查。

如何将正确的错误处理添加到此脚本中,有没有办法克服 Status_Access_Violation?

if [ "$GIT_COMMITTER_NAME" = .... ]
then
export GIT_AUTHOR_NAME="$name"
export GIT_AUTHOR_EMAIL="$email"
export GIT_COMMITTER_NAME="$name"
export GIT_COMMITTER_EMAIL="$email"
fi
'

任何超过 16,000 个字符的内容都会抛出 STATUS_ACCESS_VIOLATION。通过根据每个命令中的当前字符长度自动拆分 git 过滤器来解决此问题。这会根据拆分过滤和重写历史 X 次,从而增加完成时间。可能是更好的方法,但这是有效的方法。

git filter-branch --env-filter '
if [ "$GIT_COMMITTER_NAME" = "DOMAIN\user1" ];
then
export GIT_AUTHOR_NAME="properName1";
export GIT_AUTHOR_EMAIL="properName1@email.com";
export GIT_COMMITTER_NAME="properName1";
export GIT_COMMITTER_EMAIL="properName1@email.com";
fi
...(properName2 to properName99)...
if [ "$GIT_COMMITTER_NAME" = "DOMAIN\user100" ];
then
export GIT_AUTHOR_NAME="properName100";
export GIT_AUTHOR_EMAIL="properName100@email.com";
export GIT_COMMITTER_NAME="properName100";
export GIT_COMMITTER_EMAIL="properName100@email.com";
fi
'
git filter-branch --env-filter '
...(properName101 to propername200)...
'