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 config
和git 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 config
credentials 是正确的,我的/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.nameseahorse
。
先生,我欠你的债【参考方案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/config
或GIT_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:<user>/<repo>.git
正确:git@<user>:<user>/<repo>.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
嗨
<your_current_github_username>
!您已成功通过身份验证,但 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从终端推送错误的用户的主要内容,如果未能解决你的问题,请参考以下文章