【发布时间】:2014-09-10 19:22:42
【问题描述】:
为方便起见,本文中的所有内容都可以作为 Bash 命令运行。
我有基于GitHub's own 的following script:
cat <<EOF > git-unite
#!/usr/bin/env bash
# Usage:
#
# git-unite "User Name" "new@email.com" \
# "old1@email.com" \
# "old2@email.com" \
# ...
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" "new@email.com" "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?) -
我之前试过不带
echo,但没用。我相信这是因为该命令在某种子外壳中运行(我并不真正了解这里的术语)并且这些变量丢失了。我宁愿不导出它们,因为它们对其他人没有意义。经过测试,$email似乎无论如何都是空的。 -
当我导出时,
name仍然是空的,我得到空标识错误。 -
这个new version 的脚本现在可以正常工作了,但是有什么方法可以在不导出的情况下做到这一点?我正在编辑原始问题帖子以反映这个问题。
-
它为当前 shell 运行的程序导出它(它把它放到进程环境中以便它被继承)。它不会影响任何当前正在运行的程序。