使用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
'
答案 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)...
'