git从终端推送错误的用户

Posted

技术标签:

【中文标题】git从终端推送错误的用户【英文标题】:git pushes with wrong user from terminal 【发布时间】:2014-03-04 03:18:26 【问题描述】:

我的 git 和我的终端有问题。

这是一个向您展示我的问题的画廊:http://imgur.com/a/6RrEY

当我从终端推送提交时,git 说我用另一个用户名推送它们,那是我的组织(我的公司)的用户,根本没有提交,它似乎不属于任何人:(查看画廊第一张照片)

但是当我使用 Github for mac 时不会发生这种情况,在提要中我看到自己推送的提交。

这个问题也影响了我的个人存储库,我的终端说我没有权限在这些存储库上推送提交(这显然是错误的),因为它试图用这个用户推送它:(检查画廊第二张照片)

你猜怎么着? Github for mac 也不会发生这种情况。

几天前我把我的电脑换了一台全新的,所以我重置了我所有 github 的 ssh 密钥,只留下了一个由 Github for Mac 生成的新密钥,所以我不认为有什么幽灵用户/ ssh 密钥隐藏在某个地方,这个硬盘是全新的:(查看画廊第三张图片)

我的 .gitconfig 文件很清楚,只有我的凭据:(查看画廊第四张图片)

我真的不明白,帮助,***,你是我唯一的希望。

(对于我糟糕的 Gimp 技能和《星球大战》参考资料,我深表歉意)

编辑: ssh-add -l 只显示了 github 为 mac 创建的好的 ssh 密钥,我只有一个 github 帐户

EDIT2 : ssh -T git@github.com 认我是好用户。

EDIT3 : 经过几次测试后,我的终端似乎使用我的用户名进行提交,但使用另一个推送它们,Github for mac 提交并使用良好的用户名推送。这种情况发生我拥有/制作的每个回购(甚至是新的)。

EDIT4:在个人存储库中git log --pretty="%h %an %ae" 显示我的好用户名

EDIT5 :没有迹象表明环境变量会覆盖我在env 中的凭据。即使我尝试使用良好的凭据设置这些变量,问题仍然存在。

EDIT6:如果我强制用户进入存储库的/.git/config 路径,事情就会正常恢复,但我认为这不是一个好的选择:http://USER@github.com/USER/REPO.git

EDIT7:我们删除了为我推送提交的 git 用户,这带来了另一个错误:remote: Invalid username or password. fatal: Authentication failed for 'https://github.com/USER/REPO.git/'

最终编辑:我用自制软件安装了 git,输入 git config --global push.default simple 现在即使不强制用户,它也需要我的凭据。那很奇怪。谢谢大家的帮助,你们很棒!

【问题讨论】:

检查 ~/.gitconfig$project_root/.git/config 文件。这两个之一肯定是错误配置的用户名。 感谢您的回答 ansh0l。 ~/.gitconfig 很清楚,$project_root/.git/config 也很清楚。事实上,我对每个个人项目都有这个问题,可以推送工作项目,因为这个其他用户属于拥有这些存储库的我的组织。 那你有多个github账号吗?一个供公司使用,另一个供个人使用? 不,一切只有一个。 一个烦人的解决方案是重新生成另一个 SSH 密钥。如果您将当前的 SSH 密钥与其他服务一起使用,那将毫无意义。 【参考方案1】:

看起来我的终端使用我的用户名进行提交,但使用另一个推送它们

作者和提交者的姓名和电子邮件(对 GitHub 很重要)来自:

git config user.name
git config user.email

但是,如git configgit commit-tree 中所述,这些值可以被环境变量覆盖:

GIT_AUTHOR_NAME
GIT_AUTHOR_EMAIL
GIT_COMMITTER_NAME
GIT_COMMITTER_EMAIL

所以仔细检查这些变量。

如果我强制用户进入存储库的.git/config,一切都会恢复正常,但我认为这不是一个好的选择。

但这应该是一个很好的解决方案。 使用 https url 时,我总是在其中指定用户,以确保使用正确的用户完成身份验证。

http://USER@github.com/USER/REPO.git

【讨论】:

感谢 VonC 的回复!不幸的是,我的git configcredentials 是正确的,我的/username/.bashrc 文件中没有设置环境变量... @Yinfei84 不过,请检查您的“env”输出。 @Yinfei84 如果(为了测试)你明确设置这些变量,然后尝试提交和推送,会发生什么。那会更好吗? 对不起,如果我不清楚,我的意思是如果我强迫用户走上这样的路径它会起作用:http://USER@github.com/USER/REPO.git http://USER@github.com/USER/REPO.git 实际上是唯一可行的选项。在其他情况下,Git 会将随机用户的密码发送到远程服务器,通常不属于该用户。【参考方案2】:

