在Git仓库中的所有提交中更改用户

xjreopfe  于 12个月前  发布在  Git
关注(0)|答案(1)|浏览(116)

在为我的一个旧项目挖掘出一个Git仓库并将其克隆到我现在的机器上之后,我试图将其加载到我的Git GUI中失败了。错误表明该项目上有太多的贡献者,因为我是一个使用业余爱好许可证的业余爱好者。这是一个私人项目,所以我实际上是唯一的用户,许可证是完全合适的,但git log | grep Author: | sort -u显示,我似乎已经使用了大约六个电子邮件地址多年来。推测这就是导致封锁。
我在网上找到一篇文章,指出用户可以使用以下方法进行追溯更改:

$ git filter-branch --env-filter '
OLD_EMAIL="[email protected]"
NEW_NAME="New Name"
NEW_EMAIL="[email protected]"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
  export GIT_COMMITTER_NAME="$NEW_NAME"
  export GIT_COMMITTER_EMAIL="$NEW_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
  export GIT_AUTHOR_NAME="$NEW_NAME"
  export GIT_AUTHOR_EMAIL="$NEW_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

字符串
这 * 似乎 * 作出的变化,但我仍然得到同样的错误时,试图加载到GUI的存储库,所以我猜它是不完整的。
是否有某种核心选项可以强制Git完全更改对同一用户的所有提交?没有关于重写历史的担忧,因为从来没有其他用户。
[edit]这里提到的GUI客户端是SmartGit,它现在有一个业余爱好使用的许可证。它可以在任何只有一个提交者/作者的仓库上使用。

ndasle7k

ndasle7k1#

看起来GUI会检测到未被修改的refs(如refs/remotes/origin/foo)上的旧提交,并拒绝加载。因此,其中一个想法是从当前的本地repo中创建一个新的克隆,并使其仅包含更新的分支和标签。

git clone /path/to/repo -- /path/to/new
cd /path/to/new

# Since it's not a bare/mirror clone,
# the branches are refs/remotes/origin/* instead of refs/heads/*.

# Go into detached HEAD in order to avoid failure in the following fetch
git checkout -d HEAD

# Fetch and create branches in refs/heads/*
git fetch origin +refs/heads/*:refs/heads/*

# Edit the remote "origin" if there is a real remote repository
# The current "origin" points to /path/to/repo
git remote set-url origin <the_remote_repository_URL>

# Go back to a branch
git switch <branch>

字符串
如果有一个真实的远程仓库,请确保在git fetchgit pull之前运行git push -f来更新远程仓库中的分支/标签。否则,一旦旧的提交被提取到新的本地仓库中,GUI就会抱怨。

相关问题