为什么Git允许在user.name和user.email中使用错误的值?

为什么Git允许在user.name和user.email中使用错误的值?,git,github,Git,Github,我最近开始从事一个使用GitHub进行源代码控制的项目。我已经习惯了SVN,并且对它很满意,我对Git还不熟悉,关于它的一些事情让我非常恼火。其中之一是我需要显式地配置user.name和user.email参数(或者不管正确的术语是什么,文档中似乎没有提到它,就像许多其他东西一样)。也许这是有道理的,因为我在本地提交时不需要提供凭据。但当我推送我的更改时,它实际上会要求我提供凭据,并且只接受设置的user.name值,而不检查它是否与我的登录名匹配。然后GitHub以其他人的名义显示我的更改,

我最近开始从事一个使用GitHub进行源代码控制的项目。我已经习惯了SVN,并且对它很满意,我对Git还不熟悉,关于它的一些事情让我非常恼火。其中之一是我需要显式地配置
user.name
user.email
参数(或者不管正确的术语是什么,文档中似乎没有提到它,就像许多其他东西一样)。也许这是有道理的,因为我在本地提交时不需要提供凭据。但当我推送我的更改时,它实际上会要求我提供凭据,并且只接受设置的
user.name
值,而不检查它是否与我的登录名匹配。然后GitHub以其他人的名义显示我的更改,这非常混乱

这背后是否有深刻的智慧,还是仅仅是草率的代码

TL;博士 考虑一下,如果您在GitHub上的用户名是
foo
,而您的工作电子邮件地址是
bar@example.com
。如果Git或GitHub强制在身份和电子邮件地址之间进行直接映射,您希望Git如何以可移植和可靠的方式处理这个问题

如果您的名字是
John Q.Public
,您在本地主机上的用户名是
John Public
,您的GitHub帐户是
jpublic
,那又如何?Git应该如何处理跨系统的这些差异

Git不能,所以Git不能。相反,Git将提交数据和身份验证视为单独的事情

不要将提交数据与凭据混淆 存储在Git commit对象中的数据和呈现给GitHub的数据根本不是一回事。您认为您的用户名或电子邮件地址是您在Git中的身份,但实际上它们与Git或GitHub中的身份验证或授权无关您向GitHub提供的凭据是您的GitHub用户名和密码,或者您的GitHub用户名和SSH密钥,与您的本地用户名或电子邮件地址的任何关系都是完全巧合的。

如果您曾经在安装了NFS的共享上使用Git,在项目生命周期中为不同的公司工作,一次为多个公司工作,或者需要将工作项目和非工作项目在逻辑上分开,那么您将了解Git的电子邮件归属机制既灵活又可移植

请记住,Git是一个内容跟踪器,而不是一个身份验证系统。与第三方(如GitHub)进行的大多数身份验证实际上都是在Git之外使用SSH或HTTPS协议进行的,这两种协议都不关心提交对象中的字段

用户名和电子邮件地址不是身份 其中之一是我需要显式地配置user.name和user.email参数(或者不管正确的术语是什么,文档中似乎没有提到它,就像其他很多东西一样)。也许这是有道理的,因为我在本地提交时不需要提供凭据。但当我推送我的更改时,它实际上会询问我的凭据,只接受设置的user.name值,而不检查它是否与我的登录名匹配。然后GitHub以其他人的名义显示我的更改,这非常混乱

你把许多不同的问题混为一谈。下面列出了一些比较明显的问题,但肯定还有其他问题

  • Git提交跟踪Git_AUTHOR_NAME和Git_COMMITTER_NAME作为提交对象的一部分。提交者和作者不一定相同,能够代表其他人将补丁应用到代码库被认为是一种设计特性
  • GIT_AUTHOR_电子邮件和GIT_COMMITTER_电子邮件可能因系统而异,甚至因项目而异,因为GIT支持每个项目的配置文件。此电子邮件信息附加到提交中,可由git格式补丁使用,但本质上与SSH或HTTP(S)身份验证无关
  • GitHub根据电子邮件地址将更改分配给用户。然而,这是GitHub面向用户的实现决策;Git本身不会将提交对象与身份验证混为一谈。在命令行中,您可以使用许多魔术
  • GitHub允许您添加到帐户以跟踪属于您的提交,并且还允许您在愿意的情况下使用
  • GitHub使用各种身份验证机制,但通常用户使用SSH或HTTPS推送或拉取。前者使用用户名和SSH密钥,后者使用用户名和密码。本地和远程系统上的用户名不必匹配
  • 其他身份验证机制(如SMTP)有自己的独立于Git的user.name或user.email的身份验证机制 一般来说,Git决定将身份验证与作者或提交人的详细信息分开,这对于可移植性来说是一个很好的选择。您可以在不同的系统或项目上使用不同的用户名或电子邮件地址,并且当您的身份信息保存在~/.gitconfig、$GIT_DIR/.GIT/config或适当的环境变量中时,您的身份信息是相对可移植的。

    这既不是深奥的智慧,也不是草率的代码。这只是一个国家的本质

    您的Git存储库是您的。你控制它,在各个方面。你决定放什么进去,不放什么出去。您还可以决定是否以及何时对提交和/或标记进行数字签名(请参见
    git-tag--sign
    和大量PGP文档)

    当然,你也可以控制转移点。具体地说,在不同的时候,有人会给你一些提交和/或标记集,以及与之相关的东西(树和blob),并要求你将它们放在你的存储库中。如果您正在从他们那里检索数据,则此操作为
    git fetch
    ;如果他们正在向您发送数据,则此操作为
    git push
    。那时,你可以决定是接受还是拒绝它们。Git通过“钩子”直接控制这个二进制操作

    你们都可以拒绝(告诉ot)