尽管其他用户提供了所有不错的选项,但解决此问题的唯一方法是完全重新安装 git 并输入 git config --global push.default simple 以重写良好的凭据。

【讨论】:

@VonC,尽管您的回答很棒,但它根本不起作用。这是唯一对我有用的解决方案。我想知道是 git 问题还是 OSX... git config --system --unset credential.helper 为我工作,现在我被要求再次推送我的 GitHub 凭据,并且可以提供正确的用户 ID 和密码。 @CoDEmanX 你的答案是唯一对我有用的答案。对于遇到此问题的其他人,这是因为我们在与 github 合作时使用 2FA,我需要先从 github gui 生成一个令牌,并在我重置本地凭据后从命令行将其用作我的密码!查看https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/了解详情 它只是 .gitconfig 文件。要么删除它,要么重置它......当我提交一个试验项目进行面试时,我遇到了这个问题。妈的,虽然很痛。它与配置文件 git config --system --unset credential.helper 不适用于 Windows 10 git bash:error: could not lock config file C:/Program Files/Git/mingw64/etc/gitconfig: Permission denied【参考方案3】:

我刚刚在工作中遇到了这个问题。 mac 附带的或安装 xcode 时附带的内置 git 将 git 凭据缓存在钥匙串中。我的解决方法是:

开始钥匙串访问(通过 cmd + 空格开始聚光灯,键入钥匙串,按 Enter)

在左上角的钥匙串下,选择“登录” 在左侧的类别下,选择“密码”

找到名称“github”并将其删除。

【讨论】:

确保你在这里删除所有 github 条目并设置登录配置 *git config --global user.name *git config --global user.email 就我而言,SourceTree 遇到了这个问题。删除钥匙串中的项目修复它! @Shank_Transformer 您的解决方案对我有用!谢谢! 您可能需要在 Ubuntu 上搜索(或直接启动)seahorse 先生,我欠你的债【参考方案4】:

如果您使用的是 MAC,请转到 Keychain Access 并删除您不希望 git 访问的用户条目。

【讨论】:

【参考方案5】:

GitHub 通过它看到的 ssh 密钥来识别你,而不是通过 git 的任何设置。

因此,当您尝试从个人帐户推送时,您需要确保工作帐户的 ssh 密钥不在您的密钥环中,反之亦然。

使用ssh-add -l 确定您的密钥环中有哪些密钥,使用ssh-add -d <keyfile> 从您的密钥环中删除密钥,如果它不起作用,请从~/.ssh/config 中删除“不需要的”ssh 密钥。

source

注意:GitHub 仍将仅根据电子邮件识别您的提交。

【讨论】:

这是唯一的答案,它解释了为什么尽管我的user.email 设置正确,但它一直在使用错误的 github 帐户。希望我能投票五次。 在我的情况下,删除 ssh 密钥就像一个魅力 ssh-add -D 这是唯一对我有用的答案。谢谢!! 唯一有效的选项。为什么 git 不会选择正确的键是没有意义的。由于我们提到了它必须在配置中使用的 ssh 文件。 "github 通过它看到的 ssh 密钥来识别你,而不是通过 git 的任何设置" - 恕我直言,这是不准确的并且非常具有误导性/错误。当您使用 SSH 与 github 交互时,SSH 会检查权限。但是,无论 SSH 密钥如何,github 都会根据电子邮件 gitconfig 确定提交的作者身份。【参考方案6】:

临时解决办法是先运行killall ssh-agent,然后添加为您需要使用的帐户生成的ssh密钥ssh-add ~/.ssh/id_4shameer

当我们收到ERROR: Permission to user/repo-git.git denied to username.类型的错误时,这将有助于我们在多个github帐户上工作

【讨论】:

我在从 MacOS 钥匙串 中删除了任何 Github 条目后这样做了,而且效果很好。两点,在killall之后,ssh-agent必须用eval "$(ssh-agent -s)"重启,ssh-add命令必须用sudo执行。 非常感谢!这里唯一对我有用的解决方案。【参考方案7】:

我的解决方案是在我的 ~/.ssh/config 文件中为 github 添加一个条目。我必须这样做是因为:

    我有多个具有相同密钥的 github 帐户(不要这样做!) 当您使用 ssh 'git push' 时,您的计算机默认获取 id_rsa 并将其用作其 ssh 身份。 github 无法(不出所料)消除您指的是哪个帐户的冲突,因为它基于提供的密钥来建立帐户,如果与多个帐户相关联,则会导致这样的痛苦。很长一段时间以来,凶手一直在逃避这个问题,事情刚刚解决。

