我最近使用以下命令替换了所有本地提交中的作者,提交者和电子邮件:
git filter-branch -f --env-filter '
if [ "$GIT_COMMITTER_NAME" = "oldname" ];
then
GIT_COMMITTER_NAME="newname";
GIT_COMMITTER_EMAIL="newaddr";
GIT_AUTHOR_NAME="newname";
GIT_AUTHOR_EMAIL="newaddr";
fi
if [ "$GIT_AUTHOR_NAME" = "oldname" ];
then
GIT_COMMITTER_NAME="newname";
GIT_COMMITTER_EMAIL="newaddr";
GIT_AUTHOR_NAME="newname";
GIT_AUTHOR_EMAIL="newaddr";
fi
' -- --all
Run Code Online (Sandbox Code Playgroud)
更新在本地立即显现(例如在我的SourceTree环境中).但是,在将修改后的存储库强制推送到GitHub之后......
git push -f origin master
Run Code Online (Sandbox Code Playgroud)
......两个单独的项目顽固地拒绝让他们的提交者和作者更新:Gemfile.lock文件和一个Views目录.
还请注意:
这是我第二次在此存储库上执行此类操作.我相信我第一次遇到这样的问题.
在存储库中搜索我的旧名称...
$ find . "<oldname">
Run Code Online (Sandbox Code Playgroud)... 确实产生了一堆结果,这意味着oldname仍然潜伏在许多存储库文件中 - 包括在GitHub和本地都出现更新的文件.
我的问题是:如何更改GitHub上两个"顽固"文件的提交者/作者?
我想知道是否有办法更改在 GitHub 存储库中推送更改的人员(帐户)。
例如:我以不同的名称(不是电子邮件)推送到我的私人存储库,但我拼错了我名字的一个字母,GitHub 将提交标记为用户名而非用户名提交;
我在Windows上使用Git并设置用户名和电子邮件:
git config --global user.name "hydRAnger"
git config --global user.email "armyiljfe@gmail.com"
Run Code Online (Sandbox Code Playgroud)
我用的时候:
git config --global --list
Run Code Online (Sandbox Code Playgroud)
我得到输出:
user.name = hydRAnger
user.email=armyiljfe@gmail.com
但是,当我使用git log作者信息应该是:
作者:hydRAnger
<armyiljfe@gmail.com>
但事实上我得到了输出:
作者:未知
<hydRAnger@hydRAnger-PC.(none)>
我不知道为什么作者信息会发生变化.
我有一个脚本,可以自动在多个git存储库上重写作者.
def filter_history(old, new, name, repoPath):
command = """--env-filter '
an="$GIT_AUTHOR_NAME"
am="$GIT_AUTHOR_EMAIL"
cn="$GIT_COMMITTER_NAME"
cm="$GIT_COMMITTER_EMAIL"
if [[ "$GIT_COMMITTER_NAME" = "|old|" ]]
then
cn="|name|"
cm="|new|"
fi
if [[ "$GIT_AUTHOR_NAME" = "|old|" ]]
then
an="|name|"
am="|new|"
fi
export GIT_AUTHOR_NAME="$an"
export GIT_AUTHOR_EMAIL="$am"
export GIT_COMMITTER_NAME="$cn"
export GIT_COMMITTER_EMAIL="$cm"
'
"""
#DO string replace
command = command.replace("|old|", old)
command = command.replace("|new|", new)
command = command.replace("|name|", name)
print "git filter-branch -f " + command
process = subprocess.Popen(['git filter-branch -f', command],cwd=os.path.dirname(repoPath), shell=True)
process.wait()
Run Code Online (Sandbox Code Playgroud)
该命令执行正常,但告诉我在repo历史记录中没有任何变化.但是,如果我接受打印出来的命令(应该是正在执行的命令),将其放在shell脚本中并执行它,它会改变历史记录.我认为该命令在某种程度上没有被正确执行.有没有办法可以确切地看到子进程模块正在执行什么命令?
看到GitHub有改名的功能,丢掉对我来说好像问题不大。然而,我意识到我一直在使用我的旧名字@users.noreply.github.com 来提交和一切。因此,那封旧电子邮件将我之前的所有提交链接在一起。有没有办法解决这个问题?
我一直在想,也许我可以用我以前的名字创建一个帐户,让感兴趣的人通过该链接?在这种情况下,重新定位 repo 或类似的东西不太适用,因为我已经向其他存储库贡献了代码,所以我的旧提交仍然在那里未完成,没有名称或电子邮件来链接帐户。
我一直在想的另一种方法是把我的名字改回来,但我想这是最后的手段。这有点不幸,但我想由于 Git 的工作方式,它必须如此。(我现在已切换到我的 gmail 电子邮件,以防将来发生这种情况)
做完之后
git cvsimport
Run Code Online (Sandbox Code Playgroud)
我以前的提交列出属于用户"user"(用户是我的unix用户名).
我怎么能告诉git这些提交是我的(即,定义从"user"到我的"First Lastname <first@last.com>"git-user的映射?
后重写提交树重命名作者和更改电子邮件,我的本地回购和远程起源是不同步的.我是唯一的开发人员,并希望将我的本地仓库推送到原点,将origin/master更新到我的本地主分支.这是我尝试过的没有任何成功:
LibGuest08@LBP-NW0345QZMH1 /e/devel/src/java/bbct (swing.0.5.2)
$ git push
Password:
To ssh://codeguru@git.code.sf.net/p/bbct/code
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to 'ssh://codeguru@git.code.sf.net/p/bbct/code'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.
LibGuest08@LBP-NW0345QZMH1 /e/devel/src/java/bbct (swing.0.5.2)
$ …Run Code Online (Sandbox Code Playgroud) 我使用Gitkraken作为我的Github源代码控件.我遵循这种方法但仍然失败了.
但是当我键入下面的命令时,我可以得到我的名字显示.
$ git config --global user.name我的名字
但是,它仍然在我的GitKraken中显示未知.我知道SourceTree的那个可以使用这个git config --global user.name "Name"技巧.
请帮忙,谢谢!
我为我的朋友制作项目,但经过几次提交后,我发现了问题。我想如果我登录他的帐户,它会像他一样创建。但它是我的另一个作者(我)创造的。我可以在 gitlab 上改变这个吗?如果是在不更改数据提交的情况下更改它的选项。
当我需要更改各种提交的提交日期时,我使用交互式变基并一一更改它们。
我怎样才能用一个命令来改变它们呢?换句话说,我需要将给定命令应用于交互式变基中列出的所有提交。
谢谢