爲方便起見,本文中的所有內容均可作爲Bash命令運行。使用git-filter-branch重命名提交作者的便捷腳本
我有一個基於關的GitHub's own的following script:
cat <<EOF > git-unite
#!/usr/bin/env bash
# Usage:
#
# git-unite "User Name" "[email protected]" \
# "[email protected]" \
# "[email protected]" \
# ...
name="$1"
email="$2"
git config user.name "$name"
git config user.email "$email"
shift 2
for old_email in $*; do
echo "changing $old_email"
git filter-branch --force --env-filter '
if [ "$GIT_COMMITTER_EMAIL" = "$(echo $old_email)" ]
then
export GIT_COMMITTER_NAME="$(echo $name)"
export GIT_COMMITTER_EMAIL="$(echo $email)"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$(echo $old_email)" ]
then
export GIT_AUTHOR_NAME="$(echo $name)"
export GIT_AUTHOR_EMAIL="$(echo $email)"
fi
' --tag-name-filter cat -- --branches --tags
done
EOF
chmod u+x git-unite
然而,當我在test repository運行腳本我已經建立了:
git clone https://gist.github.com/dc896ccd9a272a126436.git
cd dc896ccd9a272a126436
git-unite "Test Author" "[email protected]" "hehe2" "hehe"
沒有什麼改變。有什麼麻煩?
changing hehe2 Rewrite be8d35aca918caaa86035ab8f8011d5ff6131939 (3/3) WARNING: Ref 'refs/heads/master' is unchanged changing hehe Rewrite be8d35aca918caaa86035ab8f8011d5ff6131939 (3/3) WARNING: Ref 'refs/heads/master' is unchanged
Using exports,這個問題是可以解決的。有沒有辦法做到這一點,而不導出這些變量?
如果您從該過濾器分支腳本中打印出'$ email',它是否有任何價值? (爲什麼'$(echo $ name)'和'$(echo $ email)'而不是'$ name'和'$ email'?) – 2014-09-10 19:26:36
我之前沒有使用'echo',但它沒有工作。我相信這是因爲命令是在某種子shell中運行的(我並不真正知道這裏的術語),並且這些變量都丟失了。我寧願不將它們導出,因爲它們對其他人沒有意義。經過測試,似乎'$ email'是空的,無論如何。 – 2014-09-10 19:29:22
當我導出時,'name'仍然是空的,我得到空的ident錯誤。 – 2014-09-10 19:31:32