我添加的条目是:

Host github.com
    Hostname github.com
    Port 22
    User waterproofpatch
    IdentityFile ~/.ssh/id_rsa_waterproofpatch

我创建了一个 密钥,对我的帐户来说是唯一的,作为 id_rsa_waterproofpatch。我的 ssh 配置中的此条目指定对于到 github.com 的连接,我希望提供此密钥。

另一个解决方案可能是让我登录另一个帐户,删除重复的 ssh 密钥。

【讨论】:

【参考方案8】:

清除钥匙串没有帮助...我不得不ssh-add -D 并用ssh-add <keyfile> 重新添加钥匙

【讨论】:

【参考方案9】:

我解决了这个问题,删除(或重命名为 *.bak)MacOS High Sierra 上的 id_rsa 和 id_rsa.pub 文件。来自here的想法。

我在 ~/.ssh/config 中有自定义主机重定向,在我重命名这两个文件之前应该应用但使用了错误的用户...

【讨论】:

【参考方案10】:

这对我有用:

    更改 .git-credentials 中的凭据 在 .gitconfig 中更改全局 user.name 和 user.email

【讨论】:

【参考方案11】:

删除 repo 并再次添加它对我有用:

git remote rm origin
git remote add origin git@github.com:fguillen/MyApp.git

【讨论】:

【参考方案12】:

我使用的是 Windows 10,今天遇到了同样的问题。在我的情况下,我的不同用户的凭据由 Windows 凭据管理器保存。因此使用以下命令删除/取消设置 git 凭据, git config --global --unset credential.helper

没有帮助。我必须按照以下方式手动删除Windows中的条目,

开始 --> 控制面板 ---> 用户帐户 ---> 管理您的凭据 ---> Windows 凭据

然后搜索 git:https://github.com 之类的条目并将其删除。之后就可以正常使用了。

【讨论】:

谢谢,我以前在 Windows 上从未遇到过这个问题,但今天我遇到了这个问题,很高兴在这里看到您的评论。 您说它“没有帮助”,但如果它给您的消息是它无法锁定配置文件,那么问题只是您需要从提升的命令提示符运行它,正如上面评论中指出的那样。【参考方案13】:

即使在卸载我的 git 后,我​​在 windows10 中也有同样的问题,因为 @user542833 说这是因为 windows 缓存,你应该删除 windows Credential Manager 中的 Github 凭据,当你再次尝试推送时,windows 会询问你的凭据然后重新设置

【讨论】:

这有时对我有用,但有时也没有。【参考方案14】:

对我有用的是使用 Github repo 的 https URL 而不是 ssh URL。我去了 Github 项目页面,将 https URL 复制到剪贴板中,然后将其粘贴到下面的第二个命令中:

git remote rm origin
git remote add origin https://[...]

【讨论】:

【参考方案15】:

我遇到了类似的问题,结果发现问题在于公钥文件的最后一行包含我的电子邮件地址。这似乎覆盖了我的配置中的用户设置。一旦我从 .pub 文件中删除了我的电子邮件(并重新上传到我的仓库),Git 就会使用正确的用户连接。

【讨论】:

这对我有用。不知道为什么公钥文件上的标识符最初采用“name@domain”格式,但确实如此。【参考方案16】:

好痛啊!

问题:

    在 git hub 上创建一个仓库 克隆到本地机器 无法推送 403。

由于未知原因导致 git push 使用了错误的用户。我有几个不同的 git hub 用户 ID。我在 2 家不同的公司工作,并且有一个学生证

我正在使用 Mac。这就是我最终所做的

1) 删除 credential.helper

凭证助手如何设置为 osxkeychain 当我启动钥匙串时,点击登录名、密码并搜索 github 我发现了 3 个条目。我不知道钥匙串怎么可能知道使用哪一个

一个。你需要弄清楚 credential.helper 的配置位置

git config --local credential.helper
git config --global credential.helper
git config --system credential.helper

b.一旦找到正确的无花果文件,如下删除它

git config --global --unset credential.helper

现在在我的本地仓库中,我破解了 .git/config 文件

我变了

    url = https://github.com/aedavids/lab3RotationProject.git

    url = https://myGitHubUserId@github.com/aedavids/lab3RotationProject.git

【讨论】:

弥赛亚!! (弓) 酷!它有效并解决了我的问题。谢谢! 谢谢!经过搜索和搜索,这解决了我的问题。 对我来说,只需执行第 2 步(编辑本地 .git/config)就足够了——无需清除缓存。【参考方案17】:

