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

时间:2015-03-24 05:24:26

标签: git bash shell tfs git-bash

使用Git-TF将TFS项目转换为Git并保留提交历史记录。转换完成后,需要从TFS样式" Domain \ Username"重命名作者。 Git风格"名称电子邮件"。

如果名字不存在,下面的脚本(来源: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个时,会发生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
'

1 个答案:

答案 0 :(得分:0)

超过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)...
'