在我的特殊情况下,问题是我使用 .netrc 访问 github.com 并且配置了来自不同用户的令牌:

machine github.com login <another-user-token>

【讨论】:

【参考方案18】:

尝试在新帐户上推送到新的 GitHub 页面存储库时,仅花了 6 个小时才弄清楚这一点。

即使在设置了配置 user.name 和 user.email 之后,它也会默认为我的主帐户。

这是因为 ssh 密钥将默认为 id_rsa(我的主帐户)。

要使用我必须运行的新帐户:

ssh-add ~/.ssh/my_new_key

这将使 git 在推送时使用新密钥。

【讨论】:

【参考方案19】:

首先在 Windows 中转到此路径 开始 --> 控制面板 --> 用户帐户 --> 管理您的凭据 --> Windows 凭据

并从 git 中删除凭据:https://github.com

然后在同一位置添加您要从中推送代码的 GitHub 帐户用户名和密码。

要检查 git 是否会从您添加的用户名推送,现在在 git bash 中输入以下命令。

git config user.name

这将显示 git 将从中推送的用户名。如果用户名正确,那么您的问题就解决了。

对我来说,这并没有解决问题,它仍然显示我之前删除的帐户用户名。

现在在 git bash 中输入您要从中推送的帐户的用户名和电子邮件 ID。

git config --global user.name your_username
git config --global user.email your_emaiid

这将改变用户。 在推送任何代码之前,您可以再次使用以下命令验证用户是否已更改。

git config user.name

【讨论】:

【参考方案20】:

@bolun-zhang 的评论帮助我终于解决了这个问题:

“github 通过它看到的 ssh 密钥来识别你,而不是通过 git 的任何设置”

恕我直言,这是不准确的,而且非常具有误导性/错误。当您使用 SSH 与 github 交互时,SSH 会检查权限。但是,无论 SSH 密钥如何,github 都会根据电子邮件 gitconfig 确定提交的作者身份。

对我来说,这证明是完全准确的。不管我在~/.ssh/config 中设置了什么,即使使用:export GIT_SSH_COMMAND="ssh -i ~/.ssh/some-key",仍在选择备用用户名。

问题和解决方案是 git config user.email 匹配到另一个 github 用户的备用电子邮件。

从其他 github 用户删除该电子邮件后,提交工作正常。

最终,正如@venkatesh-murugesh 指出的那样,您需要设置:

git config user.email

匹配应该拥有提交的 github 用户帐户的电子邮件地址。

当然,您需要使用~/.ssh/configGIT_SSH_COMMAND 来确保SSH 使用的是正确的密钥。测试它:

ssh -T git@github.com

【讨论】:

【参考方案21】:

我在 Visual Studio Code 中通过远程 SSH 运行 git 时遇到了类似的问题。事实证明,VSCode 默认将自己设置为身份验证处理程序,并将 $GIT_ASKPASS 设置为脚本 ($HOME/.vscode-server/bin/*/extensions/git/dist/askpass.sh),用于设置/覆盖 git 凭据。

这可以通过将git.terminalAuthentication 设置为false(又名Git:终端身份验证)来覆盖,并有效地从终端中删除$GIT_ASKPASS 环境变量。

【讨论】:

【参考方案22】:

无论我尝试什么,我都无法在 github 上更改名称,因为提交本身需要不同的作者:

git commit --amend --author="作者姓名 email@address.com"

现在提交显示正确的帐户。

【讨论】:

【参考方案23】:

我也有同样的问题。

解决方法很简单:

打开本地或全局 git 配置文件, 并明确提供[author] 电子邮件。

【讨论】:

【参考方案24】:

这可能是因为远程 URL 错误。您可以通过以下方式查看:git remote -v

错误:git@github.com:&lt;user&gt;/&lt;repo&gt;.git 正确:git@&lt;user&gt;:&lt;user&gt;/&lt;repo&gt;.git

替换它:

git remote remove origin
git remote add origin git@<user>:<user>/<repo>.git

【讨论】:

这是错误的。 git 如何知道您正在使用哪个远程主机。像 github、bitbucket、gitlab 等。【参考方案25】:

这让我烦恼了大约 2 年,今天我终于花时间弄清楚了。我强制推送的任何内容都会显示为由 GitHub 网络上的不同用户推送或由 CircleCI 网络上的不同用户触发。罪魁祸首似乎是我的本地存储库,通过 Code > Open with GitHub Desktop 从我在 GH web 上的 fork 懒惰地创建,都使用 HTTPS。

如果你和我一样,你的遥控器应该是这样的:

> git remote -v
origin  https://github.com/USERNAME/REPO.git (fetch)
origin  https://github.com/USERNAME/REPO.git (push)
upstream    https://github.com/ORG/REPO.git (fetch)
upstream    https://github.com/ORG/REPO.git (push)

然后我:

运行git config --system --unset credential.helper 清除我的HTTPS 凭据;这可能不是必需的,因此您可以尝试跳过它,除非您处于存储凭据错误/无效的情况。 如果您使用的是 Mac OS,您还可以打开钥匙串实用程序应用程序并查看/修改/删除存储在您的登录钥匙串中的个人 GitHub.com 互联网密码凭据。这些凭据的访问控制选项卡将在“始终允许访问...”下显示一个名为 git-credential-osxkeychain 的小终端图标 或者,您可以通过git credential-osxkeychain 在终端中与他们一起玩 通过运行 ssh -T git@github.com 确保我设置了 SSH,这会打印确认我已通过身份验证的响应。 重新配置我的遥控器以使用我的 fork 中的 SSH url:
> git remote remove origin
> git remote add origin git@github.com:USERNAME/REPO.git
> git remote remove upstream
> git remote add upstream git@github.com:ORG/REPO.git

# Shorter alternative:
> git remote set-url origin git@github.com:USERNAME/REPO.git
> git remote set-url upstream git@github.com:ORG/REPO.git

你的下一个 pull 可能会告诉你重新设置你的上游跟踪分支(如果你不熟悉它,错误消息会打印出它的语法)。

我怀疑强制推送事件是通过凭据归因于用户的,并且在从 HTTPS 克隆推送时识别用户存在一些问题;当推送不能归因于用户时,为了防止完全破坏体验,GH 方面可能有一些逻辑任意选择将事件归因于 org 用户。确保设置了作者(即使我的用户信息在提交日志中显示为作者非常好)之类的事情对我不起作用;他们不会解决这个问题是有道理的,因为推送可能包含来自不同作者的许多新提交。这个故事的寓意是始终使用 SSH。


旁注:警惕任何告诉您更新 git 配置以自动将 HTTPS 存储库 URL 替换为 SSH 存储库 URL 的解决方案。某些方法会非常混乱地破坏,例如私人存储库中的自制水龙头(截至 2021 年仍仅支持 HTTPS)。

【讨论】:

git config --system --unset credential.helper 这是解决我问题的神奇命令,谢谢。它清除了存储的凭据,我能够以其他用户身份登录。 @Papooch 很高兴听到这对某人有帮助:)【参考方案26】:

使用此命令,您可以轻松地以不同的用户名推送到 git。

git add .
git commit -m "initial commit"
git config --local credential.helper ""
git push https://github.com/youraccount/repo.git --all

【讨论】:

【参考方案27】:

我在使用多个 github 帐户时遇到了同样的问题,尽管推送请求通过正确的用户名,但在 github 上的用户被设置为 --global 配置中使用的主帐户。

所以,简单的解决方法就是使用本地配置:git config --local user.email second_account_account

这解决了我的问题。

【讨论】:

谢谢!大多数答案都忽略了这个本地配置。【参考方案28】:

这是您为 ssh url 调试和修复它的方式

首先,通过 ssh 检查哪个用户:

ssh -T git@github.com

&lt;your_current_github_username&gt;!您已成功通过身份验证,但 GitHub 不提供 shell 访问权限。

使用上述your_current_github_username登录GitHub 检查所有配置的 ssh 密钥:https://github.com/settings/keys

方法一:

your_current_github_username中删除ssh密钥

方法二:

确定与your_current_github_username关联的密钥

cat ~/.ssh/id_*.pub

假设 id_rsa 是您的目标 github 用户名的 SSH 密钥,在您的情况下,它可能是不同的文件名。

eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_rsa

方法三:

如果在您的机器上没有找到公钥(或者您丢失了它) 然后通过ssh-keygen创建一个新的ssh密钥并放在这里:~/.ssh/id_new_keyyyy

eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_new_keyyyy

【讨论】:

以上是关于git从终端推送错误的用户的主要内容,如果未能解决你的问题,请参考以下文章

GitHub 在可怕的权限错误中从哪里读取用户名/帐户?

git推送代码Gogs报401错误

Git 因致命错误而失败 - 无法读取用户名终端提示已禁用

尝试推送 git 并收到“无法读取 'https://github.com' 的用户名:终端提示已禁用”

Heroku 问题错误:未能推送一些参考

bitbucket 中提交的错误作者姓名